/**
* An infix notation based language for event filters. At a higher level, one creates an expression made out of multiple
* "predicate"s chained together using the AND and OR operators.
* <h3>Predicate</h3> A predicate by definition is an expression that results in a boolean value. There are multiple
* predicates available in the language which are described below. On top of these predicates one can also use
* comparison functions, described below, which results in a boolean value.
* <h6>Between Predicate: </h6> A between predicate checks whether a value is between a lower and upper bound.
* <br/><i>Example: "xpath("//a/b/c") between (100,150)". Here xpath() is a function which is described below.</i>
* <b>This is only supported for numeric inputs.</b>
* <h6>In Predicate: </h6> An in predicate checks whether a value is in a list of values provided to the function.
* <b>This is supported for alphanumeric inputs.</b>
* <br/><i>Example: "xpath("//a/b/c") in ("x", "y", "z")". Here xpath() is a function which is described below.</i>
* <h6>Null Predicate: </h6> A null predicate checks whether the passed value is null.
* <br/><i>Example: "xpath("//a/b/c") is null". Here xpath() is a function which is described below.</i>
* <h6>Regex Predicate: </h6> A null predicate checks whether the passed value matches a provided regex.
* <br/><i>Example: "xpath("//a/b/c") =~ "<a regex>"". Here xpath() is a function which is described below.</i>
* <h6>Exists Predicate: </h6> A null predicate checks whether the passed value matches a provided regex.
* <br/><i>Example: "xpath("//a/b/c") =~ "<a regex>"". Here xpath() is a function which is described below.</i>
*
* <h6>Comparison Functions</h6> This language currently supports the following comparison functions:
* <ul>
* <li>Equals: <br/><i>Example: "xpath("//a/b/c") = "xyz". Here xpath() is a function which is described below.</i></li>
* <li>Not Equals: <br/><i>Example: "xpath("//a/b/c") != "xyz". Here xpath() is a function which is described below.</i></li>
* <li>Greater than<br/><i>Example: "xpath("//a/b/c") > "xyz". Here xpath() is a function which is described below.</i></li>
* <li>Greater than or equals<br/><i>Example: "xpath("//a/b/c") >= "xyz". Here xpath() is a function which is described below.</i></li>
* <li>Lesser than<br/><i>Example: "xpath("//a/b/c") < "xyz". Here xpath() is a function which is described below.</i></li>
* <li>Lesser than or equals<br/><i>Example: "xpath("//a/b/c") <= "xyz". Here xpath() is a function which is described below.</i></li>
* </ul>
* <b>All the above comparison functions are available only for numeric inputs.</b>
*
* <h6>XPath function</h6> This primarily is the only function that fetches runtime values in the filters. The XPath
* will be run on the event object for which the filter is applied. For details about the evaluation and support
* <a href="http://commons.apache.org/jxpath/">see this</a>
*
* <h6>Other value functions</h6> We also have certain functions that helps convert values in specific formats. These
* functions are listed below:
* <ul>
<li>Time millis: Converts milliseconds since epoch to a date-time string. The format of date-time pattern is as
specified <a href="http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html">here</a>
<br/><i>Example: "xpath("//a/b/c") = time-millis("yyyy-MM-dd'T'HH:mm:ss:SSS", "2012-08-22T10:14:44:856") . Here xpath() is a function which is described above.</i></li>
<li>Time string: Converts a stringified time from one format to another. The format of date-time pattern is as
specified <a href="http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html">here</a>
<br/><i>Example: "xpath("//a/b/c") = time-string("yyyy-MM-dd'T'hh:mm:ss:SSS","yyyy-MM-dd'T'HH:mm:ss:SSS", "2012-08-22T10:14:44:856") .
<br/>Here xpath() is a function which is described above.
<br/> First format argument is the target format.</i></li>
<br/> Seconds format argument is the input source format.</i></li>
</ul>
*/
package com.netflix.eventbus.filter.lang.infix;