TXT Grammar (work in progress)
In order to analyze the language extension and its relation with CQL we make this grammar using EBNF conventions.
h5. Search conditions <sequence of search conditions> ::= <search condition> |<sequence of search conditions> <semicolon> <search condition> <search condition> ::= <boolean value expression>
Boolean Predicate
<boolean value expression> ::= <boolean term> | <boolean value expression> OR <boolean term> <boolean term> ::= <boolean factor> | <boolean term> "AND" <boolean factor> <boolean factor> ::= [ "NOT" ] <boolean primary>
Boolean Primary Predicates
<boolean primary> ::= <predicate> | <left parent> <search condition> <right parent> | <left bracket> <search condition> <right bracket>
<predicate> ::= <comparison predicate> | <like text predicate> | <like geom predicate> | <null predicate> | <temporal predicate> | <classification predicate> [1] | <existence_predicate> | <between predicate> | <id predicate> | <geometry predicate>
Temporal Predicate
<temporal predicate> ::= <attribute_name> "BEFORE" <date-time expression> | <attribute_name> "BEFORE" "OR" "DURING" <period> | <attribute_name> "DURING" <period> | <attribute_name> "DURING" "OR" "AFTER" <period> | <attribute_name> "AFTER" <date-time expression> <date-time expression ::= <date-time> | <period>
Existence Predicate
<existence_predicate> := <attribute_name> "EXISTS" | <attribute_name> "DOES-NOT-EXIST"
Comparison Predicate
<comparison predicate> ::= <expression> <comp op> <expression> <comp op> ::= <equals operator> | <not equals operator> | <less than operator> | <greater than operator> | <less than or equals operator> | <greater than or equals operator>
Like Predicate
<like text predicate> ::= <expression> [ "NOT" ] "LIKE" <character pattern> <character pattern> ::= <character string literal> (* pattern examples : attribute like '%contains_this%' attribute like 'begins_with_this%' attribute like '%ends_with_this' attribute like 'd_ve' will match 'dave' or 'dove' attribute not like '%will_not_contain_this%' attribute not like 'will_not_begin_with_this%' attribute not like '%will_not_end_with_this' *) <like geom predicate> ::= <relate> [ "NOT" ] "LIKE" <relate pattern> <relate pattern> ::= <quote> <relate flag><relate flag><relate flag><relate flag> <relate flag><relate flag><relate flag><relate flag> <quote> <relate flag> ::= "T" | "F" | "*"
Null Predicate
<null predicate> ::= <expression> "IS" [ "NOT" ] "NULL"
Between Predicate
<between predicate> ::= <expression> [ "NOT" ] "BETWEEN" <expression> "AND" <expression>
ID Predicate
<id predicate> ::= "ID" [ "NOT" ] "IN" <id> {"," <id> } <id> ::= ...(TODO)
IN Predicate
<in predicate> ::= <attribute-name> [ "NOT" ] "IN" <in predicate value> <in predicate value> ::= "(" <in value list> ")" <in value list> ::= <expression> {"," <expression>}
Expression
<expression> ::= <term> { <addition operator> <term> } <addition operator>::= <plus sign> | <minus sign> <term> ::= <factor> { <multiplication operator> <factor> } <multiplication operator> ::= <asterisk> | <solidus> <factor> ::= <function> | <literal> | <attribute> | ( <expression> ) | [ <expression> ] <literal> ::= <signed numeric literal>| <general literal> <signed numeric literal> ::= [ <sign> ] <unsigned numeric literal> <general literal> ::= <character string literal> | <datetime literal> | <boolean literal> | <geography literal <boolean literal> ::= "TRUE" | "FALSE" | "UNKNOWN"
Geometry Predicate
<geometry predicate> ::= <geoop name><georoutine argument list> | <relgeoop name><relgeoop argument list> | BBOX <bbox argument list> <geoop name> ::= "EQUAL" | "DISJOINT" | "INTERSECT" | "TOUCH" | "CROSS" | "WITHIN" | "CONTAINS" | "OVERLAP" | "RELATE" <georoutine argument list> ::= <expression> | <geometry literal> <relgeoop name> ::= "DWITHIN" | "BEYOND" <relgeoop argument list> ::= <expression> <tolerance> | <geometry literal> <tolerance> bbox argument list> ::= "(" <attribute>"," <min X>"," <min Y>"," <max X>"," <max Y> ["," <crs>] ")" | "(" <expression>"," <min X>"," <min Y>"," <max X>"," <max Y> ["," <crs>] ")" | "(" <expression>, <expression> ")" <min X> ::= <signed numerical literal> <min Y> ::= <signed numerical literal> <max X> ::= <signed numerical literal> <max Y> ::= <signed numerical literal> <crs> ::= ... (* default: EPSG:4326. *) <tolerance> ::=<unsigned numeric literal><comma><distance units> <distance units> ::= = "feet" | "meters" | "statute miles" | "nautical miles" | "kilometers"
Geometry Literal
<geometry literal> := <Point Tagged Text> | <LineString Tagged Text> | <Polygon Tagged Text> | <MultiPoint Tagged Text> | <MultiLineString Tagged Text> | <MultiPolygon Tagged Text> | <GeometryCollection Tagged Text> | <Envelope Tagged Text> <Point Tagged Text> ::= POINT <Point Text> <LineString Tagged Text> ::= LINESTRING <LineString Text> <Polygon Tagged Text> ::= POLYGON <Polygon Text> <MultiPoint Tagged Text> ::= MULTIPOINT <Multipoint Text> <MultiLineString Tagged Text> ::= MULTILINESTRING <MultiLineString Text> <MultiPolygon Tagged Text> ::= MULTIPOLYGON <MultiPolygon Text> <GeometryCollection Tagged Text> ::=GEOMETRYCOLLECTION <GeometryCollection Text> <Point Text> := EMPTY | <left paren> <Point> <right paren> <Point> := <x><space><y> <x> := numeric literal <y> := numeric literal <LineString Text> := EMPTY | <left paren> <Point> \{<comma><Point >\}...<right paren> <Polygon Text> := EMPTY | <left paren><LineString Text>\{<comma><LineString Text> \}...<right paren> <Multipoint Text> := EMPTY | <left paren><Point Text>\{<comma><Point Text >\}...<right paren> <MultiLineString Text> := EMPTY | <left paren><LineString Text>\{<comma><LineString Text>\}...<right paren> <MultiPolygon Text> := EMPTY | <left paren><Polygon Text>\{<comma><Polygon Text>\}...<right paren> <GeometryCollection Text> := EMPTY | <left paren><Geometry Tagged Text>\{<comma><Geometry Tagged Text>\}...<right paren> <Envelope Tagged Text> ::= ENVELOPE <Envelope Text> <Envelope Text> ::= EMPTY | <left paren><WestBoundLongitude><comma> <EastBoundLongitude><comma> <NorthBoundLatitude><comma> <SouthBoundLatitude>< <right paren> <WestBoundLongitude> ::= <numeric literal> <EastBoundLongitude> ::= <numeric literal> <NorthBoundLatitude> ::= <numeric literal> <SouthBoundLatitude> ::= <numeric literal>
<date-time> ::= <full-date> T <UTC-time> <full_date> ::= <date-year> <date-month> <date-day> <date-year> ::= <digit><digit><digit><digit> <date-month> ::= <digit><digit> <date-day> ::= <digit><digit> <UTC-time> ::= <time-hour> : <time-minute> : <time-second> Z <time-hour> ::= <digit><digit> <time-minute> ::= <digit><digit> <time-second> ::= <digit><digit>[.<digit>...] <duration> ::= P <dur-date> | T<dur-time> <dur-date> ::= <dur-day> | <dur-month> | <dur-year> [<dur-time>] <dur-day> ::= <digit>... D <dur-month> ::= <digit>... M [<dur-day>] <dur-year> ::= <didit>... Y [<dur-month>] <dur-time> ::= <dir-hour> | <dur-minute> | <dur-second> <dur-hour> ::= <digit>... H [<dur-minute>] <dur-minute> ::= <digit>... M [<dur-second>] <dur-second> ::= <digit>... S <period> ::= <date-time> / <date-time> | <date-time> / <duration> | <duration> / <date-time>