blob: 4a40e6a5889e9e54d9893f3a75121d09c3560065 [file] [log] [blame]
<!--
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.
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 1.5.8">
<meta name="author" content="Apache NiFi Team">
<title>Apache NiFi Expression Language Guide</title>
<style>
/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
/* Copyright (C) 2012-2015 Dan Allen, Ryan Waldron and the Asciidoctor Project
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. */
/* Remove the comments around the @import statement below when using this as a custom stylesheet */
@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400";
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
audio,canvas,video{display:inline-block}
audio:not([controls]){display:none;height:0}
[hidden],template{display:none}
script{display:none!important}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
body{margin:0}
a{background:transparent}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none!important}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
.antialiased,body{-webkit-font-smoothing:antialiased}
img{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:none}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9);padding-right: 1px;}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ul.no-bullet{list-style:none}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite:before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
table thead,table tfoot{background:#f7f8f7;font-weight:bold}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
.clearfix:after,.float-group:after{clear:both}
*:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
.keyseq{color:rgba(51,51,51,.8)}
kbd{display:inline-block;color:rgba(0,0,0,.8);font-size:.75em;line-height:1.4;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:-.15em .15em 0 .15em;padding:.2em .6em .2em .5em;vertical-align:middle;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menu{color:rgba(0,0,0,.8)}
b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
b.button:before{content:"[";padding:0 3px 0 2px}
b.button:after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
#header:after,#content:after,#footnotes:after,#footer:after{clear:both}
#content{margin-top:1.25em}
#content:before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span:before{content:"\00a0\2013\00a0"}
#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark:before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber:after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media only screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}@media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
.sect1{padding-bottom:.625em}
@media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}.sect1+.sect1{border-top:1px solid #efefed}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
@media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}@media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.listingblock>.content{position:relative}
.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
.listingblock:hover code[data-lang]:before{display:block}
.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0}
table.pyhltable td.code{padding-left:.75em;padding-right:0}
pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
pre.pygments .lineno{display:inline-block;margin-right:.25em}
table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
.quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
.quoteblock .quoteblock blockquote:before{display:none}
.verseblock{margin:0 1em 1.25em 1em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.05em;color:rgba(0,0,0,.6)}
.quoteblock.abstract{margin:0 0 1.25em 0;display:block}
.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
table.tableblock{max-width:100%;border-collapse:separate}
table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
table.spread{width:100%}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
table.frame-all{border-width:1px}
table.frame-sides{border-width:0 1px}
table.frame-topbot{border-width:1px 0}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
td>div.verse{white-space:pre}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
ul.inline>li>*{display:block}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1{padding-right:.75em;font-weight:bold}
td.hdlist1,td.hdlist2{vertical-align:top}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
.colist>table tr>td:last-of-type{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none}
span.footnote,span.footnoteref{vertical-align:super;font-size:.875em}
span.footnote a,span.footnoteref a{text-decoration:none}
span.footnote a:active,span.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
#footnotes .footnote{padding:0 .375em;line-height:1.3;font-size:.875em;margin-left:1.2em;text-indent:-1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background-color:#00fafa}
.black{color:#000}
.black-background{background-color:#000}
.blue{color:#0000bf}
.blue-background{background-color:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background-color:#fa00fa}
.gray{color:#606060}
.gray-background{background-color:#7d7d7d}
.green{color:#006000}
.green-background{background-color:#007d00}
.lime{color:#00bf00}
.lime-background{background-color:#00fa00}
.maroon{color:#600000}
.maroon-background{background-color:#7d0000}
.navy{color:#000060}
.navy-background{background-color:#00007d}
.olive{color:#606000}
.olive-background{background-color:#7d7d00}
.purple{color:#600060}
.purple-background{background-color:#7d007d}
.red{color:#bf0000}
.red-background{background-color:#fa0000}
.silver{color:#909090}
.silver-background{background-color:#bcbcbc}
.teal{color:#006060}
.teal-background{background-color:#007d7d}
.white{color:#bfbfbf}
.white-background{background-color:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background-color:#fafa00}
span.icon>.fa{cursor:default}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]:after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
h1,h2{letter-spacing:-.01em}
dt,th.tableblock,td.content{text-rendering:optimizeLegibility}
p,td.content{letter-spacing:-.01em}
p strong,td.content strong{letter-spacing:-.005em}
p,blockquote,dt,td.content{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@media print{@page{margin:1.25cm .75cm}
*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]:after{content:" (" attr(title) ")"}
pre,blockquote,tr,img{page-break-inside:avoid}
thead{display:table-header-group}
img{max-width:100%!important}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
.sect1{padding-bottom:0!important}
.sect1+.sect1{border:0!important}
#header>h1:first-child{margin-top:1.25rem}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span:before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]:before{display:block}
#footer{background:none!important;padding:0 .9375em}
#footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body class="article">
<div id="header">
<h1>Apache NiFi Expression Language Guide</h1>
<div class="details">
<span id="author" class="author">Apache NiFi Team</span><br>
<span id="email" class="email"><a href="mailto:dev@nifi.apache.org">dev@nifi.apache.org</a></span><br>
</div>
<div id="toc" class="toc">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="expression-language-guide.html#overview">Overview</a></li>
<li><a href="expression-language-guide.html#structure">Structure of a NiFi Expression</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#expression-language-hierarchy">Expression Language Hierarchy</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#usage">Expression Language in the Application</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#escaping">Escaping Expression Language</a></li>
<li><a href="expression-language-guide.html#editor">Expression Language Editor</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#functions">Functions</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#types">Data Types</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#boolean">Boolean Logic</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#isnull">isNull</a></li>
<li><a href="expression-language-guide.html#notnull">notNull</a></li>
<li><a href="expression-language-guide.html#isempty">isEmpty</a></li>
<li><a href="expression-language-guide.html#equals">equals</a></li>
<li><a href="expression-language-guide.html#equalsignorecase">equalsIgnoreCase</a></li>
<li><a href="expression-language-guide.html#gt">gt</a></li>
<li><a href="expression-language-guide.html#ge">ge</a></li>
<li><a href="expression-language-guide.html#lt">lt</a></li>
<li><a href="expression-language-guide.html#le">le</a></li>
<li><a href="expression-language-guide.html#and">and</a></li>
<li><a href="expression-language-guide.html#or">or</a></li>
<li><a href="expression-language-guide.html#not">not</a></li>
<li><a href="expression-language-guide.html#ifelse">ifElse</a></li>
<li><a href="expression-language-guide.html#isjson">isJson</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#strings">String Manipulation</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#toupper">toUpper</a></li>
<li><a href="expression-language-guide.html#tolower">toLower</a></li>
<li><a href="expression-language-guide.html#trim">trim</a></li>
<li><a href="expression-language-guide.html#substring">substring</a></li>
<li><a href="expression-language-guide.html#substringbefore">substringBefore</a></li>
<li><a href="expression-language-guide.html#substringbeforelast">substringBeforeLast</a></li>
<li><a href="expression-language-guide.html#substringafter">substringAfter</a></li>
<li><a href="expression-language-guide.html#substringafterlast">substringAfterLast</a></li>
<li><a href="expression-language-guide.html#getdelimitedfield">getDelimitedField</a></li>
<li><a href="expression-language-guide.html#append">append</a></li>
<li><a href="expression-language-guide.html#prepend">prepend</a></li>
<li><a href="expression-language-guide.html#replace">replace</a></li>
<li><a href="expression-language-guide.html#replacefirst">replaceFirst</a></li>
<li><a href="expression-language-guide.html#replaceall">replaceAll</a></li>
<li><a href="expression-language-guide.html#padleft">padLeft</a></li>
<li><a href="expression-language-guide.html#padright">padRight</a></li>
<li><a href="expression-language-guide.html#replacenull">replaceNull</a></li>
<li><a href="expression-language-guide.html#replaceempty">replaceEmpty</a></li>
<li><a href="expression-language-guide.html#length">length</a></li>
<li><a href="expression-language-guide.html#evaluateelstring">evaluateELString</a></li>
<li><a href="expression-language-guide.html#repeat">repeat</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#encode">Encode/Decode Functions</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#escapejson">escapeJson</a></li>
<li><a href="expression-language-guide.html#escapexml">escapeXml</a></li>
<li><a href="expression-language-guide.html#escapecsv">escapeCsv</a></li>
<li><a href="expression-language-guide.html#escapehtml3">escapeHtml3</a></li>
<li><a href="expression-language-guide.html#escapehtml4">escapeHtml4</a></li>
<li><a href="expression-language-guide.html#unescapejson">unescapeJson</a></li>
<li><a href="expression-language-guide.html#unescapexml">unescapeXml</a></li>
<li><a href="expression-language-guide.html#unescapecsv">unescapeCsv</a></li>
<li><a href="expression-language-guide.html#unescapehtml3">unescapeHtml3</a></li>
<li><a href="expression-language-guide.html#unescapehtml4">unescapeHtml4</a></li>
<li><a href="expression-language-guide.html#urlencode">urlEncode</a></li>
<li><a href="expression-language-guide.html#urldecode">urlDecode</a></li>
<li><a href="expression-language-guide.html#base64encode">base64Encode</a></li>
<li><a href="expression-language-guide.html#base64decode">base64Decode</a></li>
<li><a href="expression-language-guide.html#uuid3">UUID3</a></li>
<li><a href="expression-language-guide.html#uuid5">UUID5</a></li>
<li><a href="expression-language-guide.html#hash">hash</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#searching">Searching</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#startswith">startsWith</a></li>
<li><a href="expression-language-guide.html#endswith">endsWith</a></li>
<li><a href="expression-language-guide.html#contains">contains</a></li>
<li><a href="expression-language-guide.html#in">in</a></li>
<li><a href="expression-language-guide.html#find">find</a></li>
<li><a href="expression-language-guide.html#matches">matches</a></li>
<li><a href="expression-language-guide.html#indexof">indexOf</a></li>
<li><a href="expression-language-guide.html#lastindexof">lastIndexOf</a></li>
<li><a href="expression-language-guide.html#jsonpath">jsonPath</a></li>
<li><a href="expression-language-guide.html#jsonpathdelete">jsonPathDelete</a></li>
<li><a href="expression-language-guide.html#jsonpathadd">jsonPathAdd</a></li>
<li><a href="expression-language-guide.html#jsonpathset">jsonPathSet</a></li>
<li><a href="expression-language-guide.html#jsonpathput">jsonPathPut</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#numbers">Mathematical Operations and Numeric Manipulation</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#plus">plus</a></li>
<li><a href="expression-language-guide.html#minus">minus</a></li>
<li><a href="expression-language-guide.html#multiply">multiply</a></li>
<li><a href="expression-language-guide.html#divide">divide</a></li>
<li><a href="expression-language-guide.html#mod">mod</a></li>
<li><a href="expression-language-guide.html#toradix">toRadix</a></li>
<li><a href="expression-language-guide.html#fromradix">fromRadix</a></li>
<li><a href="expression-language-guide.html#random">random</a></li>
<li><a href="expression-language-guide.html#math">math</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#dates">Date Manipulation</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#format">format</a></li>
<li><a href="expression-language-guide.html#formatInstant">formatInstant</a></li>
<li><a href="expression-language-guide.html#todate">toDate</a></li>
<li><a href="expression-language-guide.html#toinstant">toInstant</a></li>
<li><a href="expression-language-guide.html#tomicros">toMicros</a></li>
<li><a href="expression-language-guide.html#tonanos">toNanos</a></li>
<li><a href="expression-language-guide.html#now">now</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#type_cast">Type Coercion</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#tostring">toString</a></li>
<li><a href="expression-language-guide.html#tonumber">toNumber</a></li>
<li><a href="expression-language-guide.html#todecimal">toDecimal</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#subjectless">Subjectless Functions</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#ip">ip</a></li>
<li><a href="expression-language-guide.html#hostname">hostname</a></li>
<li><a href="expression-language-guide.html#uuid">UUID</a></li>
<li><a href="expression-language-guide.html#nextint">nextInt</a></li>
<li><a href="expression-language-guide.html#literal">literal</a></li>
<li><a href="expression-language-guide.html#getstatevalue">getStateValue</a></li>
<li><a href="expression-language-guide.html#thread">thread</a></li>
</ul>
</li>
<li><a href="expression-language-guide.html#multi">Evaluating Multiple Attributes</a>
<ul class="sectlevel2">
<li><a href="expression-language-guide.html#anyattribute">anyAttribute</a></li>
<li><a href="expression-language-guide.html#allattributes">allAttributes</a></li>
<li><a href="expression-language-guide.html#anymatchingattribute">anyMatchingAttribute</a></li>
<li><a href="expression-language-guide.html#allmatchingattributes">allMatchingAttributes</a></li>
<li><a href="expression-language-guide.html#anydelineatedvalue">anyDelineatedValue</a></li>
<li><a href="expression-language-guide.html#alldelineatedvalues">allDelineatedValues</a></li>
<li><a href="expression-language-guide.html#join">join</a></li>
<li><a href="expression-language-guide.html#count">count</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="content">
<div class="sect1">
<h2 id="overview"><a class="anchor" href="expression-language-guide.html#overview"></a>Overview</h2>
<div class="sectionbody">
<div class="paragraph">
<p>All data in Apache NiFi is represented by an abstraction called a FlowFile.
A FlowFile is comprised of two major pieces: content and attributes.
The content portion of the FlowFile represents the data on which to operate.
For instance, if a file is picked up from a local file system using the
GetFile Processor, the contents of the file will become the contents of the
FlowFile.</p>
</div>
<div class="paragraph">
<p>The attributes portion of the FlowFile represents information about the data
itself, or metadata. Attributes are key-value pairs that represent what is
known about the data as well as information that is useful for routing and
processing the data appropriately.
Keeping with the example of a file that is picked up from
a local file system, the FlowFile would have an attribute called <code>filename</code> that
reflected the name of the file on the file system. Additionally, the FlowFile will
have a <code>path</code> attribute that reflects the directory on the file system that this
file lived in. The FlowFile will also have an attribute named <code>uuid</code>, which is a
unique identifier for this FlowFile. For complete listing of the core attributes
check out the FlowFile section of the <a href="developer-guide.html#flowfile">Developer&#8217;s Guide</a>.</p>
</div>
<div class="paragraph">
<p>However, placing these attributes on a FlowFile do not provide much benefit
if the user is unable to make use of them. The NiFi Expression Language provides
the ability to reference these attributes, compare them to other values,
and manipulate their values.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="structure"><a class="anchor" href="expression-language-guide.html#structure"></a>Structure of a NiFi Expression</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The NiFi Expression Language always begins with the start delimiter <code>${</code> and ends
with the end delimiter <code>}</code>. Between the start and end delimiters is the text of the
Expression itself. In its most basic form, the Expression can consist of just an
attribute name. For example, <code>${filename}</code> will return the value of the <code>filename</code>
attribute.</p>
</div>
<div class="paragraph">
<p>In a slightly more complex example, we can instead return a manipulation of this value.
We can, for example, return an all upper-case version of the filename by calling the
<code>toUpper</code> function: <code>${filename:toUpper()}</code>. In this case, we reference the <code>filename</code>
attribute and then manipulate this value by using the <code>toUpper</code> function. A function call
consists of 5 elements. First, there is a function call delimiter <code>:</code>. Second is the name
of the function - in this case, <code>toUpper</code>. Next is an open parenthesis (<code>(</code>), followed
by the function arguments. The arguments necessary are dependent upon which function
is being called. In this example, we are using the <code>toUpper</code> function, which does not
have any arguments, so this element is omitted. Finally, the closing parenthesis (<code>)</code>)
indicates the end of the function call. There are many different functions that are supported
by the Expression Language to achieve many different goals. Some functions provide String (text)
manipulation, such as the <code>toUpper</code> function. Others, such as the <code>equals</code> and <code>matches</code> functions,
provide comparison functionality. Functions also exist for manipulating dates and times and
for performing mathematical operations. Each of these functions is described below, in the
<a href="expression-language-guide.html#functions">Functions</a> section, with an explanation of what the function does, the arguments that it
requires, and the type of information that it returns.</p>
</div>
<div class="paragraph">
<p>When we perform a function call on an attribute, as above, we refer to the attribute as the
<em>subject</em> of the function, as the attribute is the entity on which the function is operating.
We can then chain together multiple function calls, where the return value of the first function
becomes the subject of the second function and its return value becomes the subject of the third
function and so on. Continuing with our example, we can chain together multiple functions by using
the expression <code>${filename:toUpper():equals('HELLO.TXT')}</code>. There is no limit to the number of
functions that can be chained together.</p>
</div>
<div class="paragraph">
<p>Any FlowFile attribute can be referenced using the Expression Language. However, if the attribute
name contains a "special character", the attribute name must be escaped by quoting it. The following
characters are each considered "special characters":</p>
</div>
<div class="ulist">
<ul>
<li>
<p>$ (dollar sign)</p>
</li>
<li>
<p>| (pipe)</p>
</li>
<li>
<p>{ (open brace)</p>
</li>
<li>
<p>} (close brace)</p>
</li>
<li>
<p>( (open parenthesis)</p>
</li>
<li>
<p>) (close parenthesis)</p>
</li>
<li>
<p>[ (open bracket)</p>
</li>
<li>
<p>] (close bracket)</p>
</li>
<li>
<p>, (comma)</p>
</li>
<li>
<p>: (colon)</p>
</li>
<li>
<p>; (semicolon)</p>
</li>
<li>
<p>/ (forward slash)</p>
</li>
<li>
<p>* (asterisk)</p>
</li>
<li>
<p>' (single quote)</p>
</li>
<li>
<p>(space)</p>
</li>
<li>
<p>\t (tab)</p>
</li>
<li>
<p>\r (carriage return)</p>
</li>
<li>
<p>\n (new-line)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Additionally, a number is considered a "special character" if it is the first character of the attribute name.
If any of these special characters is present in an attribute is quoted by using either single or double quotes.
The Expression Language allows single quotes and double quotes to be used interchangeably. For example, the following
can be used to escape an attribute named <code>my attribute</code>: <code>${"my attribute"}</code> or <code>${'my attribute'}</code>.</p>
</div>
<div class="paragraph">
<p>In this example, the value to be returned is the value of the "my attribute" attribute, if it exists. The Expression
Language will search through a hierarchy for a matching property. See <a href="expression-language-guide.html#expression-language-hierarchy">Expression Language Hierarchy</a>
for a description of the hierarchy.</p>
</div>
<div class="paragraph">
<p>There also exist some functions that expect to have no subject. These functions are invoked simply
by calling the function at the beginning of the Expression, such as <code>${hostname()}</code>. These functions
can then be changed together, as well. For example, <code>${hostname():toUpper()}</code>. Attempting to
evaluate the function with subject will result in an error. In the <a href="expression-language-guide.html#functions">Functions</a>
section below, these functions will clearly indicate in their descriptions that they do not
require a subject.</p>
</div>
<div class="paragraph">
<p>Often times, we will need to compare the values of two different attributes to each other.
We are able to accomplish this by using embedded Expressions. We can, for example, check if
the <code>filename</code> attribute is the same as the <code>uuid</code> attribute: <code>${filename:equals( ${uuid} )}</code>.
Notice here, also, that we have a space between the opening parenthesis for the <code>equals</code> method and
the embedded Expression. This is not necessary and does not affect how the Expression is evaluated
in any way. Rather, it is intended to make the Expression easier to read. White space is ignored by
the Expression Language between delimiters. Therefore, we can use the Expression
<code>${ filename : equals(${ uuid}) }</code> or <code>${filename:equals(${uuid})}</code> and both Expressions
mean the same thing. We cannot, however, use <code>${file name:equals(${uuid})}</code>, because this results
in <code>file</code> and <code>name</code> being interpreted as different tokens, rather than a single token, <code>filename</code>.</p>
</div>
<div class="sect2">
<h3 id="expression-language-hierarchy"><a class="anchor" href="expression-language-guide.html#expression-language-hierarchy"></a>Expression Language Hierarchy</h3>
<div class="paragraph">
<p>When using Expression Language to reference a property by name there is a defined hierarchy within which NiFi
will search for the value.</p>
</div>
<div class="paragraph">
<p>The current hierarchy in NiFi is as follows:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Search FlowFile for attribute/key</p>
</li>
<li>
<p>Search Process Group Variables for attribute/key</p>
</li>
<li>
<p>Search File Registry file for attribute/key</p>
</li>
<li>
<p>Search NiFi JVM Properties for attribute/key</p>
</li>
<li>
<p>Search System Environment Variables for attribute/key</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>NiFi will search for, and return, the first occurrence of a matching property. If no matching property is found, <code>null</code> is returned.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="usage"><a class="anchor" href="expression-language-guide.html#usage"></a>Expression Language in the Application</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The Expression Language is used heavily throughout the NiFi application for configuring Processor
properties. Not all Processor properties support the Expression Language, however. Whether or not
a Property supports the Expression Language is determined by the developer of the Processor when
the Processor is written. However, the application strives to clearly illustrate for each Property
whether or not the Expression Language is supported.</p>
</div>
<div class="paragraph">
<p>In the application, when configuring a component property, the User Interface provides an Information
icon (
<span class="image"><img src="images/iconInfo.png" alt="Info"></span>
) next to the name of the Property. Hovering over this icon with the mouse will provide a tooltip that
provides helpful information about the Property. This information includes a description of the Property,
the default value (if any), historically configured values (if any), and the evaluation scope of this
property for expression language. There are three values and the evaluation scope of the expression
language is hierarchical: NONE &#8594; VARIABLE_REGISTRY &#8594; FLOWFILE_ATTRIBUTES.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>NONE - expression language is not supported for this property</p>
</li>
<li>
<p>VARIABLE_REGISTRY is hierarchically constructed as below:</p>
<div class="ulist">
<ul>
<li>
<p>Variables defined at process group level and then, recursively, up to the higher process group until
the root process group.</p>
</li>
<li>
<p>Variables defined in custom properties files through the nifi.variable.registry.properties property
in nifi.properties file.</p>
</li>
<li>
<p>Environment variables defined at JVM level and system properties.</p>
</li>
</ul>
</div>
</li>
<li>
<p>FLOWFILE_ATTRIBUTES - will use attributes of each individual flow file, as well as those variables defined
by the Variable Registry, as described above.</p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="escaping"><a class="anchor" href="expression-language-guide.html#escaping"></a>Escaping Expression Language</h3>
<div class="paragraph">
<p>There may be times when a property supports Expression Language, but the user wishes to use a literal value
that follows the same syntax as the Expression Language. For example, a user may want to configure a property
value to be the literal text <code>Hello ${UserName}</code>. In such a case, this can be accomplished by using an extra
<code>$</code> (dollar sign symbol) just before the expression to escape it (i.e., <code>Hello $${UserName}</code>). Unless the <code>$</code>
character is being used to escape an Expression, it should not be escaped. For example, the value <code>Hello $$User$$Name</code>
should not escape the <code>$</code> characters, so the literal value that will be used is <code>Hello $$User$$Name</code>.</p>
</div>
<div class="paragraph">
<p>If more than two <code>$</code> characters are encountered sequentially before a <code>{</code>, then each pair of <code>$</code> characters will
be considered an escaping of the <code>$</code> character. The escaping will be performed from left-to-right.
To help illustrate this, consider that the variable <code>abc</code> contains the value <code>xyz</code>. Then, consider the following
table of Expressions and their corresponding evaluated values:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 1. Escaping EL Examples</caption>
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Notes</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${abc}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>xyz</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>$${abc}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${abc}</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>$$${abc}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>$xyz</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>$$$${abc}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>$${abc}</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>$$$$${abc}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>$$xyz</code></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>I owe you $5</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>I owe you $5</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">No actual Expression is present here.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>You owe me $$5 too</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>You owe me $$5 too</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The $ character is not escaped because it does not immediately precede an Expression.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Unescaped $$${5 because no closing brace</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Unescaped $$${5 because no closing brace</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Because there is no closing brace here, there is no actual Expression and hence the $ characters are not
escaped.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Unescaped $$${5} because no closing brace</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">&lt;Error&gt;</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">This expression is not valid because it equates to an escaped $, followed by <code>${5}</code> and the <code>${5}</code> is not a valid Expression. The number
must be escaped.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Unescaped $$${'5'} because no closing brace</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Unescaped $ because no closing brace</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">There is no attribute named <code>5</code> so the Expression evaluates to an empty string. The <code>$$</code> evaluates to a
single (escaped) <code>$</code> because it immediately precedes an Expression.</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="editor"><a class="anchor" href="expression-language-guide.html#editor"></a>Expression Language Editor</h3>
<div class="paragraph">
<p>When configuring the value of a Processor property, the NiFi User Interface provides help with the
Expression Language using the Expression Language editor. Once an Expression is begin by typing <code>${</code>,
the editor begins to highlight parentheses and braces so that the user is easily able to tell which
opening parenthesis or brace matches which closing parenthesis or brace.</p>
</div>
<div class="paragraph">
<p>The editor also supplies context-sensitive help by providing a list of all functions that can be used
at the current cursor position. To activate this feature, press Ctrl+Space on the keyboard. The user
is also able to type part of a function name and then press Ctrl+Space to see all functions that can
be used that start with the same prefix. For example, if we type into the editor <code>${filename:to</code>
and then press Ctrl+Space, we are provided a pop-up that lists six different functions: <code>toDate</code>,
<code>toLower</code>, <code>toNumber</code>, <code>toRadix</code>, <code>toString</code>, and <code>toUpper</code>. We can then continue typing to narrow
which functions are shown, or we can select one of the functions from the list by double-clicking
it with the mouse or using the arrow keys to highlight the desired function and pressing Enter.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="functions"><a class="anchor" href="expression-language-guide.html#functions"></a>Functions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Functions provide a convenient way to manipulate and compare values of attributes. The Expression Language
provides many different functions to meet the needs of a automated dataflow. Each function takes
zero or more arguments and returns a single value. These functions can then be chained together to create
powerful Expressions to evaluate conditions and manipulate values. See <a href="expression-language-guide.html#structure">Structure of a NiFi Expression</a> for more information
on how to call and chain functions together.</p>
</div>
<div class="sect2">
<h3 id="types"><a class="anchor" href="expression-language-guide.html#types"></a>Data Types</h3>
<div class="paragraph">
<p>Each argument to a function and each value returned from a function has a specific data type. The Expression
Language supports four different data types:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>String</strong>: A String is a sequence of characters that can consist of numbers, letters, white space, and
special characters.</p>
</li>
<li>
<p><strong>Number</strong>: A Number is an whole number comprised of one or more digits (<code>0</code> through <code>9</code>). When converting to numbers from Date data types, they are represented as
the number of milliseconds since midnight GMT on January 1, 1970.</p>
</li>
<li>
<p><strong>Decimal</strong>: A Decimal is a numeric value that can support decimals and larger values with minimal loss of precision. More precisely it
is a double-precision 64-bit IEEE 754 floating point. Due to this minimal loss of precision this data type should not be used for
very precise values, such as currency. For more documentation on the range of values stored in this data type
refer to this <a href="https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3" target="_blank" rel="noopener">link</a>. The following are some examples of the forms of
literal decimals that are supported in expression language (the "E" can also be lower-case):</p>
<div class="ulist">
<ul>
<li>
<p>1.1</p>
</li>
<li>
<p>.1E1</p>
</li>
<li>
<p>1.11E-12</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Date</strong>: A Date is an object that holds a Date and Time. Utilizing the <a href="expression-language-guide.html#dates">Date Manipulation</a> and <a href="expression-language-guide.html#type_cast">Type Coercion</a> functions this data
type can be converted to/from Strings and numbers. If the whole Expression Language expression is evaluated to be a
date then it will be converted to a String with the format: "&lt;Day of Week&gt; &lt;Month&gt; &lt;Day of Month&gt; &lt;Hour&gt;:&lt;Minute&gt;:&lt;Second&gt; &lt;Time Zone&gt; &lt;Year&gt;".
Also expressed as "E MMM dd HH:mm:ss z yyyy" in Java SimpleDateFormat format. For example: "Wed Dec 31 12:00:04 UTC 2016".</p>
</li>
<li>
<p><strong>Boolean</strong>: A Boolean is one of either <code>true</code> or <code>false</code>.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>After evaluating expression language functions, all attributes are stored as type String.</p>
</div>
<div class="paragraph">
<p>The Expression Language is generally able to automatically coerce a value of one data type to the appropriate
data type for a function. However, functions do exist to manually coerce a value into a specific data type.
See the <a href="expression-language-guide.html#type_cast">Type Coercion</a> section for more information.</p>
</div>
<div class="paragraph">
<p>Hex values are supported for Number and Decimal types but they must be quoted and prepended with "0x" when being
interpreted as literals. For example these two expressions are valid (without the quotes or "0x" the expression would fail to run properly):</p>
</div>
<div class="ulist">
<ul>
<li>
<p>${literal("0xF"):toNumber()}</p>
</li>
<li>
<p>${literal("0xF.Fp10"):toDecimal()}</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="boolean"><a class="anchor" href="expression-language-guide.html#boolean"></a>Boolean Logic</h2>
<div class="sectionbody">
<div class="paragraph">
<p>One of the most powerful features of the Expression Language is the ability to compare an attribute value against
some other value. This is used often, for example, to configure how a Processor should route data. The following
functions are used for performing boolean logic, such as comparing two values.
Each of these functions are designed to work on values of type Boolean.</p>
</div>
<div class="sect2 function">
<h3 id="isnull"><a class="anchor" href="expression-language-guide.html#isnull"></a>isNull</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>isNull</code> function returns <code>true</code> if the subject is null, <code>false</code> otherwise. This is typically used to determine
if an attribute exists.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Any</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${filename:isNull()}</code> returns <code>true</code> if the "filename" attribute does not exist.
It returns <code>false</code> if the attribute exists.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="notnull"><a class="anchor" href="expression-language-guide.html#notnull"></a>notNull</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>notNull</code> function returns the opposite value of the <code>isNull</code> function. That is, it will return <code>true</code> if the
subject exists and <code>false</code> otherwise.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Any</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${filename:notNull()}</code> returns <code>true</code> if the "filename" attribute exists. It returns <code>false</code> if the attribute
does not exist.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="isempty"><a class="anchor" href="expression-language-guide.html#isempty"></a>isEmpty</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>isEmpty</code> function returns <code>true</code> if the Subject is null, does not contain any characters
or contains only white-space (new line, carriage return, space, tab), <code>false</code> otherwise.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${filename:isEmpty()}</code> returns <code>true</code> if the "filename" attribute does not exist or contains only
white space. <code>${literal(" "):isEmpty()}</code> returns true as well as <code>${literal(""):isEmpty()}</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="equals"><a class="anchor" href="expression-language-guide.html#equals"></a>equals</h3>
<div class="paragraph description">
<p><strong>Description</strong>: <span class="description">The <code>equals</code> function is very widely used and determines if its subject is equal to another String value.
Note that the <code>equals</code> function performs a direct comparison of two String values. Take care not to confuse this
function with the <a href="expression-language-guide.html#matches">matches</a> function, which evaluates its subject against a Regular Expression.</span></p>
</div>
<div class="paragraph subject">
<p><strong>Subject Type</strong>: <span class="subject">Any</span></p>
</div>
<div class="paragraph arguments">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The value to compare the Subject to. Must be same type as the Subject.</span></p>
</li>
</ul>
</div>
<div class="paragraph returnType">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph examples">
<p><strong>Examples</strong>:
We can check if the filename of a FlowFile is "hello.txt" by using the expression <code>${filename:equals('hello.txt')}</code>,
or we could check if the value of the attribute <code>hello</code> is equal to the value of the <code>filename</code> attribute:
<code>${hello:equals( ${filename} )}</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="equalsignorecase"><a class="anchor" href="expression-language-guide.html#equalsignorecase"></a>equalsIgnoreCase</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Similar to the <code>equals</code> function, the <code>equalsIgnoreCase</code> function compares its subject against a String value but returns
<code>true</code> if the two values differ only by case (upper case vs. lower case).</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The value to compare the Subject to.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${filename:equalsIgnoreCase('hello.txt')}</code> will evaluate to <code>true</code> if filename is equal to "hello.txt"
or "HELLO.TXT" or "HeLLo.TxT".</p>
</div>
</div>
<div class="sect2 function">
<h3 id="gt"><a class="anchor" href="expression-language-guide.html#gt"></a>gt</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>gt</code> function is used for numeric comparison and returns <code>true</code> if the subject is Greater Than
its argument. If either the subject or the argument cannot be coerced into a Number,
this function returns <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The number to compare the Subject to.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${fileSize:gt( 1024 )}</code> will return <code>true</code> if the size of the FlowFile&#8217;s content is more than 1 kilobyte
(1024 bytes). Otherwise, it will return <code>false</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="ge"><a class="anchor" href="expression-language-guide.html#ge"></a>ge</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>ge</code> function is used for numeric comparison and returns <code>true</code> if the subject is Greater Than
Or Equal To its argument. If either the subject or the argument cannot be coerced into a Number,
this function returns <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The number to compare the Subject to.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${fileSize:ge( 1024 )}</code> will return <code>true</code> if the size of the FlowFile&#8217;s content is at least (
is greater than or equal to) 1 kilobyte (1024 bytes). Otherwise, it will return <code>false</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="lt"><a class="anchor" href="expression-language-guide.html#lt"></a>lt</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>lt</code> function is used for numeric comparison and returns <code>true</code> if the subject is Less Than
its argument. If either the subject or the argument cannot be coerced into a Number,
this function returns <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The number to compare the Subject to.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${fileSize:lt( 1048576 )}</code> will return <code>true</code> if the size of the FlowFile&#8217;s content is less than
1 megabyte (1048576 bytes). Otherwise, it will return <code>false</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="le"><a class="anchor" href="expression-language-guide.html#le"></a>le</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>le</code> function is used for numeric comparison and returns <code>true</code> if the subject is Less Than
Or Equal To its argument. If either the subject or the argument cannot be coerced into a Number,
this function returns <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The number to compare the Subject to.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${fileSize:le( 1048576 )}</code> will return <code>true</code> if the size of the FlowFile&#8217;s content is at most
(less than or equal to) 1 megabyte (1048576 bytes). Otherwise, it will return <code>false</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="and"><a class="anchor" href="expression-language-guide.html#and"></a>and</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>and</code> function takes as a single argument a Boolean value and returns <code>true</code> if both the Subject
and the argument are <code>true</code>. If either the subject or the argument is <code>false</code> or cannot be coerced into a Boolean,
the function returns <code>false</code>. Typically, this is used with an embedded Expression as the argument.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>condition</em></span> : <span class="argDesc">The right-hand-side of the 'and' Expression</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: We can check if the filename is both all lower-case and has at least 5 characters by using the Expression</p>
</div>
<div class="listingblock">
<div class="content">
<pre>${filename:toLower():equals( ${filename} ):and(
${filename:length():ge(5)}
)}</pre>
</div>
</div>
</div>
<div class="sect2 function">
<h3 id="or"><a class="anchor" href="expression-language-guide.html#or"></a>or</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>or</code> function takes as a single argument a Boolean value and returns <code>true</code> if either the Subject
or the argument is <code>true</code>. If both the subject and the argument are <code>false</code>, the function returns <code>false</code>. If
either the Subject or the argument cannot be coerced into a Boolean value, this function will return <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>condition</em></span> : <span class="argDesc">The right-hand-side of the 'and' Expression</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: The following example will return <code>true</code> if either the filename has exactly 5 characters or if
the filename is all lower-case.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>${filename:toLower():equals( ${filename} ):or(
${filename:length():equals(5)}
)}</pre>
</div>
</div>
</div>
<div class="sect2 function">
<h3 id="not"><a class="anchor" href="expression-language-guide.html#not"></a>not</h3>
<div class="paragraph description">
<p><strong>Description</strong>: <span class="description">The <code>not</code> function returns the negation of the Boolean value of the subject.</span></p>
</div>
<div class="paragraph subject">
<p><strong>Subject Type</strong>: <span class="subject">Boolean</span></p>
</div>
<div class="paragraph arguments">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph returnType">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph examples">
<p><strong>Examples</strong>: We can invert the value of another function by using the <code>not</code> function, as
<code>${filename:equals('hello.txt'):not()}</code>. This will return <code>true</code> if the filename is NOT equal to
"hello.txt" and will return <code>false</code> if the filename is "hello.txt."</p>
</div>
</div>
<div class="sect2 function">
<h3 id="ifelse"><a class="anchor" href="expression-language-guide.html#ifelse"></a>ifElse</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Evaluates the first argument if the Subject evaluates to <code>true</code>, or the second argument
if the Subject evaluates to <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>EvaluateIfTrue</em></span> : <span class="argDesc">The value to return if the Subject is true</span></p>
</li>
<li>
<p><span class="argName"><em>EvaluateIfFalse</em></span> : <span class="argDesc">The value to return if the Subject is false</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt", the "nullFilename" attribute has
the value null, and the "bool" attribute has the value "true", then the following expressions will provide
the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 2. ifElse Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${bool:ifElse('a','b')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${literal(true):ifElse('a','b')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${nullFilename:isNull():ifElse('file does not exist', 'located file')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>file does not exist</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${nullFilename:ifElse('found', 'not_found')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not_found</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:ifElse('found', 'not_found')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not_found</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:isNull():not():ifElse('found', 'not_found')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>found</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="isjson"><a class="anchor" href="expression-language-guide.html#isjson"></a>isJson</h3>
<div class="paragraph">
<p><strong>Description</strong>: [.description]#The <code>isJson</code> function returns <code>true</code> if the subject is a JSON array or a JSON object, <code>false</code> otherwise. This is typically used to determine whether an attribute is JSON in order to allow for a follow-on JSONPath query. Although technically there are other valid JSON types such as string, number, boolean and null, this method is only concerned with the primary JSON objects queried with JSONPath , arrays and objects. #</p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Any</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the attribute "jsonObj" has the value {"name":"John", "age":30, "car":null}, the attribute jsonObjMissingStartingBrace has the value "name":"John", "age":30, "car":null}, the attribute jsonObjMissingEndingBrace has the value {"name":"John", "age":30, "car":null, the attribute "jsonArray" has the value ["Ford", "BMW", "Fiat"], the attribute jsonArrayMissingStartingBracket has the value "Ford", "BMW", "Fiat"], the attribute jsonArrayMissingEndingBracket has the value ["Ford", "BMW", "Fiat", the "someAttribute" attribute does not exist, the "emptyQuotedString" attribute value is "", the attribute "quotedString" has the value "someString", the attribute "integer" has the value 1234, the attribute "decimal" has the value 18.36, the attribute "trueAttr" has the value true, the attribute "falseAttr" has the value false and the "nullAttr" attribute has the value null, then the following expressions will provide the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 3. isJson Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${jsonObj:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${jsonObjMissingStartingBrace:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${jsonObjMissingEndingBrace:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${jsonArray:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${jsonArrayMissingStartingBracket:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${jsonArrayMissingEndingBracket:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${someAttribute:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${emptyQuotedString:isJson())</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${quotedString:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${integer:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${decimal:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${trueAttr:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${falseAttr:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${nullAttr:isJson()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="strings"><a class="anchor" href="expression-language-guide.html#strings"></a>String Manipulation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Each of the following functions manipulates a String in some way.</p>
</div>
<div class="sect2 function">
<h3 id="toupper"><a class="anchor" href="expression-language-guide.html#toupper"></a>toUpper</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function converts the Subject into an all upper-case String. Said another way, it
replaces any lowercase letter with the uppercase equivalent.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute is "abc123.txt", then the Expression <code>${filename:toUpper()}</code>
will return "ABC123.TXT"</p>
</div>
</div>
<div class="sect2 function">
<h3 id="tolower"><a class="anchor" href="expression-language-guide.html#tolower"></a>toLower</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function converts the Subject into an all lower-case String. Said another way,
it replaces any uppercase letter with the lowercase equivalent.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute is "ABC123.TXT", then the Expression <code>${filename:toLower()}</code>
will return "abc123.txt"</p>
</div>
</div>
<div class="sect2 function">
<h3 id="trim"><a class="anchor" href="expression-language-guide.html#trim"></a>trim</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>trim</code> function will remove any leading or trailing white space from its subject.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the attribute <code>attr</code> has the value " 1 2 3 ", then the Expression <code>${attr:trim()}</code> will
return the value "1 2 3".</p>
</div>
</div>
<div class="sect2 function">
<h3 id="substring"><a class="anchor" href="expression-language-guide.html#substring"></a>substring</h3>
<div class="paragraph">
<p><strong>Description</strong>:
<span class="description">Returns a portion of the Subject, given a <em>starting index</em> and an optional <em>ending index</em>.
If the <em>ending index</em> is not supplied, it will return the portion of the Subject starting at the given
'start index' and ending at the end of the Subject value.</span></p>
</div>
<div class="paragraph">
<p><span class="description">The <em>starting index</em> and <em>ending index</em> are zero-based. That is, the first character is referenced by using
the value <code>0</code>, not <code>1</code>.</span></p>
</div>
<div class="paragraph">
<p><span class="description">If either the <em>starting index</em> is or the <em>ending index</em> is not a number, this function call will result
in an error.</span></p>
</div>
<div class="paragraph">
<p><span class="description">If the <em>starting index</em> is larger than the <em>ending index</em>, this function call will result in an error.</span></p>
</div>
<div class="paragraph">
<p><span class="description">If the <em>starting index</em> or the <em>ending index</em> is greater than the length of the Subject or has a value
less than 0, this function call will return an empty string.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>starting index</em></span> : <span class="argDesc">The 0-based index of the first character to capture (inclusive)</span></p>
</li>
<li>
<p><span class="argName"><em>ending index</em></span> : <span class="argDesc">The 0-based index of the last character to capture (exclusive)</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>:</p>
</div>
<div class="paragraph">
<p>If we have an attribute named "filename" with the value "a brand new filename.txt",
then the following Expressions will result in the following values:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 4. Substring Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substring(0,1)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substring(2)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>brand new filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substring(12)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substring( ${filename:length():minus(2)} )}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>xt</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="substringbefore"><a class="anchor" href="expression-language-guide.html#substringbefore"></a>substringBefore</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a portion of the Subject, starting with the first character of the Subject
and ending with the character immediately before the first occurrence of the argument. If
the argument is not present in the Subject, the entire Subject will be returned.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The String to search for in the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt",
then the following Expressions will result in the following values:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 5. SubstringBefore Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringBefore('.')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringBefore(' ')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringBefore(' n')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringBefore('missing')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename.txt</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="substringbeforelast"><a class="anchor" href="expression-language-guide.html#substringbeforelast"></a>substringBeforeLast</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a portion of the Subject, starting with the first character of the Subject
and ending with the character immediately before the last occurrence of the argument. If
the argument is not present in the Subject, the entire Subject will be returned.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The String to search for in the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt",
then the following Expressions will result in the following values:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 6. SubstringBeforeLast Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringBeforeLast('.')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringBeforeLast(' ')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringBeforeLast(' n')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringBeforeLast('missing')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename.txt</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="substringafter"><a class="anchor" href="expression-language-guide.html#substringafter"></a>substringAfter</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a portion of the Subject, starting with the character immediately after
the first occurrence of the argument and extending to the end of the Subject. If
the argument is not present in the Subject, the entire Subject will be returned.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The String to search for in the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt",
then the following Expressions will result in the following values:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 7. SubstringAfter Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringAfter('.')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringAfter(' ')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>brand new filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringAfter(' n')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ew filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringAfter('missing')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename.txt</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="substringafterlast"><a class="anchor" href="expression-language-guide.html#substringafterlast"></a>substringAfterLast</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a portion of the Subject, starting with the character immediately after
the last occurrence of the argument and extending to the end of the Subject. If
the argument is not present in the Subject, the entire Subject will be returned.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The String to search for in the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt",
then the following Expressions will result in the following values:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 8. SubstringAfterLast Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringAfterLast('.')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringAfterLast(' ')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringAfterLast(' n')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ew filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:substringAfterLast('missing')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename.txt</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="getdelimitedfield"><a class="anchor" href="expression-language-guide.html#getdelimitedfield"></a>getDelimitedField</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Parses the Subject as a delimited line of text and returns just a single field
from that delimited text.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>index</em></span> : <span class="argDesc">The index of the field to return. A value of 1 will return the first field,
a value of 2 will return the second field, and so on.</span></p>
</li>
<li>
<p><span class="argName"><em>delimiter</em></span> : <span class="argDesc">Optional argument that provides the character to use as a field separator.
If not specified, a comma will be used. This value must be exactly 1 character.</span></p>
</li>
<li>
<p><span class="argName"><em>quoteChar</em></span> : <span class="argDesc">Optional argument that provides the character that can be used to quote values
so that the delimiter can be used within a single field. If not specified, a double-quote (") will be used. This value
must be exactly 1 character.</span></p>
</li>
<li>
<p><span class="argName"><em>escapeChar</em></span> : <span class="argDesc">Optional argument that provides the character that can be used to escape the Quote Character
or the Delimiter within a field. If not specified, a backslash (\) is used. This value must be exactly 1 character.</span></p>
</li>
<li>
<p><span class="argName"><em>stripChars</em></span> : <span class="argDesc">Optional argument that specifies whether or not quote characters and escape characters should
be stripped. For example, if we have a field value "1, 2, 3" and this value is true, we will get the value <code>1, 2, 3</code>, but if this
value is false, we will get the value <code>"1, 2, 3"</code> with the quotes. The default value is false. This value must be either <code>true</code>
or <code>false</code>.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "line" attribute contains the value <em>"Jacobson, John", 32, Mr.</em>
and the "altLine" attribute contains the value <em>Jacobson, John|32|Mr.</em>
then the following Expressions will result in the following values:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 9. GetDelimitedField Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${line:getDelimitedField(2)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">_(space)_32</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${line:getDelimitedField(2):trim()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">32</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${line:getDelimitedField(1)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">"Jacobson, John"</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${line:getDelimitedField(1, ',', '"', '\\', true)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Jacobson, John</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${altLine:getDelimitedField(1, '|')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Jacobson, John</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="append"><a class="anchor" href="expression-language-guide.html#append"></a>append</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>append</code> function returns the result of appending the argument to the value of
the Subject. If the Subject is null, returns the argument itself.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The String to append to the end of the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt", then the Expression
<code>${filename:append('.gz')}</code> will return "a brand new filename.txt.gz".</p>
</div>
</div>
<div class="sect2 function">
<h3 id="prepend"><a class="anchor" href="expression-language-guide.html#prepend"></a>prepend</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>prepend</code> function returns the result of prepending the argument to the value of
the Subject. If the subject is null, returns the argument itself.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The String to prepend to the beginning of the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "filename.txt", then the Expression
<code>${filename:prepend('a brand new ')}</code> will return "a brand new filename.txt".</p>
</div>
</div>
<div class="sect2 function">
<h3 id="replace"><a class="anchor" href="expression-language-guide.html#replace"></a>replace</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Replaces <strong>all</strong> occurrences of one literal String within the Subject with another String.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Search String</em></span> : <span class="argDesc">The String to find within the Subject</span></p>
</li>
<li>
<p><span class="argName"><em>Replacement</em></span> : <span class="argDesc">The value to replace <em>Search String</em> with</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt", then the following
Expressions will provide the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 10. Replace Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replace('.', '_')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename_txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replace(' ', '.')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.brand.new.filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replace('XYZ', 'ZZZ')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replace('filename', 'book')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new book.txt</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="replacefirst"><a class="anchor" href="expression-language-guide.html#replacefirst"></a>replaceFirst</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Replaces <strong>the first</strong> occurrence of one literal String or regular expression within the Subject with another String.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Search String</em></span> : <span class="argDesc">The String (literal or regular expression pattern) to find within the Subject</span></p>
</li>
<li>
<p><span class="argName"><em>Replacement</em></span> : <span class="argDesc">The value to replace <em>Search String</em> with</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt", then the following
Expressions will provide the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 11. ReplaceFirst Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replaceFirst('a', 'the')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>the brand new filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replaceFirst('[br]', 'g')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a grand new filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replaceFirst('XYZ', 'ZZZ')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replaceFirst('\w{8}', 'book')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new book.txt</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="replaceall"><a class="anchor" href="expression-language-guide.html#replaceall"></a>replaceAll</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>replaceAll</code> function takes two String arguments: a literal String or Regular Expression (NiFi uses the Java Pattern
syntax), and a replacement string. The return value is the result of substituting the replacement string for
all patterns within the Subject that match the Regular Expression.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Regex</em></span> : <span class="argDesc">The Regular Expression (in Java syntax) to match in the Subject</span></p>
</li>
<li>
<p><span class="argName"><em>Replacement</em></span> : <span class="argDesc">The value to use for replacing matches in the Subject. If the <em>regular expression</em>
argument uses Capturing Groups, back references are allowed in the <em>replacement</em>.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt", then the following
Expressions will provide the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 12. ReplaceAll Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replaceAll('\..*', '')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replaceAll('a brand (new)', '$1')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>new filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replaceAll('XYZ', 'ZZZ')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a brand new filename.txt</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:replaceAll('brand (new)', 'somewhat $1')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a somewhat new filename.txt</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="padleft"><a class="anchor" href="expression-language-guide.html#padleft"></a>padLeft</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>padLeft</code> function prepends the given padding string (or <code>'_'</code>, if nothing is provided) to the argument <code>String</code> until the passed desired length is reached.</span></p>
</div>
<div class="paragraph">
<p>It returns the argument as is if its length is already equal or higher than the desired length, if the padding string is <code>null</code>, and if the desired length is either negative or greater than <code>Integer.MAX_VALUE</code>.
It returns <code>null</code> if the argument string is not a valid attribute.</p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>DesiredLength</em></span> : <span class="argDesc">The integer value to pad to.</span></p>
</li>
<li>
<p><span class="argName"><em>PaddingString</em></span> : <span class="argDesc">The optional string to pad with. <code>"_"</code> will be used if a <code>PaddingString</code> is not provided. If the <code>PaddingString</code> is not an exact multiple of the actual pad size, it will be trimmed to fit in <code>DesiredLength</code>.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "greetings" attribute has the value "hello", then the following
Expressions will provide the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 13. PadLeft Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${greetings:padLeft(10)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>_____hello</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${greetings:padLeft(10, '@')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>@@@@@hello</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${greetings:padLeft(10, 'xy')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>xyxyxhello</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${greetings:padLeft(10, 'aVeryLongPaddingString')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>aVeryhello</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="padright"><a class="anchor" href="expression-language-guide.html#padright"></a>padRight</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>padRight</code> function appends the given padding string (or <code>'_'</code>, if nothing is provided) to the argument <code>String</code> until the passed desired length is reached.</span></p>
</div>
<div class="paragraph">
<p>It returns the argument as is if its length is already equal or higher than the desired length, if the padding string is <code>null</code>, and if the desired length is either negative or greater than <code>Integer.MAX_VALUE</code>.
It returns <code>null</code> if the argument string is not a valid attribute.</p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>DesiredLength</em></span> : <span class="argDesc">The integer value to pad to.</span></p>
</li>
<li>
<p><span class="argName"><em>PaddingString</em></span> : <span class="argDesc">The optional string to pad with. <code>"_"</code> will be used if a <code>PaddingString</code> is not provided. If the <code>PaddingString</code> is not an exact multiple of the actual pad size, it will be trimmed to fit in <code>DesiredLength</code>.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "greetings" attribute has the value "hello", then the following
Expressions will provide the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 14. PadLeft Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${greetings:padRight(10)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>hello_____</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${greetings:padRight(10, '@')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>hello@@@@@</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${greetings:padRight(10, 'xy')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>helloxyxyx</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${greetings:padLeft(10, 'aVeryLongPaddingString')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>helloaVery</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="replacenull"><a class="anchor" href="expression-language-guide.html#replacenull"></a>replaceNull</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>replaceNull</code> function returns the argument if the Subject is null. Otherwise,
returns the Subject.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Any</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Replacement</em></span> : <span class="argDesc">The value to return if the Subject is null.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Type of Subject if Subject is not null; else, type of Argument</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the attribute "filename" has the value "a brand new filename.txt" and the attribute
"hello" does not exist, then the Expression <code>${filename:replaceNull('abc')}</code> will return
"a brand new filename.txt", while <code>${hello:replaceNull('abc')}</code> will return "abc".</p>
</div>
</div>
<div class="sect2 function">
<h3 id="replaceempty"><a class="anchor" href="expression-language-guide.html#replaceempty"></a>replaceEmpty</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>replaceEmpty</code> function returns the argument if the Subject is null or
if the Subject consists only of white space (new line, carriage return, tab, space). Otherwise,
returns the Subject.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Replacement</em></span> : <span class="argDesc">The value to return if the Subject is null or empty.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the attribute "filename" has the value "a brand new filename.txt" and the attribute
"hello" has the value " ", then the Expression <code>${filename:replaceEmpty('abc')}</code> will return
"a brand new filename.txt", while <code>${hello:replaceEmpty('abc')}</code> will return "abc".</p>
</div>
</div>
<div class="sect2 function">
<h3 id="length"><a class="anchor" href="expression-language-guide.html#length"></a>length</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns the length of the Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the attribute "filename" has a value of "a brand new filename.txt" and the attribute
"hello" does not exist, then the Expression <code>${filename:length()}</code> will return 24. <code>${hello:length()}</code>
will return 0.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="evaluateelstring"><a class="anchor" href="expression-language-guide.html#evaluateelstring"></a>evaluateELString</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function evaluates the Expression Language inside the variable value.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If one of the registry variable named "query" has value "SELECT * FROM TABLE WHERE ID = ${id}"
and the value of the "id" field, we are getting from the flowfile attributes (i.e. id=20)
then the Expression <code>${query:evaluateELString()}</code> will return SELECT * FROM TABLE WHERE ID = 20</p>
</div>
</div>
<div class="sect2 function">
<h3 id="repeat"><a class="anchor" href="expression-language-guide.html#repeat"></a>repeat</h3>
<div class="paragraph">
<p><strong>Description</strong>:
<span class="description">Returns a string that is the Subject repeated a random number of times between <em>min repeats</em> and
<em>max repeats</em>. If <em>max repeats</em> is not supplied, it will return the Subject repeated exactly <em>min repeats</em> times.</span></p>
</div>
<div class="paragraph">
<p><span class="description">The <em>min repeats</em> and <em>max repeats</em> must be positive numbers, with <em>max repeats</em> greater than or equal
to <em>min repeats</em></span></p>
</div>
<div class="paragraph">
<p><span class="description">If either <em>min repeats</em> or <em>max repeats</em> is not a number, this function call will result
in an error.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>min repeats</em></span> : <span class="argDesc">The minimum number (inclusive) of times to repeat the subject, or the exact number
of times to repeat the subject if <em>max repeats</em> is not supplied.</span></p>
</li>
<li>
<p><span class="argName"><em>max repeats</em></span> : <span class="argDesc">The maximum number (inclusive) of times to repeat the subject.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>:</p>
</div>
<div class="paragraph">
<p>If we have an attribute named "str" with the value "abc",
then the following Expressions will result in the following values:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 15. Repeat Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${str:repeat(1)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>abc</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${str:repeat(2)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>abcabc</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${str:repeat(1,2)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>abc</code> or <code>abcabc</code> (at random)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${str:repeat( ${str:length()} )}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>abc</code> or <code>abcabc</code> or <code>abcabcabc</code> (at random)</p></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="encode"><a class="anchor" href="expression-language-guide.html#encode"></a>Encode/Decode Functions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Each of the following functions will encode a string according the rules of the given data format.</p>
</div>
<div class="sect2 function">
<h3 id="escapejson"><a class="anchor" href="expression-language-guide.html#escapejson"></a>escapeJson</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function prepares the Subject to be inserted into JSON document by escaping the characters
in the String using Json String rules. The function correctly escapes quotes and control-chars (tab, backslash,
cr, ff, etc.)</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "message" attribute is 'He didn&#8217;t say, "Stop!"', then the Expression <code>${message:escapeJson()}</code>
will return 'He didn&#8217;t say, \"Stop!\"'</p>
</div>
</div>
<div class="sect2 function">
<h3 id="escapexml"><a class="anchor" href="expression-language-guide.html#escapexml"></a>escapeXml</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function prepares the Subject to be inserted into XML document by escaping the characters
in a String using XML entities. The function correctly escapes quotes, apostrophe, ampersand, &lt;, &gt; and
control-chars.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "message" attribute is '"bread" &amp; "butter"', then the Expression <code>${message:escapeXml()}</code>
will return '&quot;bread&quot; &amp; &quot;butter&quot;'</p>
</div>
</div>
<div class="sect2 function">
<h3 id="escapecsv"><a class="anchor" href="expression-language-guide.html#escapecsv"></a>escapeCsv</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function prepares the Subject to be inserted into CSV document by escaping the characters
in a String using the rules in RFC 4180. The function correctly escapes quotes and surround the string in quotes if needed.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "message" attribute is 'But finally, she left', then the Expression <code>${message:escapeCsv()}</code>
will return '"But finally, she left"'</p>
</div>
</div>
<div class="sect2 function">
<h3 id="escapehtml3"><a class="anchor" href="expression-language-guide.html#escapehtml3"></a>escapeHtml3</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function prepares the Subject to be inserted into HTML document by escaping the characters
in a String using the HTML entities. Supports only the HTML 3.0 entities.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "message" attribute is '"bread" &amp; "butter"', then the Expression <code>${message:escapeHtml3()}</code>
will return '&quot;bread&quot; &amp; &quot;butter&quot;'</p>
</div>
</div>
<div class="sect2 function">
<h3 id="escapehtml4"><a class="anchor" href="expression-language-guide.html#escapehtml4"></a>escapeHtml4</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function prepares the Subject to be inserted into HTML document by escaping the characters
in a String using the HTML entities. Supports all known HTML 4.0 entities.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "message" attribute is '"bread" &amp; "butter"', then the Expression <code>${message:escapeHtml4()}</code>
will return '&quot;bread&quot; &amp; &quot;butter&quot;'</p>
</div>
</div>
<div class="sect2 function">
<h3 id="unescapejson"><a class="anchor" href="expression-language-guide.html#unescapejson"></a>unescapeJson</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function unescapes any Json literals found in the String.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "message" attribute is 'He didn&#8217;t say, \"Stop!\"', then the Expression <code>${message:unescapeJson()}</code>
will return 'He didn&#8217;t say, "Stop!"'</p>
</div>
</div>
<div class="sect2 function">
<h3 id="unescapexml"><a class="anchor" href="expression-language-guide.html#unescapexml"></a>unescapeXml</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function unescapes a string containing XML entity escapes to a string containing the
actual Unicode characters corresponding to the escapes. Supports only the five basic XML entities (gt, lt,
quot, amp, apos).</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "message" attribute is '&quot;bread&quot; &amp; &quot;butter&quot;', then the Expression <code>${message:unescapeXml()}</code>
will return '"bread" &amp; "butter"'</p>
</div>
</div>
<div class="sect2 function">
<h3 id="unescapecsv"><a class="anchor" href="expression-language-guide.html#unescapecsv"></a>unescapeCsv</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function unescapes a String from a CSV document according to the rules of RFC 4180.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "message" attribute is '"But finally, she left"', then the Expression <code>${message:unescapeCsv()}</code>
will return 'But finally, she left'</p>
</div>
</div>
<div class="sect2 function">
<h3 id="unescapehtml3"><a class="anchor" href="expression-language-guide.html#unescapehtml3"></a>unescapeHtml3</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function unescapes a string containing HTML 3 entity to a string containing the
actual Unicode characters corresponding to the escapes. Supports only HTML 3.0 entities.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "message" attribute is '&quot;bread&quot; &amp; &quot;butter&quot;', then the Expression <code>${message:unescapeHtml3()}</code>
will return '"bread" &amp; "butter"'</p>
</div>
</div>
<div class="sect2 function">
<h3 id="unescapehtml4"><a class="anchor" href="expression-language-guide.html#unescapehtml4"></a>unescapeHtml4</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">This function unescapes a string containing HTML 4 entity to a string containing the
actual Unicode characters corresponding to the escapes. Supports all known HTML 4.0 entities.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "message" attribute is '&quot;bread&quot; &amp; &quot;butter&quot;', then the Expression <code>${message:unescapeHtml4()}</code>
will return '"bread" &amp; "butter"'</p>
</div>
</div>
<div class="sect2 function">
<h3 id="urlencode"><a class="anchor" href="expression-language-guide.html#urlencode"></a>urlEncode</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a URL-friendly version of the Subject. This is useful, for instance, when using an
attribute value to indicate the URL of a website.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: We can URL-Encode an attribute named "url" by using the Expression <code>${url:urlEncode()}</code>. If
the value of the "url" attribute is "https://nifi.apache.org/some value with spaces", this
Expression will then return "https%3A%2F%2Fnifi.apache.org%2Fsome+value+with+spaces".</p>
</div>
</div>
<div class="sect2 function">
<h3 id="urldecode"><a class="anchor" href="expression-language-guide.html#urldecode"></a>urlDecode</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Converts a URL-friendly version of the Subject into a human-readable form.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If we have a URL-Encoded attribute named "url" with the value
"https://nifi.apache.org/some%20value%20with%20spaces" or "https%3A%2F%2Fnifi.apache.org%2Fsome+value+with+spaces", then the Expression
<code>${url:urlDecode()}</code> will return "https://nifi.apache.org/some value with spaces".</p>
</div>
</div>
<div class="sect2 function">
<h3 id="base64encode"><a class="anchor" href="expression-language-guide.html#base64encode"></a>base64Encode</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a Base64 encoded string. This is useful for being able to transfer binary data as ascii.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: We can Base64-Encoded an attribute named "payload" by using the Expression
<code>${payload:base64Encode()}</code> If the attribute payload had a value of "admin:admin"
then the Expression <code>${payload:base64Encode()}</code> will return "YWRtaW46YWRtaW4=".</p>
</div>
</div>
<div class="sect2 function">
<h3 id="base64decode"><a class="anchor" href="expression-language-guide.html#base64decode"></a>base64Decode</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Reverses the Base64 encoding on given string.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If we have a Base64-Encoded attribute named "payload" with the value
"YWRtaW46YWRtaW4=", then the Expression
<code>${payload:base64Decode()}</code> will return "admin:admin".</p>
</div>
</div>
<div class="sect2 function">
<h3 id="uuid3"><a class="anchor" href="expression-language-guide.html#uuid3"></a>UUID3</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a type 3 (MD5 hashed) namespace name-based UUID. The argument must be a valid UUID.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>namespace</em></span> : <span class="argDesc">The namespace UUID identifier</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If we have an attribute named "attr" with a value of "string value", then the Expression <code>${attr:UUID3('b9e81de3-7047-4b5e-a822-8fff5b49f808')}</code> will return "bf0ea246-a177-3300-bd7e-d4c9e973dc6f".</p>
</div>
<div class="paragraph">
<p>An empty argument or an argument value with an invalid UUID results in an exception bulletin.</p>
</div>
<div class="paragraph">
<p><strong>See Also</strong>: <span class="seeAlso"><a href="expression-language-guide.html#uuid">UUID()</a></span></p>
</div>
</div>
<div class="sect2 function">
<h3 id="uuid5"><a class="anchor" href="expression-language-guide.html#uuid5"></a>UUID5</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a type 5 (SHA-1 hashed) namespace name-based UUID. The argument must be a valid UUID.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>namespace</em></span> : <span class="argDesc">The namespace UUID identifier</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If we have an attribute named "attr" with a value of "string value", then the Expression <code>${attr:UUID5('245b55a8-397d-4480-a41e-16603c8cf9ad')}</code> will return "4d111477-5100-5f2d-ae79-b38bbe15aa78".</p>
</div>
<div class="paragraph">
<p>An empty argument or an argument value with an invalid UUID results in an exception bulletin.</p>
</div>
<div class="paragraph">
<p><strong>See Also</strong>: <span class="seeAlso"><a href="expression-language-guide.html#uuid">UUID()</a></span></p>
</div>
</div>
<div class="sect2 function">
<h3 id="hash"><a class="anchor" href="expression-language-guide.html#hash"></a>hash</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a hex encoded string using the hash algorithm provided. This can be used to generate unique keys.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>algorithm</em></span> : <span class="argDesc">An algorithm to hash value.
Supports one of [SHA-384, SHA-224, SHA-256, MD2, SHA, SHA-512, MD5]. Warning: MD2, MD5, and SHA (SHA-1) should not be considered cryptographically secure (<a href="https://csrc.nist.gov/projects/hash-functions/nist-policy-on-hash-functions" target="_blank" rel="noopener">https://csrc.nist.gov/projects/hash-functions/nist-policy-on-hash-functions</a>).</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: We can hash an attribute named "payload" by using the Expression
<code>${payload:hash('SHA-256')}</code> If the attribute payload had a value of "string value"
then the Expression <code>${payload:hash('SHA-256')}</code> will return "9b6a1a9167a5caf3f5948413faa89e0ec0de89e12bef55327442e60dcc0e8c9b".</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="searching"><a class="anchor" href="expression-language-guide.html#searching"></a>Searching</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Each of the following functions is used to search its subject for some value.</p>
</div>
<div class="sect2 function">
<h3 id="startswith"><a class="anchor" href="expression-language-guide.html#startswith"></a>startsWith</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns <code>true</code> if the Subject starts with the String provided as the argument,
<code>false</code> otherwise.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The value to search for</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt", then the Expression
<code>${filename:startsWith('a brand')}</code> will return <code>true</code>. <code>${filename:startsWith('A BRAND')}</code> will
return <code>false</code>. <code>${filename:toUpper():startsWith('A BRAND')}</code> returns <code>true</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="endswith"><a class="anchor" href="expression-language-guide.html#endswith"></a>endsWith</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns <code>true</code> if the Subject ends with the String provided as the argument,
<code>false</code> otherwise.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The value to search for</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt", then the Expression
<code>${filename:endsWith('txt')}</code> will return <code>true</code>. <code>${filename:endsWith('TXT')}</code> will
return <code>false</code>. <code>${filename:toUpper():endsWith('TXT')}</code> returns <code>true</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="contains"><a class="anchor" href="expression-language-guide.html#contains"></a>contains</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns <code>true</code> if the Subject contains the value of the argument anywhere in the value.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The value to search for</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt", then the Expression
<code>${filename:contains('new')}</code> will return <code>true</code>. <code>${filename:contains('NEW')}</code> will
return <code>false</code>. <code>${filename:toUpper():contains('NEW')}</code> returns <code>true</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="in"><a class="anchor" href="expression-language-guide.html#in"></a>in</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns <code>true</code> if the Subject is matching one of the provided arguments.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value1</em></span> : <span class="argDesc">First possible matching value</span></p>
</li>
<li>
<p><span class="argName"><em>valueN</em></span> : <span class="argDesc">Nth possible matching value</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "myEnum" attribute has the value "JOHN", then the Expression
<code>${myEnum:in("PAUL", "JOHN", "MIKE")}</code> will return <code>true</code>. <code>${myEnum:in("RED", "GREEN", "BLUE")}</code> will
return <code>false</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="find"><a class="anchor" href="expression-language-guide.html#find"></a>find</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns <code>true</code> if the Subject contains any sequence of characters that matches the
Regular Expression provided by the argument.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Regex</em></span> : <span class="argDesc">The Regular Expression (in the Java Pattern syntax) to match against the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>:</p>
</div>
<div class="paragraph">
<p>If the "filename" attribute has the value "a brand new filename.txt", then the following
Expressions will provide the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 16. find Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:find('a [Bb]rand [Nn]ew')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:find('Brand.*')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:find('brand')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="matches"><a class="anchor" href="expression-language-guide.html#matches"></a>matches</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns <code>true</code> if the Subject exactly matches the Regular Expression provided by the argument.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Regex</em></span> : <span class="argDesc">The Regular Expression (in the Java Pattern syntax) to match against the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>:</p>
</div>
<div class="paragraph">
<p>If the "filename" attribute has the value "a brand new filename.txt", then the following
Expressions will provide the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 17. matches Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:matches('a.*txt')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:matches('brand')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:matches('.+brand.+')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="indexof"><a class="anchor" href="expression-language-guide.html#indexof"></a>indexOf</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns the index of the first character in the Subject that matches the String value provided
as an argument. If the argument is found multiple times within the Subject, the value returned is the
starting index of the <strong>first</strong> occurrence.
If the argument cannot be found in the Subject, returns <code>-1</code>. The index is zero-based. This means that if
the search string is found at the beginning of the Subject, the value returned will be <code>0</code>, not <code>1</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The value to search for in the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt", then the following
Expressions will provide the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 18. indexOf Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:indexOf('a.*txt')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:indexOf('.')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>20</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:indexOf('a')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:indexOf(' ')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="lastindexof"><a class="anchor" href="expression-language-guide.html#lastindexof"></a>lastIndexOf</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns the index of the first character in the Subject that matches the String value provided
as an argument. If the argument is found multiple times within the Subject, the value returned is the
starting index of the <strong>last</strong> occurrence.
If the argument cannot be found in the Subject, returns <code>-1</code>. The index is zero-based. This means that if
the search string is found at the beginning of the Subject, the value returned will be <code>0</code>, not <code>1</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The value to search for in the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "filename" attribute has the value "a brand new filename.txt", then the following
Expressions will provide the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 19. lastIndexOf Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:lastIndexOf('a.*txt')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:lastIndexOf('.')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>20</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:lastIndexOf('a')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>17</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${filename:lastIndexOf(' ')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>11</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="jsonpath"><a class="anchor" href="expression-language-guide.html#jsonpath"></a>jsonPath</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>jsonPath</code> function generates a string by evaluating the Subject as JSON and applying a JSON
path expression. An empty string is generated if the Subject does not contain valid JSON, the <em>jsonPath</em> is invalid, or the path
does not exist in the Subject. If the evaluation results in a scalar value, the string representation of scalar value is
generated. Otherwise a string representation of the JSON result is generated. A JSON array of length 1 is special cased
when <code>[0]</code> is a scalar, the string representation of <code>[0]</code> is generated.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:
<span class="argName"><em>jsonPath</em></span> : <span class="argDesc">the JSON path expression used to evaluate the Subject.</span></p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "myJson" attribute is</p>
</div>
<div class="literalblock">
<div class="content">
<pre>{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
}
],
"children": [],
"spouse": null
}</pre>
</div>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 20. jsonPath Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPath('$.firstName')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>John</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPath('$.address.postalCode')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>10021-3100</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPath('$.phoneNumbers[?(@.type=="home")].number')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>212 555-1234</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPath('$.phoneNumbers')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}]</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPath('$.missing-path')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><em>empty</em></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPath('$.bad-json-path..')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><em>exception bulletin</em></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>An empty subject value or a subject value with an invalid JSON document results in an exception bulletin.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="jsonpathdelete"><a class="anchor" href="expression-language-guide.html#jsonpathdelete"></a>jsonPathDelete</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>jsonPathDelete</code> function deletes the specified JsonPath from a Subject JSON and returns string
form of the updated JSON.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:
<span class="argName"><em>jsonPath</em></span> : <span class="argDesc">the JSON path expression to delete from the Subject.</span></p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "myJson" attribute is</p>
</div>
<div class="literalblock">
<div class="content">
<pre>{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
}
],
"children": [],
"spouse": null
}</pre>
</div>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 21. jsonPathDelete Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPathDelete('$.firstName')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>{"lastName":"Smith","age":25,"address":{"streetAddress":"21 2nd Street","city":"New York","state":"NY","postalCode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}]}</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPathDelete('$.missing-path')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Returns original JSON document</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>An empty subject value or a subject value with an invalid JSON document results in an exception bulletin.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="jsonpathadd"><a class="anchor" href="expression-language-guide.html#jsonpathadd"></a>jsonPathAdd</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>jsonPathAdd</code> function adds a scalar value to an array at the specified JsonPath on
a Subject JSON and returns string form of the updated JSON.</span> If the expression target element is a non-array,
an empty string is returned and an exception is logged indicating the error. If the expression target element
path is not in the JSON, the operation returns the original JSON without any modifications.</p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>jsonPath</em></span> : <span class="argDesc">the JSON path expression to set value on the Subject.</span></p>
</li>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">the value expression to be added to the array at the specified path on Subject.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "myJson" attribute is</p>
</div>
<div class="literalblock">
<div class="content">
<pre>{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"voter" : true,
"height" : 6.1,
"address" : {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
}
],
"nicknames" : []
}</pre>
</div>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 22. jsonPathAdd Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPathAdd('$.nicknames', 'Jimmy')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>{"firstName":"James", lastName":"Smith", "age":25, "voter":true, "height":6.1, "address":{"streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021-3100"}, "phoneNumbers":[{"type":"home", "number":"212 555-1234"}, {"type":"office", "number":"646 555-4567"}],"nicknames":["Jimmy"]}</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPathAdd('$.missingpath', 'Jimmy')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Returns original JSON document with no modifications</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPathAdd('$.firstName', 'Jimmy')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><em>empty</em></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="jsonpathset"><a class="anchor" href="expression-language-guide.html#jsonpathset"></a>jsonPathSet</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>jsonPathSet</code> function sets the value at the specified JsonPath on a Subject JSON and returns string
form of the updated JSON.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>jsonPath</em></span> : <span class="argDesc">the JSON path expression to set value on the Subject.</span></p>
</li>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">the value expression to be set on the specified path on Subject.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "myJson" attribute is</p>
</div>
<div class="literalblock">
<div class="content">
<pre>{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"voter" : true,
"height" : 6.1,
"address" : {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
}
],
"nicknames" : []
}</pre>
</div>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 23. jsonPathSet Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPathSet('$.firstName', 'James')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>{"firstName":"James", lastName":"Smith", "age":25, "voter":true, "height":6.1, "address":{"streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021-3100"}, "phoneNumbers":[{"type":"home", "number":"212 555-1234"}, {"type":"office", "number":"646 555-4567"}]}</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPathSet('$.missingpath', 'James')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Returns original JSON document</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>An empty subject value or a subject value with an invalid JSON document results in an exception bulletin.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="jsonpathput"><a class="anchor" href="expression-language-guide.html#jsonpathput"></a>jsonPathPut</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">The <code>jsonPathPut</code> function puts the key and scalar value at the specified JsonPath on a Subject JSON and returns string
form of the updated JSON.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>jsonPath</em></span> : <span class="argDesc">the JSON path expression to set value on the Subject.</span></p>
</li>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">the value expression to be set on the specified path on Subject.</span></p>
</li>
<li>
<p><span class="argName"><em>key</em></span> : <span class="argDesc">the key expression with the associated value the specified path on Subject.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "myJson" attribute is</p>
</div>
<div class="literalblock">
<div class="content">
<pre>{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"voter" : true,
"height" : 6.1,
"address" : {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
}
],
"nicknames" : []
}</pre>
</div>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 24. jsonPathPut Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${myJson:jsonPathPut('$','middlename','Turon')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>{"firstName":"James", lastName":"Smith", "middlename": "Turon", "age":25, "voter":true, "height":6.1, "address":{"streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021-3100"}, "phoneNumbers":[{"type":"home", "number":"212 555-1234"}, {"type":"office", "number":"646 555-4567"}]}</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>An empty subject value or a subject value with an invalid JSON document results in an exception bulletin.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="numbers"><a class="anchor" href="expression-language-guide.html#numbers"></a>Mathematical Operations and Numeric Manipulation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>For those functions that support Decimal and Number (whole number) types, the return value type depends on the input types. If either the
subject or argument are a Decimal then the result will be a Decimal. If both values are Numbers then the result will be a Number. This includes
Divide. This is to preserve backwards compatibility and to not force rounding errors.</p>
</div>
<div class="sect2 function">
<h3 id="plus"><a class="anchor" href="expression-language-guide.html#plus"></a>plus</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Adds a numeric value to the Subject. If either the argument or the Subject cannot be
coerced into a Number, returns <code>null</code>. Does not provide handling for overflow.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number or Decimal</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Operand</em></span> : <span class="argDesc">The value to add to the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number or Decimal (depending on input types)</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "fileSize" attribute has a value of 100, then the Expression <code>${fileSize:plus(1000)}</code>
will return the value <code>1100</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="minus"><a class="anchor" href="expression-language-guide.html#minus"></a>minus</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Subtracts a numeric value from the Subject. Does not provide handling for overflow.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number or Decimal</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Operand</em></span> : <span class="argDesc">The value to subtract from the Subject</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number or Decimal (depending on input types)</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "fileSize" attribute has a value of 100, then the Expression <code>${fileSize:minus(100)}</code>
will return the value <code>0</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="multiply"><a class="anchor" href="expression-language-guide.html#multiply"></a>multiply</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Multiplies a numeric value by the Subject and returns the product.</span> Does not provide handling for overflow.</p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number or Decimal</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Operand</em></span> : <span class="argDesc">The value to multiple the Subject by</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number or Decimal (depending on input types)</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "fileSize" attribute has a value of 100, then the Expression <code>${fileSize:multiply(1024)}</code>
will return the value <code>102400</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="divide"><a class="anchor" href="expression-language-guide.html#divide"></a>divide</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Divides the Subject by a numeric value and returns the result.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number or Decimal</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Operand</em></span> : <span class="argDesc">The value to divide the Subject by</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number or Decimal (depending on input types)</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "fileSize" attribute has a value of 100, then the Expression <code>${fileSize:divide(12)}</code>
will return the value <code>8</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="mod"><a class="anchor" href="expression-language-guide.html#mod"></a>mod</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Performs a modular division of the Subject by the argument. That is, this function will divide
the Subject by the value of the argument and return not the quotient but rather the remainder.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number or Decimal</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Operand</em></span> : <span class="argDesc">The value to divide the Subject by</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number or Decimal (depending on input types)</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "fileSize" attribute has a value of 100, then the Expression <code>${fileSize:mod(12)}</code>
will return the value <code>4</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="toradix"><a class="anchor" href="expression-language-guide.html#toradix"></a>toRadix</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Converts the Subject from a Base 10 number to a different Radix (or number base). An optional second argument can be used to indicate the minimum number of characters to be used. If the converted value has fewer than this number of characters, the number will be padded with leading zeroes. If a decimal is passed as the subject, it will first be converted to a whole number and then processed.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Desired Base</em></span> : <span class="argDesc">A Number between 2 and 36 (inclusive)</span></p>
</li>
<li>
<p><span class="argName"><em>Padding</em></span> : <span class="argDesc">Optional argument that specifies the minimum number of characters in the converted output</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "fileSize" attributes has a value of 1024, then the following Expressions will yield
the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 25. toRadix Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${fileSize:toRadix(10)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1024</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${fileSize:toRadix(10, 1)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1024</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${fileSize:toRadix(10, 8)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>00001024</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${fileSize:toRadix(16)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>400</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${fileSize:toRadix(16, 8)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>00000400</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${fileSize:toRadix(2)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>10000000000</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${fileSize:toRadix(2, 16)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0000010000000000</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="fromradix"><a class="anchor" href="expression-language-guide.html#fromradix"></a>fromRadix</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Converts the Subject from a specified Radix (or number base) to a base ten whole number. The subject will converted as is, without interpretation, and all characters must be valid for the base being converted from. For example converting "0xFF" from hex will not work due to "x" being a invalid hex character. If a decimal is passed as the subject, it will first be converted to a whole number and then processed.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Subject Base</em></span> : <span class="argDesc">A Number between 2 and 36 (inclusive)</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "fileSize" attributes has a value of 1234A, then the following Expressions will yield
the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 26. toRadix Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${fileSize:fromRadix(11)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>17720</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${fileSize:fromRadix(16)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>74570</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${fileSize:fromRadix(20)}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>177290</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="random"><a class="anchor" href="expression-language-guide.html#random"></a>random</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a random whole number ( 0 to 2^63 - 1) using an insecure random number generator.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${random():mod(10):plus(1)}</code> returns random number between 1 and 10 inclusive.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="math"><a class="anchor" href="expression-language-guide.html#math"></a>math</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">ADVANCED FEATURE. This expression is designed to be used by advanced users only. It utilizes Java Reflection to run arbitrary java.lang.Math static methods. The exact API will depend on the version of Java you are running. The Java 8 API can be found here: <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html" target="_blank" rel="noopener">https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html</a>
<br>
In order to run the correct method, the parameter types must be correct. The Expression Language "Number" (whole number) type is interpreted as a Java "long". The "Decimal" type is interpreted as a Java "double". Running the desired method may require calling "toNumber()" or "toDecimal()" in order to "cast" the value to the desired type. This also is important to remember when cascading "math()" calls since the return type depends on the method that was run.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject subjectless">Subjectless, Number or Decimal (depending on the desired method to run)</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Method</em></span> : <span class="argDesc">The name of the Java Math method to run</span></p>
</li>
<li>
<p><span class="argName"><em>Optional Argument</em></span> : <span class="argDesc">Optional argument that acts as the second parameter to the method.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number or Decimal (depending on method run)</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>${math("random")} runs Math.random().</p>
</li>
<li>
<p>${literal(2):toDecimal:math("pow", 2.5)} runs Math.pow(2D,2.5D).</p>
</li>
<li>
<p>${literal(64):toDouble():math("cbrt"):toNumber():math("max", 5)} runs Math.maxDouble.valueOf(Math.cbrt(64D).longValue(), 5L). Note that the toDecimal() is needed because "cbrt" takes a "double" as input and the "64" will get interpreted as a long. The "toDecimal()" call is necessary to correctly call the method. that the "toNumber()" call is necessary because "cbrt" returns a double and the "max" method is must have parameters of the same type and "5" is interpreted as a long.</p>
</li>
<li>
<p>${literal(5.4):math("scalb", 2)} runs Math.scalb(5.4, 2). This example is important because NiFi EL treats all whole numbers as "longs" and there is no concept of an "int". "scalb" takes a second parameter of an "int" and it is not overloaded to accept longs so it could not be run without special type handling. In the instance where the Java method cannot be found using parameters of type "double" and "long" the "math()" EL function will attempt to find a Java method with the same name but parameters of "double" and "int".</p>
</li>
<li>
<p>${first:toDecimal():math("pow", ${second:toDecimal()})} where attributes evaluate to "first" = 2.5 and "second" = 2. This example runs Math.pow(2.5D, 2D). The explicit calls to toDecimal() are important because of the dynamic nature of EL. When creating the flow, the user is unaware if the expression language values will be able to be interpreted as a whole number or not. In this example without the explicit calls "toDecimal" the "math" function would attempt to run a Java method "pow" with types "double" and "long" (which doesn&#8217;t exist).</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="dates"><a class="anchor" href="expression-language-guide.html#dates"></a>Date Manipulation</h2>
<div class="sectionbody">
<div class="sect2 function">
<h3 id="format"><a class="anchor" href="expression-language-guide.html#format"></a>format</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Formats a number as a date/time according to the format specified by the argument. The argument
must be a String that is a valid Java SimpleDateFormat format. The Subject is expected to be a Number that
represents the number of milliseconds since Midnight GMT on January 1, 1970. The number will be evaluated using the local
time zone unless specified in the second optional argument.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>format</em></span> : <span class="argDesc">The format to use in the Java SimpleDateFormat syntax</span></p>
</li>
<li>
<p><span class="argName"><em>time zone</em></span> : <span class="argDesc">Optional argument that specifies the time zone to use (in the Java TimeZone syntax)</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the attribute "time" has the value "1420058163264", then the following Expressions will yield
the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 27. format Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${time:format("yyyy/MM/dd HH:mm:ss.SSS'Z'", "GMT")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2014/12/31 20:36:03.264Z</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${time:format("yyyy/MM/dd HH:mm:ss.SSS'Z'", "America/Los_Angeles")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2014/12/31 12:36:03.264Z</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${time:format("yyyy/MM/dd HH:mm:ss.SSS'Z'", "Asia/Tokyo")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2015/01/01 05:36:03.264Z</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${time:format("yyyy/MM/dd", "GMT")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2014/12/31</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${time:format("HH:mm:ss.SSS'Z'", "GMT")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>20:36:03.264Z</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${time:format("yyyy", "GMT")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2014</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="formatInstant"><a class="anchor" href="expression-language-guide.html#formatInstant"></a>formatInstant</h3>
<div class="paragraph">
<p><strong>Description</strong>: [.description]#Formats an Instant, number or string according to the format specified by the argument.</p>
</div>
<div class="paragraph">
<p>The first argument must be a String that is a valid Java DateTimeFormatter format.
The second argument must be a String that is a valid time zone.
The Subject is expected to be an Instant, String or Number that represents the number of milliseconds since Midnight GMT on January 1, 1970 or a String with one of the following</p>
</div>
<div class="paragraph">
<p>DateTimeFormatter syntaxes:#</p>
</div>
<div class="ulist">
<ul>
<li>
<p><em>ISO_OFFSET</em> such as '2011-12-03T10:15:30+01:00'</p>
</li>
<li>
<p><em>ISO_INSTANT</em> such as '2011-12-03T10:15:30Z'</p>
</li>
<li>
<p><em>RFC_1123</em> such as 'Thu, 01 Dec 1994 16:00:00 GMT'</p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Instant or Number or String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>format</em></span> : <span class="argDesc">The format to use in the Java DateTimeFormatter syntax</span></p>
</li>
<li>
<p><span class="argName"><em>time zone</em></span> : <span class="argDesc">Optional argument that specifies the time zone to use (in the Java TimeZone syntax)</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the attribute "time" has the value "1647884009479", timeIsoOffset has the value "2022-12-03T10:15:30+01:00",
timeIsoInstant has the value "2022-12-03T10:15:30Z" and "timeRFC1123" has the value "Thu, 01 Dec 2022 16:00:00 GMT",
then the following Expressions will yield the following results:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 28. format Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${time:formatInstant("yyyy/MM/dd HH:mm:ss.SSS'Z'", "GMT")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2022/03/21 17:33:29.479Z</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${timeIsoOffset:formatInstant("yyyy/MM/dd HH:mm:ss.SSS'Z'", "Asia/Tokyo")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2022/12/03 18:15:30.000Z</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${timeIsoInstant:formatInstant("yyyy/MM/dd", "Asia/Tokyo")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2022/12/03 19:15:30.000Z</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${timeRFC1123:formatInstant("yyyy/MM/dd HH:mm:ss.SSS'Z'", "GMT")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2022/12/01 16:00:00.000Z</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="todate"><a class="anchor" href="expression-language-guide.html#todate"></a>toDate</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Converts a String into a Date data type, based on the format specified by the argument. The argument
must be a String that is a valid Java SimpleDateFormat syntax. The Subject is expected to be a String that is formatted
according the argument. The date will be evaluated using the local time zone unless specified in the second optional argument.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>format</em></span> : <span class="argDesc">The current format to use when parsing the Subject, in the Java SimpleDateFormat syntax.</span></p>
</li>
<li>
<p><span class="argName"><em>time zone</em></span> : <span class="argDesc">Optional argument that specifies the time zone to use when parsing the Subject, in the Java TimeZone syntax.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Date</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the attribute "year" has the value "2014" and the attribute "time" has the value "2014/12/31 15:36:03.264Z",
then the Expression <code>${year:toDate('yyyy', 'GMT')}</code> will return a Date data type with a value representing Midnight GMT on
January 1, 2014. The Expression <code>${time:toDate("yyyy/MM/dd HH:mm:ss.SSS&#8217;Z'", "GMT")}</code> will result in a Date data type for
15:36:03.264 GMT on December 31, 2014.</p>
</div>
<div class="paragraph">
<p>Often, this function is used in conjunction with the <a href="expression-language-guide.html#format">format</a> function to change the format of a date/time. For example,
if the attribute "date" has the value "12-24-2014" and we want to change the format to "2014/12/24", we can do so by
chaining together the two functions: <code>${date:toDate('MM-dd-yyyy'):format('yyyy/MM/dd')}</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="toinstant"><a class="anchor" href="expression-language-guide.html#toinstant"></a>toInstant</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Converts a String or Number into an Instant data type, based on the format specified by the argument. In case of
String format nanosecond precision date parsing is supported. The argument
must be a String that is a valid Java DateTimeFormatter syntax. The Subject is expected to be a String that is formatted
according the argument or a number which represents the datetime in milliseconds. The datetime will be evaluated using the
time zone specified in the second argument.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String or Number</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>format</em></span> : <span class="argDesc">The current format to use when parsing the Subject, in the Java DateTimeFormatter syntax.</span></p>
</li>
<li>
<p><span class="argName"><em>time zone</em></span> : <span class="argDesc">Required argument that specifies the time zone to use when parsing the Subject, in the Java TimeZone syntax.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Instant</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the attribute "time" has the value "2014/12/31 15:36:03.264Z" then the expression <code>${time:toInstant("yyyy/MM/dd HH:mm:ss.SSS&#8217;Z'", "GMT")}</code> will result in an Instant data type for
15:36:03.264 GMT on December 31, 2014.</p>
</div>
<div class="paragraph">
<p>Often, this function is used in conjunction with the <a href="expression-language-guide.html#formatInstant">formatInstant</a> function to change the format of a date/time. For example,
if the attribute "dateTime" has the value "12-24-2014 12:06:59" and we want to change the format to "2014/12/24", we can do so by
chaining together the two functions: <code>${dateTime:toInstant('MM-dd-yyyy HH:mm:ss', 'GMT'):formatInstant('yyyy/MM/dd', 'GMT')}</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="tomicros"><a class="anchor" href="expression-language-guide.html#tomicros"></a>toMicros</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Converts an Instant Subject into a Number with microsecond precision</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Instant</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "dateTime" attribute has the value of "2022/03/18 10:22:27.678234567", then the Expression
<code>${dateTime:toInstant('yyyy/MM/dd HH:mm:ss.SSSSSSSSS', 'America/New_York'):toMicros()}</code> converts the Instant value of
the attribute to 1647613347678234 microseconds since epoch.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="tonanos"><a class="anchor" href="expression-language-guide.html#tonanos"></a>toNanos</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Converts an Instant Subject into a Number with nanosecond precision</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Instant</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the "dateTime" attribute has the value of "2022/03/18 10:22:27.678234567", then the Expression
<code>${dateTime:toInstant('yyyy/MM/dd HH:mm:ss.SSSSSSSSS', 'America/New_York'):toNanos()}</code> converts the Instant value of
the attribute to 1647613347678234567 nanoseconds since epoch.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="now"><a class="anchor" href="expression-language-guide.html#now"></a>now</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns the current date and time as a Date data type object.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Date</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: We can get the current date and time as a Date data type by using the <code>now</code> function: <code>${now()}</code>. As an example,
on Wednesday December 31st 2014 at 36 minutes after 3pm and 36.123 seconds EST <code>${now()}</code> would be evaluated to be a
Date type representing that time. Since whole Expression Language expressions can only return Strings it would formatted as
<code>Wed Dec 31 15:36:03 EST 2014</code> when the expression completes.</p>
</div>
<div class="paragraph">
<p>Utilizing the <a href="expression-language-guide.html#tonumber">toNumber</a> method, <code>now</code> can provide the current date and time as the number of milliseconds since
Midnight GMT on January 1, 1970. For instance, if instead of executing <code>${now()}</code> in the previous example <code>${now():toNumber()}</code>
was run then it would output <code>1453843201123</code>. This method provides millisecond-level precision and provides the ability to
manipulate the value.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 29. now Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${now()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A Date type representing the current date and time to the nearest millisecond</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${now():toNumber()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The number of milliseconds since midnight GMT Jan 1, 1970 (<code>1453843201123</code>, for example)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${now():toNumber():minus(86400000)</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">A number presenting the time 24 hours ago</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${now():format('yyyy')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The current year</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${now():toNumber():minus(86400000):format('E')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The day of the week that was yesterday,
as a 3-letter abbreviation (For example, <code>Wed</code>)</p></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="type_cast"><a class="anchor" href="expression-language-guide.html#type_cast"></a>Type Coercion</h2>
<div class="sectionbody">
<div class="sect2 function">
<h3 id="tostring"><a class="anchor" href="expression-language-guide.html#tostring"></a>toString</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Coerces the Subject into a String</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Any type</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: The Expression <code>${fileSize:toNumber():toString()}</code> converts the value of "fileSize" attribute to a number and
back to a String.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="tonumber"><a class="anchor" href="expression-language-guide.html#tonumber"></a>toNumber</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Coerces the Subject into a Number</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String, Decimal, or Date</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: The Expression <code>${fileSize:toNumber()}</code> converts the attribute value of "fileSize" to a number.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="todecimal"><a class="anchor" href="expression-language-guide.html#todecimal"></a>toDecimal</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Coerces the Subject into a Decimal</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String, Whole Number or Date</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Decimal</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: The Expression <code>${fileSize:toDecimal()}</code> converts the attribute value of "fileSize" to a decimal.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="subjectless"><a class="anchor" href="expression-language-guide.html#subjectless"></a>Subjectless Functions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>While the majority of functions in the Expression Language are called by using the syntax
<code>${attributeName:function()}</code>, there exist a few functions that are not expected to have subjects.
In this case, the attribute name is not present. For example, the IP address of the machine can
be obtained by using the Expression <code>${ip()}</code>. All of the functions in this section are to be called
without a subject. Attempting to call a subjectless function and provide it a subject will result in
an error when validating the function.</p>
</div>
<div class="sect2 function">
<h3 id="ip"><a class="anchor" href="expression-language-guide.html#ip"></a>ip</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns the IP address of the machine.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: The IP address of the machine can be obtained by using the Expression <code>${ip()}</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="hostname"><a class="anchor" href="expression-language-guide.html#hostname"></a>hostname</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns the Hostname of the machine. An optional argument of type Boolean can be provided
to specify whether or not the Fully Qualified Domain Name should be used. If <code>false</code>, or not specified,
the hostname will not be fully qualified. If the argument is <code>true</code> but the fully qualified hostname
cannot be resolved, the simple hostname will be returned.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Fully Qualified</em></span> : <span class="argDesc">Optional parameter that specifies whether or not the hostname should be
fully qualified. If not specified, defaults to false.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: The fully qualified hostname of the machine can be obtained by using the Expression <code>${hostname(true)}</code>,
while the simple hostname can be obtained by using either <code>${hostname(false)}</code> or simply <code>${hostname()}</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="uuid"><a class="anchor" href="expression-language-guide.html#uuid"></a>UUID</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a randomly generated type 4 UUID.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${UUID()}</code> returns a value similar to "de305d54-75b4-431b-adb2-eb6b9e546013"</p>
</div>
<div class="paragraph">
<p><strong>See Also</strong>: <span class="seeAlso"><a href="expression-language-guide.html#uuid3">UUID3()</a>, <a href="expression-language-guide.html#uuid5">UUID5()</a></span></p>
</div>
</div>
<div class="sect2 function">
<h3 id="nextint"><a class="anchor" href="expression-language-guide.html#nextint"></a>nextInt</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns a one-up value (starting at 0) and increasing over the lifetime of the running instance of NiFi.
This value is not persisted across restarts and is not guaranteed to be unique across a cluster.
This value is considered "one-up" in that if called multiple times across the NiFi instance, the values will be sequential.
However, this counter is shared across all NiFi components, so calling this function multiple times from one Processor will
not guarantee sequential values within the context of a particular Processor.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: If the previous value returned by <code>nextInt</code> was <code>5</code>, the Expression <code>${nextInt():divide(2)}</code> obtains the next available
integer (6) and divides the result by 2, returning a value of <code>3</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="literal"><a class="anchor" href="expression-language-guide.html#literal"></a>literal</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns its argument as a literal String value. This is useful in order to treat a string or a number
at the beginning of an Expression as an actual value, rather than treating it as an attribute name. Additionally, it
can be used when the argument is an embedded Expression that we would then like to evaluate additional functions against.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>value</em></span> : <span class="argDesc">The value to be treated as a literal string, number, or boolean value.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${literal(2):gt(1)}</code> returns <code>true</code></p>
</div>
<div class="paragraph">
<p><code>${literal( ${allMatchingAttributes('a.*'):count()} ):gt(3)}</code> returns true if there are more than 3 attributes whose
names begin with the letter <code>a</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="getstatevalue"><a class="anchor" href="expression-language-guide.html#getstatevalue"></a>getStateValue</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Access a processor&#8217;s state values by passing in the String key and getting the value back as a String. This
is a special Expression Language function that only works with processors that explicitly allow EL to query state. Currently only UpdateAttribute
does.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="String"><em>Key</em></span> : <span class="argDesc">The key to use when accessing the state map.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: UpdateAttribute processor has stored the key "count" with value "20" in state. '${getStateValue("count")}` returns <code>20</code>.</p>
</div>
</div>
<div class="sect2 function">
<h3 id="thread"><a class="anchor" href="expression-language-guide.html#thread"></a>thread</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Returns the name of the thread used by the processor when evaluating the Expression. This can be useful
when using a processor with multiple concurrent tasks and where some data uniqueness is required.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: <code>${thread()}</code> could return something like <code>Timer-Driven Process Thread-4</code>.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="multi"><a class="anchor" href="expression-language-guide.html#multi"></a>Evaluating Multiple Attributes</h2>
<div class="sectionbody">
<div class="paragraph">
<p>When it becomes necessary to evaluate the same conditions against multiple attributes, this can be accomplished by means of the
<code>and</code> and <code>or</code> functions. However, this quickly becomes tedious, error-prone, and difficult to maintain. For this reason, NiFi
provides several functions for evaluating the same conditions against groups of attributes at the same time.</p>
</div>
<div class="sect2 function">
<h3 id="anyattribute"><a class="anchor" href="expression-language-guide.html#anyattribute"></a>anyAttribute</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Checks to see if any of the given attributes, match the given condition. This function has no subject and takes one or more
arguments that are the names of attributes to which the remainder of the Expression is to be applied. If any of the attributes specified,
when evaluated against the rest of the Expression, returns a value of <code>true</code>, then this function will return <code>true</code>. Otherwise, this function
will return <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Attribute Names</em></span> : <span class="argDesc">One or more attribute names to evaluate</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: Given that the "abc" attribute contains the value "hello world", "xyz" contains "good bye world",
and "filename" contains "file.txt" consider the following examples:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 30. anyAttribute Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${anyAttribute("abc", "xyz"):contains("bye")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${anyAttribute("filename","xyz"):toUpper():contains("e")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="allattributes"><a class="anchor" href="expression-language-guide.html#allattributes"></a>allAttributes</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Checks to see if all of the given attributes match the given condition. This function has no subject and takes one or more
arguments that are the names of attributes to which the remainder of the Expression is to be applied. If all of the attributes specified,
when evaluated against the rest of the Expression, returns a value of <code>true</code>, then this function will return <code>true</code>. Otherwise, this function
will return <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Attribute Names</em></span> : <span class="argDesc">One or more attribute names to evaluate</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: Given that the "abc" attribute contains the value "hello world", "xyz" contains "good bye world",
and "filename" contains "file.txt" consider the following examples:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 31. allAttributes Example</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allAttributes("abc", "xyz"):contains("world")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allAttributes("abc", "filename","xyz"):toUpper():contains("e")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="anymatchingattribute"><a class="anchor" href="expression-language-guide.html#anymatchingattribute"></a>anyMatchingAttribute</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Checks to see if any of the given attributes, match the given condition. This function has no subject and takes one or more
arguments that are Regular Expressions to match against attribute names. Any attribute whose name matches one of the supplied
Regular Expressions will be evaluated against the rest of the Expression. If any of the attributes specified,
when evaluated against the rest of the Expression, returns a value of <code>true</code>, then this function will return <code>true</code>. Otherwise, this function
will return <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Regex</em></span> : <span class="argDesc">One or more Regular Expressions (in the Java Pattern syntax) to evaluate against attribute names</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: Given that the "abc" attribute contains the value "hello world", "xyz" contains "good bye world",
and "filename" contains "file.txt" consider the following examples:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 32. anyMatchingAttribute Example</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${anyMatchingAttribute("[ax].*"):contains('bye')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${anyMatchingAttribute(".*"):isNull()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="allmatchingattributes"><a class="anchor" href="expression-language-guide.html#allmatchingattributes"></a>allMatchingAttributes</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Checks to see if any of the given attributes, match the given condition. This function has no subject and takes one or more
arguments that are Regular Expressions to match against attribute names. Any attribute whose name matches one of the supplied
Regular Expressions will be evaluated against the rest of the Expression. If all of the attributes specified,
when evaluated against the rest of the Expression, return a value of <code>true</code>, then this function will return <code>true</code>. Otherwise, this function
will return <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Regex</em></span> : <span class="argDesc">One or more Regular Expressions (in the Java Pattern syntax) to evaluate against attribute names</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: Given that the "abc" attribute contains the value "hello world", "xyz" contains "good bye world",
and "filename" contains "file.txt" consider the following examples:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 33. anyMatchingAttributes Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allMatchingAttributes("[ax].*"):contains("world")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allMatchingAttributes(".*"):isNull()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allMatchingAttributes("f.*"):count()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="anydelineatedvalue"><a class="anchor" href="expression-language-guide.html#anydelineatedvalue"></a>anyDelineatedValue</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Splits a String apart according to a delimiter that is provided, and then evaluates each of the values against
the rest of the Expression. If the Expression, when evaluated against any of the individual values, returns <code>true</code>, this
function returns <code>true</code>. Otherwise, the function returns <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Delineated Value</em></span> : <span class="argDesc">The value that is delineated. This is generally an embedded Expression,
though it does not have to be.</span></p>
</li>
<li>
<p><span class="argName"><em>Delimiter</em></span> : <span class="argDesc">The value to use to split apart the <em>delineatedValue</em> argument.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: Given that the "number_list" attribute contains the value "1,2,3,4,5", and the "word_list" attribute contains the value "the,and,or,not",
consider the following examples:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 34. anyDelineatedValue Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${anyDelineatedValue("${number_list}", ","):contains("5")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${anyDelineatedValue("this that and", ","):equals("${word_list}")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="alldelineatedvalues"><a class="anchor" href="expression-language-guide.html#alldelineatedvalues"></a>allDelineatedValues</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Splits a String apart according to a delimiter that is provided, and then evaluates each of the values against
the rest of the Expression. If the Expression, when evaluated against all of the individual values, returns <code>true</code> in each
case, then this function returns <code>true</code>. Otherwise, the function returns <code>false</code>.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subjectless">No Subject</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Delineated Value</em></span> : <span class="argDesc">The value that is delineated. This is generally
an embedded Expression, though it does not have to be.</span></p>
</li>
<li>
<p><span class="argName"><em>Delimiter</em></span> : <span class="argDesc">The value to use to split apart the <em>delineatedValue</em> argument.</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Boolean</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: Given that the "number_list" attribute contains the value "1,2,3,4,5", and the "word_list" attribute contains the value "those,known,or,not",
consider the following examples:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 35. allDelineatedValues Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allDelineatedValues("${word_list}", ","):contains("o")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allDelineatedValues("${number_list}", ","):count()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>5</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allDelineatedValues("${number_list}", ","):matches("[0-9]+")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allDelineatedValues("${word_list}", ","):matches('e')}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="join"><a class="anchor" href="expression-language-guide.html#join"></a>join</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Aggregate function that concatenates multiple values with the specified delimiter. This function
may be used only in conjunction with the <code>allAttributes</code>, <code>allMatchingAttributes</code>, and <code>allDelineatedValues</code>
functions.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">String</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><span class="argName"><em>Delimiter</em></span> : <span class="argDesc">The String delimiter to use when joining values</span></p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">String</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: Given that the "abc" attribute contains the value "hello world", "xyz" contains "good bye world",
and "filename" contains "file.txt" consider the following examples:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 36. join Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allMatchingAttributes("[ax].*"):substringBefore(" "):join("-")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>hello-good</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allAttributes("abc", "xyz"):join(" now")}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>hello world nowgood bye world now</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2 function">
<h3 id="count"><a class="anchor" href="expression-language-guide.html#count"></a>count</h3>
<div class="paragraph">
<p><strong>Description</strong>: <span class="description">Aggregate function that counts the number of non-null, non-false values returned by the
<code>allAttributes</code>, <code>allMatchingAttributes</code>, and <code>allDelineatedValues</code>. This function
may be used only in conjunction with the <code>allAttributes</code>, <code>allMatchingAttributes</code>, and <code>allDelineatedValues</code>
functions.</span></p>
</div>
<div class="paragraph">
<p><strong>Subject Type</strong>: <span class="subject">Any</span></p>
</div>
<div class="paragraph">
<p><strong>Arguments</strong>: No arguments</p>
</div>
<div class="paragraph">
<p><strong>Return Type</strong>: <span class="returnType">Number</span></p>
</div>
<div class="paragraph">
<p><strong>Examples</strong>: Given that the "abc" attribute contains the value "hello world", "xyz" contains "good bye world",
and "number_list" contains "1,2,3,4,5" consider the following examples:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 37. count Examples</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Expression</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Value</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allMatchingAttributes("[ax].*"):substringBefore(" "):count()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allAttributes("abc", "xyz"):contains("world"):count()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allDelineatedValues(${number_list}, ","):count()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>5</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allAttributes("abc", "non-existent-attr", "xyz"):count()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>${allMatchingAttributes(".*"):length():gt(10):count()}</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2</code></p></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2022-12-05 18:19:00 -0600
</div>
</div>
</body>
</html>