You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by sk...@apache.org on 2013/12/02 14:36:29 UTC
git commit: [OLINGO-63] Improve-Lexer-Modes
Updated Branches:
refs/heads/master 5e10653b1 -> 2e622040d
[OLINGO-63] Improve-Lexer-Modes
Project: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/commit/2e622040
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/tree/2e622040
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/diff/2e622040
Branch: refs/heads/master
Commit: 2e622040d1f2d1686df06c3449a4403cf4c23278
Parents: 5e10653
Author: Sven Kobler <sv...@sap.com>
Authored: Mon Dec 2 10:54:53 2013 +0100
Committer: Stephan Klevenz <st...@sap.com>
Committed: Mon Dec 2 14:35:39 2013 +0100
----------------------------------------------------------------------
.../commons/api/edm/EdmEntityContainer.java | 3 +-
.../edm/provider/EdmEntityContainerImpl.java | 5 -
.../olingo/producer/core/uri/antlr/UriLexer.g4 | 427 +++++++------------
.../olingo/producer/core/uri/antlr/UriParser.g4 | 121 +++---
.../olingo/producer/core/uri/UriParserImpl.java | 2 +-
.../olingo/producer/core/testutil/EdmMock.java | 13 +-
.../producer/core/testutil/ParserValidator.java | 269 +++++++-----
.../producer/core/testutil/TokenWriter.java | 14 +-
.../producer/core/uri/antlr/TestLexer.java | 14 +-
.../producer/core/uri/antlr/TestParser.java | 340 +++++++--------
10 files changed, 565 insertions(+), 643 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/2e622040/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmEntityContainer.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmEntityContainer.java b/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmEntityContainer.java
index 5bd1bb2..a522d45 100644
--- a/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmEntityContainer.java
+++ b/odata4-lib/odata4-commons-api/src/main/java/org/apache/olingo/commons/api/edm/EdmEntityContainer.java
@@ -57,6 +57,5 @@ public interface EdmEntityContainer extends EdmNamed {
* @return {@link EdmFunctionImport}
*/
EdmFunctionImport getFunctionImport(String name);
-
- EdmNamed getElement(String odataIdentifier);
+
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/2e622040/odata4-lib/odata4-commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java b/odata4-lib/odata4-commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
index 24a3d46..2777a8b 100644
--- a/odata4-lib/odata4-commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
+++ b/odata4-lib/odata4-commons-core/src/main/java/org/apache/olingo/commons/core/edm/provider/EdmEntityContainerImpl.java
@@ -126,9 +126,4 @@ public class EdmEntityContainerImpl extends EdmNamedImpl implements EdmEntityCon
return functionImport;
}
- @Override
- public EdmNamed getElement(final String odataIdentifier) {
- return null;
- }
-
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/2e622040/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/producer/core/uri/antlr/UriLexer.g4
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/producer/core/uri/antlr/UriLexer.g4 b/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/producer/core/uri/antlr/UriLexer.g4
index 50d6f9d..295936b 100644
--- a/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/producer/core/uri/antlr/UriLexer.g4
+++ b/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/producer/core/uri/antlr/UriLexer.g4
@@ -18,26 +18,32 @@
******************************************************************************/
lexer grammar UriLexer;
-
//;==============================================================================
// Mode "DEFAULT_MODE": Processes everything bevor the first '?' char
// On '?' the next mode "MODE_QUERY" is used
// The percent encoding rules a defined in RFC3986 ABNF rule "path-rootless" apply
//;==============================================================================
-QM : '?' -> pushMode(MODE_QUERY);
+QM : '?' -> pushMode(MODE_QUERY); //first query parameter
+AMP : '&' -> pushMode(MODE_QUERY); //more query parameters
STRING : '\'' -> more, pushMode(MODE_ODATA_STRING);
+GEOGRAPHY : G E O G R A P H Y SQUOTE -> pushMode(MODE_ODATA_GEO); //TODO make case insensitive
+GEOMETRY : G E O M E T R Y SQUOTE -> pushMode(MODE_ODATA_GEO);
+
+//Letters for case insensitivity
fragment A : 'A'|'a';
fragment B : 'B'|'b';
fragment D : 'D'|'d';
fragment E : 'E'|'e';
fragment F : 'F'|'f';
fragment G : 'G'|'g';
+fragment H : 'H'|'h';
fragment I : 'I'|'i';
fragment L : 'L'|'l';
fragment M : 'M'|'m';
fragment N : 'N'|'n';
fragment O : 'O'|'o';
+fragment P : 'P'|'p';
fragment R : 'R'|'r';
fragment S : 'S'|'s';
fragment T : 'T'|'t';
@@ -45,6 +51,24 @@ fragment U : 'U'|'u';
fragment Y : 'Y'|'y';
fragment Z : 'Z'|'z';
+//special chars
+OPEN : '(' | '%28';
+CLOSE : ')' | '%29';
+COMMA : ',' | '%2C';
+SLASH : '/';
+POINT : '.';
+AT : '@';
+EQ : '=' ;
+STAR : '*';
+SEMI : ';';
+FRAGMENT : '#';
+
+EQ_sq : '=' -> type(EQ);
+AMP_sq : '&' -> type(AMP), popMode;
+fragment WS : ( ' ' | '%09' | '%20' | '%09' );
+WSP : WS+;
+
+//alpha stuff
fragment ALPHA : 'a'..'z' | 'A'..'Z';
fragment ALPHA_A_TO_F : 'a'..'f' | 'A'..'F';
fragment DIGIT : '0'..'9';
@@ -53,7 +77,18 @@ fragment HEXDIG : DIGIT | ALPHA_A_TO_F;
fragment ODI_LEADINGCHARACTER : ALPHA | '_'; //TODO; add Unicode characters from the categories L or Nl
fragment ODI_CHARACTER : ALPHA | '_' | DIGIT; //TODO; add Unicode characters from the categories L, Nl, Nd, Mn, Mc, Pc, or Cf
+//helper for date/time values
+fragment ONE_TO_NINE : '1'..'9';
+fragment ZERO_TO_FIFTYNINE : ('0'..'5') DIGIT;
+fragment FRACTIONALSECONDS : DIGIT+;
+fragment SECOND : ZERO_TO_FIFTYNINE;
+fragment MINUTE : ZERO_TO_FIFTYNINE;
+fragment HOUR : ('0' | '1') DIGIT | '2' ( '0'..'3');
+fragment DAY : '0' '1'..'9' | ('1'|'2') DIGIT | '3' ('0'|'1');
+fragment MONTH : '0' ONE_TO_NINE | '1' ( '0' | '1' | '2' );
+fragment YEAR : ('-')? ( '0' DIGIT DIGIT DIGIT | ONE_TO_NINE DIGIT DIGIT DIGIT );
+//tag start with $
BATCH : '$batch';
ENTITY : '$entity';
METADATA : '$metadata';
@@ -65,37 +100,29 @@ VALUE : '$value';
REF : '$ref';
COUNT : '$count';
-NULLVALUE : 'null';
+//inlined query parameters ( e.g. $skip)
+SKIP_INLINE : '$skip';
+FILTER_INLINE : '$filter';
+ORDERBY_INLINE: '$orderby';
+SEARCH_INLINE : '$search'-> pushMode(MODE_SYSTEM_QUERY_SEARCH);
+
-OPEN : '(' | '%28';
-CLOSE : ')' | '%29';
-COMMA : ',' | '%2 SLASH_sqpC';
-SLASH : '/';
-POINT : '.';
-AT : '@';
-EQ : '=' ;
+//rest
+NULLVALUE : 'null';
+
+TRUE : 'true';
+FALSE : 'false';
BOOLEAN : T R U E | F A L S E;
-SIGN : '+' | '%2B' |'-';
+PLUS : '+';
+SIGN : PLUS | '%2B' |'-';
INT : SIGN? DIGITS;
DECIMAL : INT '.' DIGITS ('e' SIGN? DIGITS)?;
//primary types
-BINARY : ('X'| B I N A R Y) SQUOTE (HEXDIG HEXDIG)* SQUOTE; //TODO remove 'x' here and in unit tests
-
-fragment ONE_TO_NINE : '1'..'9';
-fragment ZERO_TO_FIFTYNINE : ('0'..'5') DIGIT;
-fragment FRACTIONALSECONDS : DIGIT+;
-fragment SECOND : ZERO_TO_FIFTYNINE;
-fragment MINUTE : ZERO_TO_FIFTYNINE;
-fragment HOUR : ('0' | '1') DIGIT | '2' ( '0'..'3');
-fragment DAY : '0' '1'..'9' | ('1'|'2') DIGIT | '3' ('0'|'1');
-fragment MONTH : '0' ONE_TO_NINE | '1' ( '0' | '1' | '2' );
-fragment YEAR : ('-')? ( '0' DIGIT DIGIT DIGIT | ONE_TO_NINE DIGIT DIGIT DIGIT );
-
+BINARY : B I N A R Y SQUOTE (HEXDIG HEXDIG)* SQUOTE;
DATE : D A T E SQUOTE YEAR '-' MONTH '-' DAY SQUOTE;
DATETIMEOFFSET : D A T E T I M E O F F S E T SQUOTE YEAR '-' MONTH '-' DAY T HOUR ':' MINUTE ( ':' SECOND ( '.' FRACTIONALSECONDS )? )? ( Z | SIGN HOUR ':' MINUTE ) SQUOTE;
-
fragment DUSECONDFRAG : DIGITS ('.' DIGITS)? 'S';
fragment DUTIMEFRAG : 'T' (
( DIGITS 'H' (DIGITS 'M')? DUSECONDFRAG?)
@@ -105,7 +132,6 @@ fragment DUTIMEFRAG : 'T' (
fragment DUDAYTIMEFRAG : DIGITS 'D' DUTIMEFRAG? | DUTIMEFRAG;
DURATION : D U R A T I O N SQUOTE '-'? 'P' DUDAYTIMEFRAG SQUOTE;
TIMEOFDAY : T I M E O F D A Y SQUOTE HOUR ':' MINUTE ( ':' SECOND ( '.' FRACTIONALSECONDS )? )? SQUOTE;
-
fragment GUIDVALUE : HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG'-'
HEXDIG HEXDIG HEXDIG HEXDIG '-'
HEXDIG HEXDIG HEXDIG HEXDIG '-'
@@ -113,9 +139,86 @@ fragment GUIDVALUE : HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG H
HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG;
GUID : G U I D SQUOTE GUIDVALUE SQUOTE;
-ODATAIDENTIFIER : ODI_LEADINGCHARACTER (ODI_CHARACTER)*;
+//expression tokens
+ASC : 'asc';
+DESC : 'desc';
+MUL : 'mul';
+DIV : 'div';
+MOD : 'mod';
+ADD : 'add';
+SUB : 'sub';
+GT : 'gt';
+GE : 'ge';
+LT : 'lt';
+LE : 'le';
+EQ_ALPHA : 'eq';
+NE : 'ne';
+AND : 'and';
+OR : 'or';
+ISOF : 'isof';
+NOT : 'not';
+MINUS :'-';
+ROOT : '$root/';
+NANINFINITY : 'NaN' | '-INF' | 'INF';
+
+IMPLICIT_VARIABLE_EXPR : '$it';
+LEVELS : '$levels';
+
+CONTAINS_WORD : 'contains(';
+STARTSWITH_WORD : 'startswith(';
+ENDSWITH_WORD : 'endswith(';
+LENGTH_WORD : 'length(';
+INDEXOF_WORD : 'indexof(';
+SUBSTRING_WORD : 'substring(';
+TOLOWER_WORD : 'tolower(';
+TOUPPER_WORD : 'toupper(';
+TRIM_WORD : 'trim(';
+CONCAT_WORD : 'concat(';
+YEAR_WORD : 'year(';
+MONTH_WORD : 'month(';
+DAY_WORD : 'day(';
+HOUR_WORD : 'hour(';
+MINUTE_WORD : 'minute(';
+SECOND_WORD : 'second(';
+FRACTIONALSECONDS_WORD : 'fractionalseconds(';
+TOTALSECONDS_WORD : 'totalseconds(';
+DATE_WORD : 'date(';
+TIME_WORD : 'time(';
+TOTALOFFSETMINUTES_WORD : 'totaloffsetminutes(';
+
+MINDATETIME_WORD : 'mindatetime(';
+MAXDATETIME_WORD : 'maxdatetime(';
+NOW_WORD : 'now(';
+
+ROUND_WORD : 'round(';
+FLOOR_WORD : 'floor(';
+CEILING_WORD : 'ceiling(';
+
+GEO_DISTANCE_WORD : 'geo.distance(';
+GEO_LENGTH_WORD : 'geo.length(';
+GEO_INTERSECTS_WORD : 'geo.intersects(';
+ISOF_WORD : 'isof(';
+CAST_WORD : 'cast(';
+
+COLLECTION_REF : 'Collection($ref)';
+COLLECTION_ENTITY_TYPE : 'Collection(Edm.EntityType)';
+COLLECTION_COMPLEX_TYPE : 'Collection(Edm.ComplexType)';
+COLLECTION : 'Collection(' -> type(COLLECTION);
+
+//used in fragment only
+DELETED_ENTITY : '$deletedEntity';
+LINK : '$link';
+DELETED_LINK : '$deletedLink';
+DELTA : '$delta';
+//ENTITY_IN_FRAGMENT : '/$entity';
+
+
+LEVELSMAX : '$levels=max';
+//ODI
+ODATAIDENTIFIER : ODI_LEADINGCHARACTER (ODI_CHARACTER)*;
+
//;==============================================================================
// Mode "QUERY": Processes everything between the first '?' and the '#' char
// On '?' the next mode "FRAGMENT" is used
@@ -123,56 +226,31 @@ ODATAIDENTIFIER : ODI_LEADINGCHARACTER (ODI_CHARACTER)*;
mode MODE_QUERY;
//;==============================================================================
-FRAGMENT : '#' -> pushMode(MODE_FRAGMENT);
-FILTER : '$filter' -> pushMode(MODE_SYSTEM_QUERY);
-ORDERBY : '$orderby' -> pushMode(MODE_SYSTEM_QUERY);
-EXPAND : '$expand' -> pushMode(MODE_SYSTEM_QUERY);
-SELECT : '$select' -> pushMode(MODE_SYSTEM_QUERY);
-SKIP : '$skip' -> pushMode(MODE_SYSTEM_QUERY);
-TOP : '$top' -> pushMode(MODE_SYSTEM_QUERY);
-LEVELS : '$levels' -> pushMode(MODE_SYSTEM_QUERY);
+FRAGMENT_q : '#' -> type(FRAGMENT);
+FILTER : '$filter' -> pushMode(DEFAULT_MODE);
+ORDERBY : '$orderby' -> pushMode(DEFAULT_MODE);
+EXPAND : '$expand' -> pushMode(DEFAULT_MODE);
+SELECT : '$select' -> pushMode(DEFAULT_MODE);
+SKIP : '$skip' -> pushMode(DEFAULT_MODE);
+SKIPTOKEN : '$skiptoken' -> pushMode(MODE_SYSTEM_QUERY_REST_QCHAR_NO_AMP);
+
+TOP : '$top' -> pushMode(DEFAULT_MODE);
+LEVELS_q : '$levels' -> type(LEVELS), pushMode(DEFAULT_MODE);
FORMAT : '$format' -> pushMode(MODE_SYSTEM_QUERY_PCHAR);
-COUNT_q : '$count' -> type(COUNT), pushMode(MODE_SYSTEM_QUERY);
+COUNT_q : '$count' -> type(COUNT), pushMode(DEFAULT_MODE);
REF_q : '$ref' -> type(REF);
VALUE_q : '$value' -> type(VALUE);
ID : '$id'-> pushMode(MODE_SYSTEM_QUERY_REST_QCHAR_NO_AMP);
-SKIPTOKEN : '$skiptoken' -> pushMode(MODE_SYSTEM_QUERY_REST_QCHAR_NO_AMP);
-SEARCH : '$search'-> pushMode(MODE_SYSTEM_QUERY_SEARCH);
-GEOGRAPHY : G_q E_q O_q G_q R_q A_q P_q H_q Y_q -> pushMode(MODE_ODATA_GEO);//TODO make case insensitive
-GEOMETRY : G_q E_q O_q M_q E_q T_q R_q Y_q -> pushMode(MODE_ODATA_GEO);
-
-fragment A_q : 'A'|'a';
-fragment E_q : 'E'|'e';
-fragment G_q : 'G'|'g';
-fragment H_q : 'H'|'h';
-fragment M_q : 'M'|'m';
-fragment O_q : 'O'|'o';
-fragment P_q : 'P'|'p';
-fragment R_q : 'R'|'r';
-fragment S_q : 'S'|'s';
-fragment T_q : 'T'|'t';
-fragment Y_q : 'Y'|'y';
-
-fragment ALPHA_q : 'a'..'z'|'A'..'Z';
-fragment A_TO_F_q : 'a'..'f'|'A'..'F';
-fragment DIGIT_q : '0'..'9';
-fragment HEXDIG_q : DIGIT_q | A_TO_F_q;
-
-fragment PCT_ENCODED_q : '%' HEXDIG_q HEXDIG_q;
-fragment UNRESERVED_q : ALPHA_q | DIGIT_q | '-' |'.' | '_' | '~';
-fragment OTHER_DELIMS_q : '!' | '(' | ')' | '*' | '+' | ',' | ';';
-fragment QCHAR_NO_AMP_q : UNRESERVED_q | PCT_ENCODED_q | OTHER_DELIMS_q | ':' | '@' | '/' | '?' | '$' | '\'' | '=';
-fragment QCHAR_NO_AMP_EQ_q : UNRESERVED_q | PCT_ENCODED_q | OTHER_DELIMS_q | ':' | '@' | '/' | '?' | '$' | '\'';
-fragment QCHAR_NO_AMP_EQ_AT_DOLLAR_q : UNRESERVED_q | PCT_ENCODED_q | OTHER_DELIMS_q | ':' | '/' | '?' | '\'';
+SEARCH : '$search'-> pushMode(MODE_SYSTEM_QUERY_SEARCH);
EQ_q : '=' -> type(EQ);
-AMP : '&';
+AMP_q : '&' -> type(AMP);
-CUSTOMNAME : QCHAR_NO_AMP_EQ_AT_DOLLAR_q QCHAR_NO_AMP_EQ_q*;
-CUSTOMVALUE : QCHAR_NO_AMP_EQ_q+;
+CUSTOMNAME : ~[&=@$] ~[&=]*;
+CUSTOMVALUE : ~[&=]+;
//;==============================================================================
mode MODE_SYSTEM_QUERY_PCHAR;
@@ -206,6 +284,9 @@ EQ_sqp : '=' -> type(EQ);
mode MODE_SYSTEM_QUERY_REST_QCHAR_NO_AMP;
//;==============================================================================
+AMP_sqr : '&' -> type(AMP), popMode;
+FRAGMENT_sqr : '#' -> popMode;
+/*
fragment ALPHA_sqr : 'a'..'z'|'A'..'Z';
fragment A_TO_F_sqr : 'a'..'f'|'A'..'F';
fragment DIGIT_sqr : '0'..'9';
@@ -215,13 +296,11 @@ fragment UNRESERVED_sqr : ALPHA_sqr | DIGIT_sqr | '-' |'.' | '_' | '~';
fragment OTHER_DELIMS_sqr : '!' | '(' | ')' | '*' | '+' | ',' | ';';
fragment QCHAR_NO_AMP_sqr : UNRESERVED_sqr | PCT_ENCODED_sqr | OTHER_DELIMS_sqr | ':' | '@' | '/' | '?' | '$' | '\'' | '=';
fragment QCHAR_NO_AMP_EQ_sqr : UNRESERVED_sqr | PCT_ENCODED_sqr | OTHER_DELIMS_sqr | ':' | '@' | '/' | '?' | '$' | '\'' ;
+*/
-
-//REST : ~[&#]*;
-AMP_sqr : '&' -> type(AMP), popMode;
EQ_sqr : '=' -> type(EQ);
-FRAGMENT_sqr : '#' -> popMode;
-REST : QCHAR_NO_AMP_EQ_sqr QCHAR_NO_AMP_sqr*;
+REST : ~[&#=] ~[&#]*;
+
//;==============================================================================
@@ -248,207 +327,15 @@ SEARCHPHRASE : QUOTATION_MARK /*QCHAR_NO_AMP_DQUOTE+*/ ~[&"]* QUOTATION_M
//;==============================================================================
-mode MODE_SYSTEM_QUERY;
-//;==============================================================================
-
-fragment SQUOTE_sq : '\'' -> type(SQUOTE);
-
-STRING_sq : SQUOTE_sq -> more, pushMode(MODE_ODATA_STRING);
-GEOGRAPHY_sq : G_sq E_sq O_sq G_sq R_sq A_sq P_sq H_sq Y SQUOTE_sq -> type(GEOGRAPHY), pushMode(MODE_ODATA_GEO); //TODO make case insensitive
-GEOMETRY_sq : G_sq E_sq O_sq M_sq E_sq T_sq R_sq Y_sq SQUOTE_sq -> type(GEOMETRY),pushMode(MODE_ODATA_GEO);
-
-fragment A_sq : 'A'|'a';
-fragment B_sq : 'B'|'b';
-fragment D_sq : 'D'|'d';
-fragment E_sq : 'E'|'e';
-fragment F_sq : 'F'|'f';
-fragment G_sq : 'G'|'g';
-fragment H_sq : 'H'|'h';
-fragment I_sq : 'I'|'i';
-fragment L_sq : 'L'|'l';
-fragment M_sq : 'M'|'m';
-fragment N_sq : 'N'|'n';
-fragment O_sq : 'O'|'o';
-fragment P_sq : 'P'|'p';
-fragment R_sq : 'R'|'r';
-fragment S_sq : 'S'|'s';
-fragment T_sq : 'T'|'t';
-fragment U_sq : 'U'|'u';
-fragment Y_sq : 'Y'|'y';
-fragment Z_sq : 'Z'|'z';
-
-fragment ALPHA_sq : 'a'..'z'|'A'..'Z';
-fragment ALPHA_A_TO_F_sq : 'a'..'f'|'A'..'F';
-fragment DIGIT_sq : '0'..'9';
-fragment DIGITS_sq : DIGIT_sq+;
-fragment HEXDIG_sq : DIGIT_sq | ALPHA_A_TO_F_sq;
-fragment ODI_LEADINGCHARACTER_sq : ALPHA_sq | '_'; //TODO; plus Unicode characters from the categories L or Nl
-fragment ODI_CHARACTER_sq : ALPHA_sq | '_' | DIGIT_sq; //TODO; plus Unicode characters from the categories L, Nl, Nd, Mn, Mc, Pc, or Cf
-fragment WS_sqr : ( SP_g | HTAB_g | '%20' | '%09' );
-
-OPEN_sq : ('(' | '%28') -> type(OPEN);
-CLOSE_sq : (')' | '%29') -> type(CLOSE);
-COMMA_sq : (',' | '%2C') -> type(COMMA);
-SLASH_sq : '/' -> type(SLASH);
-POINT_sq : '.' -> type(POINT);
-AT_sq : '@' -> type(AT);
-STAR : '*';
-SEMI_sq : ';' -> type(SEMI);
-EQ_sq : '=' -> type(EQ);
-AMP_sq : '&' -> type(AMP), popMode;
-
-
-
-WSP_sqr : WS_sqr+ -> type(WSP);
-
-NULLVALUE_sq : 'null' -> type(NULLVALUE);
-TRUE : 'true';
-FALSE : 'false';
-BOOLEAN_sq : (T_sq R_sq U_sq E_sq | F_sq A_sq L_sq S_sq E_sq) -> type(BOOLEAN);
-SIGN_sq : ('+' | '%2B' |'-') -> type(SIGN);
-INT_sq : SIGN_sq? DIGITS_sq -> type(INT);
-DECIMAL_sq : INT_sq '.' DIGITS_sq ('e' SIGN_sq? DIGITS_sq)? -> type(DECIMAL);
-BINARY_sq : ('X'| B_sq I_sq N_sq A_sq R_sq Y_sq) SQUOTE_sq (HEXDIG_sq HEXDIG_sq)* SQUOTE_sq -> type(BINARY);
-
-ASC : 'asc';
-DESC : 'desc';
-MUL : 'mul';
-DIV : 'div';
-MOD : 'mod';
-ADD : 'add';
-SUB : 'sub';
-GT : 'gt';
-GE : 'ge';
-LT : 'lt';
-LE : 'le';
-EQ_ALPHA : 'eq';
-NE : 'ne';
-AND : 'and';
-OR : 'or';
-ISOF : 'isof';
-NOT : 'not';
-MINUS :'-';
-ROOT : '$root/';
-NANINFINITY : 'NaN' | '-INF' | 'INF';
-
-fragment ONE_TO_NINE_sq : '1'..'9';
-fragment ZERO_TO_FIFTYNINE_sq : ('0'..'5') DIGIT_sq;
-fragment FRACTIONALSECONDS_sq : DIGIT_sq+;
-fragment SECOND_sq : ZERO_TO_FIFTYNINE_sq;
-fragment MINUTE_sq : ZERO_TO_FIFTYNINE_sq;
-fragment HOUR_sq : ('0' | '1') DIGIT_sq | '2' ( '0'..'3');
-fragment DAY_sq : '0' '1'..'9' | ('1'|'2') DIGIT_sq | '3' ('0'|'1');
-fragment MONTH_sq : '0' ONE_TO_NINE_sq | '1' ( '0' | '1' | '2' );
-fragment YEAR_sq : ('-')? ( '0' DIGIT_sq DIGIT_sq DIGIT_sq | ONE_TO_NINE DIGIT_sq DIGIT_sq DIGIT_sq );
-
-DATE_sq : D_sq A_sq T_sq E_sq SQUOTE_sq YEAR_sq '-' MONTH_sq '-' DAY_sq SQUOTE_sq -> type(DATE);
-DATETIMEOFFSET_sq : D_sq A_sq T_sq E_sq T_sq I_sq M_sq E_sq O_sq F_sq F_sq S_sq E_sq T_sq SQUOTE_sq YEAR_sq '-' MONTH_sq '-' DAY_sq T_sq HOUR_sq ':' MINUTE_sq ( ':' SECOND_sq ( '.' FRACTIONALSECONDS_sq )? )? ( Z_sq | SIGN_sq HOUR_sq ':' MINUTE_sq ) SQUOTE_sq -> type(DATETIMEOFFSET);
-
-fragment DUSECONDFRAG_sq : DIGITS_sq ('.' DIGITS_sq)? 'S';
-fragment DUTIMEFRAG_sq : 'T' (
- ( DIGITS_sq 'H' (DIGITS_sq 'M')? DUSECONDFRAG_sq?)
- | (DIGITS_sq 'M' DUSECONDFRAG_sq?)
- | DUSECONDFRAG_sq
- );
-fragment DUDAYTIMEFRAG_sq : DIGITS 'D' DUTIMEFRAG? | DUTIMEFRAG;
-
-DURATION_sq : D_sq U_sq R_sq A_sq T_sq I_sq O_sq N_sq SQUOTE_sq '-'? 'P' DUDAYTIMEFRAG_sq SQUOTE_sq -> type(DURATION);
-TIMEOFDAY_sq : T_sq I_sq M_sq E_sq O_sq F_sq D_sq A_sq Y_sq SQUOTE_sq HOUR_sq ':' MINUTE_sq ( ':' SECOND_sq ( '.' FRACTIONALSECONDS_sq )? )? SQUOTE_sq -> type(TIMEOFDAY);
-
-GUID_sq : G_sq U_sq I_sq D_sq SQUOTE_sq GUIDVALUE_sq SQUOTE_sq -> type(GUID);
-fragment GUIDVALUE_sq : HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq'-'
- HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq '-'
- HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq '-'
- HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq '-'
- HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq HEXDIG_sq;
-
-fragment PCT_ENCODED_sq : '%' HEXDIG_sq HEXDIG_sq;
-fragment UNRESERVED_sq : ALPHA_sq | DIGIT_sq | '-' |'.' | '_' | '~';
-fragment OTHER_DELIMS_sq : '!' | '(' | ')' | '*' | '+' | ',' | ';';
-fragment QCHAR_NO_AMP_sq : UNRESERVED_sq | PCT_ENCODED_sq | OTHER_DELIMS_sq | ':' | '@' | '/' | '?' | '$' | '\'' | '=';
-
-
-IMPLICIT_VARIABLE_EXPR : '$it';
-REF_sq : '$ref' -> type(REF);
-LEVELS_sq : '$levels' -> type(LEVELS);
-
-
-CONTAINS_WORD : 'contains(';
-STARTSWITH_WORD : 'startswith(';
-ENDSWITH_WORD : 'endswith(';
-LENGTH_WORD : 'length(';
-INDEXOF_WORD : 'indexof(';
-SUBSTRING_WORD : 'substring(';
-TOLOWER_WORD : 'tolower(';
-TOUPPER_WORD : 'toupper(';
-TRIM_WORD : 'trim(';
-CONCAT_WORD : 'concat(';
-YEAR_WORD : 'year(';
-MONTH_WORD : 'month(';
-DAY_WORD : 'day(';
-HOUR_WORD : 'hour(';
-MINUTE_WORD : 'minute(';
-SECOND_WORD : 'second(';
-FRACTIONALSECONDS_WORD : 'fractionalseconds(';
-TOTALSECONDS_WORD : 'totalseconds(';
-DATE_WORD : 'date(';
-TIME_WORD : 'time(';
-TOTALOFFSETMINUTES_WORD : 'totaloffsetminutes(';
-
-MINDATETIME_WORD : 'mindatetime(';
-MAXDATETIME_WORD : 'maxdatetime(';
-NOW_WORD : 'now(';
-
-ROUND_WORD : 'round(';
-FLOOR_WORD : 'floor(';
-CEILING_WORD : 'ceiling(';
-
-GEO_DISTANCE_WORD : 'geo.distance(';
-GEO_LENGTH_WORD : 'geo.length(';
-GEO_INTERSECTS_WORD : 'geo.intersects(';
-ISOF_WORD : 'isof(';
-CAST_WORD : 'cast(';
-
-
-
-LEVELSMAX : '$levels=max';
-SKIP_sq : '$skip' -> type(SKIP);
-COUNT_sq : '$count' -> type(COUNT);
-FILTER_sq : '$filter' -> type(FILTER);
-SEARCH_sq : '$search' -> type(SEARCH), pushMode(MODE_SYSTEM_QUERY_SEARCH);
-//IRI_IN_QUERY : /*EQ*/ QCHAR_NO_AMP_sq*;
-ODATAIDENTIFIER_sq : ODI_LEADINGCHARACTER_sq (ODI_CHARACTER_sq)* ->type(ODATAIDENTIFIER);
-
-
-
-//;==============================================================================
-// Mode "QUERY": Processes everything after the '#' char
-// The percent encoding rules a defined in RFC3986 ABNF rule "fragment" apply
+mode MODE_ODATA_STRING;
//;==============================================================================
-mode MODE_FRAGMENT;
-TMP_FRAGMENT : 'TMP_FRAGMENT';
-
-//;==============================================================================
-//;==============================================================================
-mode MODE_ODATA_STRING;//2
-
-
-fragment COMMA_s : ',' | '%2C';
-fragment ALPHA_s : 'a'..'z'|'A'..'Z';
-fragment ALPHA_A_TO_F_s : 'a'..'f'|'A'..'F';
-fragment DIGIT_s : '0'..'9';
-fragment HEXDIG_s : DIGIT_s | ALPHA_A_TO_F_s;
-fragment UNRESERVED_s : ALPHA_s | DIGIT_s | '-' |'.' | '_' | '~';
-fragment OTHER_DELIMS_s : '!' | '(' | ')' | '*' | '+' | COMMA_s | ';';
-fragment PCTENCODEDnoSQUOTE_s : '%' ( '0'|'1'|'3'..'9' | ALPHA_A_TO_F_s ) HEXDIG_s | '%' '2' ( '0'..'6'|'8'|'9' | ALPHA_A_TO_F_s );
-fragment PCHARnoSQUOTE_s : UNRESERVED_s| PCTENCODEDnoSQUOTE_s | OTHER_DELIMS_s | '$' | '&' | '=' | ':' | '@';
fragment SQUOTE_s : '\'';
-STRING_s : ('\'\'' | PCHARnoSQUOTE_s )* SQUOTE_s -> type(STRING), popMode;
+STRING_s : ('\'\'' | ~[\u0027] )* SQUOTE_s -> type(STRING), popMode;
//;==============================================================================
-//;==============================================================================
mode MODE_ODATA_GEO;
+//;==============================================================================
fragment C_g : 'c'|'C';
fragment D_g : 'd'|'D';
@@ -469,15 +356,15 @@ fragment Y_g : 'y'|'Y';
fragment SP_g : ' ';//'\u0020'; // a simple space
fragment HTAB_g : '%09';
-fragment WS_g : ( SP_g | HTAB_g | '%20' | '%09' );
+fragment WS_g : ( ' ' | HTAB_g | '%20' | '%09' );
OPEN_g : ('(' | '%28') -> type(OPEN);
CLOSE_g : (')' | '%29') -> type(CLOSE);
COMMA_g : (',' | '%2C') -> type(COMMA);
-WSP : WS_g+;
+WSP_g : WS_g+ -> type(WSP);
POINT_g : '.' -> type(POINT);
AT_g : '@' -> type(AT);
-SEMI : (';' | '%3B');
+SEMI_g : (';' | '%3B') -> type(SEMI);
EQ_g : '=' -> type(EQ);
fragment DIGIT_g : '0'..'9';
@@ -485,7 +372,7 @@ fragment DIGITS_g : DIGIT_g+;
SIGN_g : ('+' | '%2B' |'-') -> type(SIGN);
INT_g : SIGN_g? DIGITS_g -> type(INT);
DECIMAL_g : INT_g '.' DIGITS_g ('e' SIGN_g? DIGITS_g)? -> type(DECIMAL);
-COLLECTION : C_g O_g L_g L_g E_g C_g T_g I_g O_g N_g ;
+COLLECTION_g : C_g O_g L_g L_g E_g C_g T_g I_g O_g N_g -> type(COLLECTION);
LINESTRING : L_g I_g N_g E_g S_g T_g R_g I_g N_g G_g ;
MULTILINESTRING : M_g U_g L_g T_g I_g L_g I_g N_g E_g S_g T_g R_g I_g N_g G_g;
MULTIPOINT : M_g U_g L_g T_g I_g P_g O_g I_g N_g T_g ;
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/2e622040/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/producer/core/uri/antlr/UriParser.g4
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/producer/core/uri/antlr/UriParser.g4 b/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/producer/core/uri/antlr/UriParser.g4
index d4ea9c5..cc2542a 100644
--- a/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/producer/core/uri/antlr/UriParser.g4
+++ b/odata4-lib/odata4-producer-core/src/main/antlr4/org/apache/olingo/producer/core/uri/antlr/UriParser.g4
@@ -163,12 +163,12 @@ expandPathExtension : SLASH ref ( OPEN expandRefOption ( SEMI expandRefOptio
| SLASH count ( OPEN expandCountOption ( SEMI expandCountOption )* CLOSE )?
| OPEN expandOption ( SEMI expandOption )* CLOSE
;
-expandCountOption : filter
- | search
+expandCountOption : filterInline
+ | searchInline
;
expandRefOption : expandCountOption
- | orderby
- | skip
+ | orderbyInline
+ | skipInline
| top
| inlinecount
;
@@ -178,18 +178,24 @@ expandOption : expandRefOption
| LEVELS;
filter : FILTER EQ commonExpr;
+filterInline : FILTER_INLINE EQ commonExpr;
+
+
orderby : ORDERBY EQ orderbyItem ( COMMA orderbyItem )*;
+orderbyInline : ORDERBY_INLINE EQ orderbyItem ( COMMA orderbyItem )*;
orderbyItem : commonExpr ( WSP ( ASC | DESC ) )?;
//this is completly done in lexer grammer to avoid ambiguities with odataIdentifier and STRING
skip : SKIP EQ INT;
+skipInline : SKIP_INLINE EQ INT;
top : TOP EQ INT;
format : FORMAT EQ ( ATOM | JSON | XML | PCHARS ( SLASH PCHARS)?);
inlinecount : COUNT EQ booleanNonCase;
search : SEARCH searchSpecialToken;
+searchInline : SEARCH_INLINE searchSpecialToken;
searchSpecialToken : EQ WSP? searchExpr;
@@ -230,18 +236,14 @@ customValue : CUSTOMVALUE;
//ps+=pathSegment (SLASH ps+=pathSegment)*
//PRIMITIVETYPENAME
contextFragment : REF
- | PRIMITIVETYPENAME
- | 'Collection($ref)'
- | 'Collection(Edm.EntityType)'
- | 'Collection(Edm.ComplexType)'
-
- | COLLECTION_FIX OPEN ( PRIMITIVETYPENAME | namespace odataIdentifier ) CLOSE
-
+ /*| PRIMITIVETYPENAME*/
+ | COLLECTION_REF
+ | COLLECTION_ENTITY_TYPE
+ | COLLECTION_COMPLEX_TYPE
+ | COLLECTION ( /*PRIMITIVETYPENAME |*/ namespace? odataIdentifier ) CLOSE
| namespace? odataIdentifier
- ( '/$deletedEntity'
- | '/$link'
- | '/$deletedLink'
- | nameValueOptList? ( SLASH namespace? odataIdentifier)* ( propertyList )? ( '/$delta' )? ( entity )?
+ ( SLASH ( DELETED_ENTITY | LINK | DELETED_LINK )
+ | nameValueOptList? ( SLASH namespace? odataIdentifier)* ( propertyList )? ( SLASH DELTA) ? (SLASH ENTITY) ?
)
;
@@ -249,10 +251,10 @@ propertyList : OPEN propertyListItem ( COMMA propertyListItem )* CLOSE;
propertyListItem : STAR //; all structural properties
| propertyListProperty
;
-propertyListProperty : namespace? odataIdentifier ( SLASH namespace? odataIdentifier)* ( '+' )? ( propertyList)?
+propertyListProperty : namespace? odataIdentifier ( SLASH namespace? odataIdentifier)* ( PLUS )? ( propertyList)?
;
-entity : '/$entity';
+
//;------------------------------------------------------------------------------
//; 4. Expressions
//;------------------------------------------------------------------------------
@@ -287,8 +289,8 @@ rootExpr : ROOT pathSegments;
memberExpr : '$it' | '$it/'? pathSegments;
-anyExpr : 'any' OPEN WS* /* [ lambdaVariableExpr BWS COLON BWS lambdaPredicateExpr ] WS* */ CLOSE;
-allExpr : 'all' OPEN WS* /* lambdaVariableExpr BWS COLON BWS lambdaPredicateExpr WS* */ CLOSE;
+anyExpr : 'any' OPEN WSP /* [ lambdaVariableExpr BWS COLON BWS lambdaPredicateExpr ] WS* */ CLOSE;
+allExpr : 'all' OPEN WSP /* lambdaVariableExpr BWS COLON BWS lambdaPredicateExpr WS* */ CLOSE;
methodCallExpr : indexOfMethodCallExpr
| toLowerMethodCallExpr
@@ -326,43 +328,43 @@ methodCallExpr : indexOfMethodCallExpr
;
-containsMethodCallExpr : CONTAINS_WORD WS* commonExpr WS* COMMA WS* commonExpr WS* CLOSE;
-startsWithMethodCallExpr : STARTSWITH_WORD WS* commonExpr WS* COMMA WS* commonExpr WS* CLOSE;
-endsWithMethodCallExpr : ENDSWITH_WORD WS* commonExpr WS* COMMA WS* commonExpr WS* CLOSE;
-lengthMethodCallExpr : LENGTH_WORD WS* commonExpr WS* CLOSE;
-indexOfMethodCallExpr : INDEXOF_WORD WS* commonExpr WS* COMMA WS* commonExpr WS* CLOSE;
-substringMethodCallExpr : SUBSTRING_WORD WS* commonExpr WS* COMMA WS* commonExpr WS* ( COMMA WS* commonExpr WS* )? CLOSE;
-toLowerMethodCallExpr : TOLOWER_WORD WS* commonExpr WS* CLOSE;
-toUpperMethodCallExpr : TOUPPER_WORD WS* commonExpr WS* CLOSE;
-trimMethodCallExpr : TRIM_WORD WS* commonExpr WS* CLOSE;
-concatMethodCallExpr : CONCAT_WORD WS* commonExpr WS* COMMA WS* commonExpr WS* CLOSE;
-
-yearMethodCallExpr : YEAR_WORD WS* commonExpr WS* CLOSE;
-monthMethodCallExpr : MONTH_WORD WS* commonExpr WS* CLOSE;
-dayMethodCallExpr : DAY_WORD WS* commonExpr WS* CLOSE;
-hourMethodCallExpr : HOUR_WORD WS* commonExpr WS* CLOSE;
-minuteMethodCallExpr : MINUTE_WORD WS* commonExpr WS* CLOSE;
-secondMethodCallExpr : SECOND_WORD WS* commonExpr WS* CLOSE;
-fractionalsecondsMethodCallExpr : FRACTIONALSECONDS_WORD WS* commonExpr WS* CLOSE;
-totalsecondsMethodCallExpr : TOTALSECONDS_WORD WS* commonExpr WS* CLOSE;
-dateMethodCallExpr : DATE_WORD WS* commonExpr WS* CLOSE;
-timeMethodCallExpr : TIME_WORD WS* commonExpr WS* CLOSE;
-totalOffsetMinutesMethodCallExpr : TOTALOFFSETMINUTES_WORD WS* commonExpr WS* CLOSE;
-
-minDateTimeMethodCallExpr : MINDATETIME_WORD WS* CLOSE;
-maxDateTimeMethodCallExpr : MAXDATETIME_WORD WS* CLOSE;
-nowMethodCallExpr : NOW_WORD WS* CLOSE;
-
-roundMethodCallExpr : ROUND_WORD WS* commonExpr WS* CLOSE;
-floorMethodCallExpr : FLOOR_WORD WS* commonExpr WS* CLOSE;
-ceilingMethodCallExpr : CEILING_WORD WS* commonExpr WS* CLOSE;
-
-distanceMethodCallExpr : GEO_DISTANCE_WORD OPEN WS* commonExpr WS* COMMA WS* commonExpr WS* CLOSE;
-geoLengthMethodCallExpr : GEO_LENGTH_WORD OPEN WS* commonExpr WS* CLOSE;
-intersectsMethodCallExpr : GEO_INTERSECTS_WORD OPEN WS* commonExpr WS* COMMA WS* commonExpr WS* CLOSE;
-
-isofExpr : ISOF_WORD WS* ( commonExpr WS* COMMA WS* )? qualifiedtypename WS* CLOSE;
-castExpr : CAST_WORD WS* ( commonExpr WS* COMMA WS* )? qualifiedtypename WS* CLOSE;
+containsMethodCallExpr : CONTAINS_WORD WSP? commonExpr WSP? COMMA WSP? commonExpr WSP? CLOSE;
+startsWithMethodCallExpr : STARTSWITH_WORD WSP? commonExpr WSP? COMMA WSP? commonExpr WSP? CLOSE;
+endsWithMethodCallExpr : ENDSWITH_WORD WSP? commonExpr WSP? COMMA WSP? commonExpr WSP? CLOSE;
+lengthMethodCallExpr : LENGTH_WORD WSP? commonExpr WSP? CLOSE;
+indexOfMethodCallExpr : INDEXOF_WORD WSP? commonExpr WSP? COMMA WSP? commonExpr WSP? CLOSE;
+substringMethodCallExpr : SUBSTRING_WORD WSP? commonExpr WSP? COMMA WSP? commonExpr WSP? ( COMMA WSP? commonExpr WSP? )? CLOSE;
+toLowerMethodCallExpr : TOLOWER_WORD WSP? commonExpr WSP? CLOSE;
+toUpperMethodCallExpr : TOUPPER_WORD WSP? commonExpr WSP? CLOSE;
+trimMethodCallExpr : TRIM_WORD WSP? commonExpr WSP? CLOSE;
+concatMethodCallExpr : CONCAT_WORD WSP? commonExpr WSP? COMMA WSP? commonExpr WSP? CLOSE;
+
+yearMethodCallExpr : YEAR_WORD WSP? commonExpr WSP? CLOSE;
+monthMethodCallExpr : MONTH_WORD WSP? commonExpr WSP? CLOSE;
+dayMethodCallExpr : DAY_WORD WSP? commonExpr WSP? CLOSE;
+hourMethodCallExpr : HOUR_WORD WSP? commonExpr WSP? CLOSE;
+minuteMethodCallExpr : MINUTE_WORD WSP? commonExpr WSP? CLOSE;
+secondMethodCallExpr : SECOND_WORD WSP? commonExpr WSP? CLOSE;
+fractionalsecondsMethodCallExpr : FRACTIONALSECONDS_WORD WSP? commonExpr WSP? CLOSE;
+totalsecondsMethodCallExpr : TOTALSECONDS_WORD WSP? commonExpr WSP? CLOSE;
+dateMethodCallExpr : DATE_WORD WSP? commonExpr WSP? CLOSE;
+timeMethodCallExpr : TIME_WORD WSP? commonExpr WSP? CLOSE;
+totalOffsetMinutesMethodCallExpr : TOTALOFFSETMINUTES_WORD WSP? commonExpr WSP? CLOSE;
+
+minDateTimeMethodCallExpr : MINDATETIME_WORD WSP? CLOSE;
+maxDateTimeMethodCallExpr : MAXDATETIME_WORD WSP? CLOSE;
+nowMethodCallExpr : NOW_WORD WSP? CLOSE;
+
+roundMethodCallExpr : ROUND_WORD WSP? commonExpr WSP? CLOSE;
+floorMethodCallExpr : FLOOR_WORD WSP? commonExpr WSP? CLOSE;
+ceilingMethodCallExpr : CEILING_WORD WSP? commonExpr WSP? CLOSE;
+
+distanceMethodCallExpr : GEO_DISTANCE_WORD WSP? commonExpr WSP? COMMA WSP? commonExpr WSP? CLOSE;
+geoLengthMethodCallExpr : GEO_LENGTH_WORD WSP? commonExpr WSP? CLOSE;
+intersectsMethodCallExpr : GEO_INTERSECTS_WORD WSP? commonExpr WSP? COMMA WSP? commonExpr WSP? CLOSE;
+
+isofExpr : ISOF_WORD WSP? ( commonExpr WSP? COMMA WSP? )? qualifiedtypename WSP? CLOSE;
+castExpr : CAST_WORD WSP? ( commonExpr WSP? COMMA WSP? )? qualifiedtypename WSP? CLOSE;
//;------------------------------------------------------------------------------
//; 5. JSON format for function parameters
@@ -434,9 +436,8 @@ number_in_json : INT | DECIMAL;
//; 6. Names and identifiers
//;------------------------------------------------------------------------------
-qualifiedtypename : PRIMITIVETYPENAME
- | namespace odataIdentifier
- | 'collection' OPEN ( PRIMITIVETYPENAME | namespace odataIdentifier ) CLOSE
+qualifiedtypename : namespace odataIdentifier
+ | 'collection' OPEN ( namespace odataIdentifier ) CLOSE
;
namespace : (odataIdentifier POINT)+;
@@ -491,7 +492,7 @@ singleEnumValue : odataIdentifier / INT;
geographyCollection : GEOGRAPHY fullCollectionLiteral SQUOTE;
fullCollectionLiteral : sridLiteral collectionLiteral;
-collectionLiteral : (COLLECTION | COLLECTION_FIX) OPEN geoLiteral ( COMMA geoLiteral )* CLOSE;
+collectionLiteral : (COLLECTION ) OPEN geoLiteral ( COMMA geoLiteral )* CLOSE;
geoLiteral : collectionLiteral
| lineStringLiteral
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/2e622040/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/producer/core/uri/UriParserImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/producer/core/uri/UriParserImpl.java b/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/producer/core/uri/UriParserImpl.java
index 8a62e1b..d81d0fd 100644
--- a/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/producer/core/uri/UriParserImpl.java
+++ b/odata4-lib/odata4-producer-core/src/main/java/org/apache/olingo/producer/core/uri/UriParserImpl.java
@@ -125,7 +125,7 @@ public class UriParserImpl {
String odataIdentifier = ""; //TODO ctx.odi.getText();
// get element "odataIdentifier" from EDM
- EdmNamed edmObject = entityContainer.getElement(odataIdentifier);
+ EdmNamed edmObject = null;// entityContainer.getElement(odataIdentifier);
if (edmObject instanceof EdmEntitySet) {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/2e622040/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/EdmMock.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/EdmMock.java b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/EdmMock.java
index d4d4b22..1910190 100644
--- a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/EdmMock.java
+++ b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/EdmMock.java
@@ -346,12 +346,13 @@ public class EdmMock implements Edm {
when(container1.getFunctionImport(FUNCTION_IMPORT_ALL_LOCATIONS_NAME.getName())).thenReturn(
allLocationsFunctionImport);
- when(container1.getElement(EMPLOYEES_SET_NAME.getName())).thenReturn(employeesSet);
- when(container1.getElement(TEAMS_SET_NAME.getName())).thenReturn(teamsSet);
- when(container1.getElement(COMPANY_SINGLETON_NAME.getName())).thenReturn(company);
- when(container1.getElement(ACTION_IMPORT1_NAME.getName())).thenReturn(actionImport1);
- when(container1.getElement(FUNCTION_IMPORT_MAXIMAL_AGE_NAME.getName())).thenReturn(maximalAgeFunctionImport);
-
+ /*
+ * when(container1.getElement(EMPLOYEES_SET_NAME.getName())).thenReturn(employeesSet);
+ * when(container1.getElement(TEAMS_SET_NAME.getName())).thenReturn(teamsSet);
+ * when(container1.getElement(COMPANY_SINGLETON_NAME.getName())).thenReturn(company);
+ * when(container1.getElement(ACTION_IMPORT1_NAME.getName())).thenReturn(actionImport1);
+ * when(container1.getElement(FUNCTION_IMPORT_MAXIMAL_AGE_NAME.getName())).thenReturn(maximalAgeFunctionImport);
+ */
}
private void enhanceActionImport1() {
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/2e622040/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/ParserValidator.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/ParserValidator.java b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/ParserValidator.java
index 7f58912..a7e19e1 100644
--- a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/ParserValidator.java
+++ b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/ParserValidator.java
@@ -35,6 +35,7 @@ import org.antlr.v4.runtime.Parser;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
+import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.atn.ATNConfigSet;
import org.antlr.v4.runtime.atn.PredictionMode;
import org.antlr.v4.runtime.dfa.DFA;
@@ -42,71 +43,106 @@ import org.antlr.v4.runtime.misc.Interval;
import org.apache.olingo.producer.core.uri.antlr.UriLexer;
import org.apache.olingo.producer.core.uri.antlr.UriParserParser;
import org.apache.olingo.producer.core.uri.antlr.UriParserParser.OdataRelativeUriEOFContext;
-import org.apache.olingo.producer.core.uri.antlr.UriParserParser.TestContext;
+/**
+ * @author d039346
+ *
+ */
public class ParserValidator {
- private List<Exception> exceptions = new ArrayList<Exception>();
- private ParserRuleContext root;
+ public class UriLexerTrace extends UriLexer {
+ ParserValidator parserValidator = null;
- private String input = null;
- //private int exceptionOnStage = -1;
- private Exception curException = null;
- //private Exception curWeakException = null;
- private boolean allowFullContext;
- private boolean allowContextSensitifity;
- private boolean allowAmbiguity;
- private int logLevel = 0;
- private int lexerLog;
+ public UriLexerTrace(ParserValidator parserValidator, ANTLRInputStream antlrInputStream) {
+ super(antlrInputStream);
+ this.parserValidator = parserValidator;
+ }
- public ParserValidator run(String uri) {
- return run(uri, false);
- }
+ @Override
+ public Token emit() {
+ Token t =
+ _factory.create(_tokenFactorySourcePair, _type, _text, _channel, _tokenStartCharIndex, getCharIndex() - 1,
+ _tokenStartLine, _tokenStartCharPositionInLine);
+
+ if (parserValidator.logLevel > 1) {
+ String out = String.format("%1$-" + 20 + "s", t.getText());
+ ;
+ int tokenType = t.getType();
+ if (tokenType == -1) {
+ out += "-1/EOF";
+ } else {
+ out += UriLexer.tokenNames[tokenType];
+ }
+ System.out.println(out);
+ }
+ emit(t);
- public ParserValidator runTest(String uri) {
- return runTest(uri, false);
- }
+ return t;
+ }
+
+ @Override
+ public void pushMode(int m) {
+ String out = UriLexer.modeNames[this._mode] + "-->";
+ super.pushMode(m);
+ out += UriLexer.modeNames[this._mode];
+ if (parserValidator.logLevel > 1) {
+ System.out.print(out + " ");
+ }
+ ;
- public ParserValidator run(String uri, boolean searchMode) {
- input = uri;
- if (lexerLog> 0) {
- (new TokenValidator()).log(lexerLog).run(input);
-
}
- root = parseInput(uri, searchMode);
-
-
- if (logLevel > 0) {
+ @Override
+ public int popMode() {
+ String out = UriLexer.modeNames[this._mode] + "-->";
+ int m = super.popMode();
+ out += UriLexer.modeNames[this._mode];
- System.out.println(ParseTreeSerializer.getTreeAsText(root, new UriParserParser(null).getRuleNames()));
+ if (parserValidator.logLevel > 1) {
+ System.out.print(out + " ");
+ }
+ return m;
}
- // reset for nest test
- allowFullContext = false;
- allowContextSensitifity = false;
- allowAmbiguity = false;
-
- exFirst();
- return this;
}
- public ParserValidator runTest(String uri, boolean searchMode) {
- input = uri;
- root = parseInputTest(uri, searchMode);
+ private List<Exception> exceptions = new ArrayList<Exception>();
+ private ParserRuleContext root;
- if (logLevel > 0) {
+ private String input = null;
+ // private int exceptionOnStage = -1;
+ private Exception curException = null;
+ // private Exception curWeakException = null;
+ private boolean allowFullContext;
+ private boolean allowContextSensitifity;
+ private boolean allowAmbiguity;
+ private int logLevel = 0;
+ private int lexerLogLevel = 0;
- System.out.println(ParseTreeSerializer.getTreeAsText(root, new UriParserParser(null).getRuleNames()));
+ // private int lexerLogLevel = 0;
+ public ParserValidator run(String uri) {
+ input = uri;
+ if (lexerLogLevel > 0) {
+ (new TokenValidator()).log(lexerLogLevel).run(input);
+ }
+ root = parseInput(uri);
+ // LOG > 0 - Write serialized tree
+ if (logLevel > 0) {
+ if (root != null) {
+ System.out.println(ParseTreeSerializer.getTreeAsText(root, new UriParserParser(null).getRuleNames()));
+ } else {
+ System.out.println("root == null");
+ }
}
- // reset for nest test
+ // reset for next test
allowFullContext = false;
allowContextSensitifity = false;
allowAmbiguity = false;
+ logLevel = 0;
- exFirst();
+ // exFirst();
return this;
}
@@ -115,22 +151,40 @@ public class ParserValidator {
return this;
}
+ /**
+ * Used in fast LL Parsing:
+ * Don't stops the parsing process when the slower full context parsing (with prediction mode SLL) is
+ * required
+ * @return
+ */
public ParserValidator aFC() {
allowFullContext = true;
return this;
}
+ /**
+ * Used in fast LL Parsing:
+ * Allows ContextSensitifity Errors which occur often when using the slower full context parsing
+ * and indicate that there is a context sensitivity ( which may not be an error).
+ * @return
+ */
public ParserValidator aCS() {
allowContextSensitifity = true;
return this;
}
+ /**
+ * Used in fast LL Parsing:
+ * Allows ambiguities
+ * @return
+ */
public ParserValidator aAM() {
allowAmbiguity = true;
return this;
}
public ParserValidator isText(String expected) {
+ // make sure that there are no exceptions
assertEquals(null, curException);
assertEquals(0, exceptions.size());
@@ -144,8 +198,9 @@ public class ParserValidator {
return this;
}
- private OdataRelativeUriEOFContext parseInput(final String input, boolean searchMode) {
+ private OdataRelativeUriEOFContext parseInput(final String input) {
UriParserParser parser = null;
+ UriLexer lexer = null;
OdataRelativeUriEOFContext ret = null;
// Use 2 stage approach to improve performance
@@ -156,86 +211,71 @@ public class ParserValidator {
try {
curException = null;
exceptions.clear();
- parser = getNewParser(input, searchMode);
+ // create parser
+ lexer = new UriLexerTrace(this, new ANTLRInputStream(input));
+ parser = new UriParserParser(new CommonTokenStream(lexer));
+
+ // write single tokens to System.out
+ if (logLevel > 1) {
+ // can not be used because the listener is called bevore the mode changes
+ parser.addParseListener(new TokenWriter());
+ }
+ // write always a error message in case of syntax errors
+ parser.addErrorListener(new TraceErrorHandler<Object>());
+ // check error message if whether they are allowed or not
+ parser.addErrorListener(new ErrorCollector(this));
+
+ // Bail out of parser at first syntax error. --> procceds in catch block with step 2
parser.setErrorHandler(new BailErrorStrategy());
+
+ // User the faster LL parsing
parser.getInterpreter().setPredictionMode(PredictionMode.LL);
+ if (logLevel > 1) {
+ System.out.println("Step 1 (LL)");
+ }
ret = parser.odataRelativeUriEOF();
+
} catch (Exception ex) {
curException = ex;
- //exceptionOnStage = 1;
- // stage= 2
try {
+ // clear status
curException = null;
exceptions.clear();
- parser = getNewParser(input, searchMode);
- parser.setErrorHandler(new DefaultErrorStrategy());
- parser.getInterpreter().setPredictionMode(PredictionMode.SLL);
- ret = parser.odataRelativeUriEOF();
- } catch (Exception ex1) {
- curException = ex1;
- //exceptionOnStage = 2;
- }
- }
- return ret;
- }
+ // create parser
+ lexer = new UriLexerTrace(this, new ANTLRInputStream(input));
+ parser = new UriParserParser(new CommonTokenStream(lexer));
- private TestContext parseInputTest(final String input, boolean searchMode) {
- UriParserParser parser = null;
- TestContext ret = null;
+ // write single tokens to System.out
+ if (logLevel > 1) {
+ parser.addParseListener(new TokenWriter());
+ }
- // Use 2 stage approach to improve performance
- // see https://github.com/antlr/antlr4/issues/192
- // TODO verify this
+ // write always a error message in case of syntax errors
+ parser.addErrorListener(new TraceErrorHandler<Object>());
+ // check error message if whether they are allowed or not
+ parser.addErrorListener(new ErrorCollector(this));
- // stage= 1
- try {
- curException = null;
- exceptions.clear();
- parser = getNewParser(input, searchMode);
- parser.setErrorHandler(new BailErrorStrategy());
- parser.getInterpreter().setPredictionMode(PredictionMode.LL);
- ret = parser.test();
- } catch (Exception ex) {
- curException = ex;
- //exceptionOnStage = 1;
- // stage= 2
- try {
- curException = null;
- exceptions.clear();
- parser = getNewParser(input, searchMode);
+ // Used default error strategy
parser.setErrorHandler(new DefaultErrorStrategy());
+
+ // User the slower SLL parsing
parser.getInterpreter().setPredictionMode(PredictionMode.SLL);
- ret = parser.test();
+
+ if (logLevel > 1) {
+ System.out.println("Step 2 (SLL)");
+ }
+ ret = parser.odataRelativeUriEOF();
+
} catch (Exception ex1) {
curException = ex1;
- //exceptionOnStage = 2;
+ // exceptionOnStage = 2;
}
}
return ret;
}
- private UriParserParser getNewParser(final String input, boolean searchMode) {
- ANTLRInputStream inputStream = new ANTLRInputStream(input);
-
- // UriLexer lexer = new UriLexer(inputStream);
- UriLexer lexer = new UriLexer(inputStream);
- //lexer.setInSearch(searchMode);
- // lexer.removeErrorListeners();
- lexer.addErrorListener(new ErrorCollector(this));
- CommonTokenStream tokens = new CommonTokenStream(lexer);
-
- UriParserParser parser = new UriParserParser(tokens);
- if ((lexerLog >0 ) || (logLevel > 0)) {
- parser.addParseListener(new TokenWriter());
- }
- parser.addErrorListener(new TraceErrorHandler<Object>());
- parser.addErrorListener(new ErrorCollector(this));
-
- return parser;
- }
-
private static class ErrorCollector implements ANTLRErrorListener {
ParserValidator tokenValidator;
@@ -250,21 +290,20 @@ public class ParserValidator {
tokenValidator.exceptions.add(e);
trace(recognizer, offendingSymbol, line, charPositionInLine, msg, e);
- fail("syntaxError"); // don't fail here we want to the error message at the caller
+ fail("syntaxError");
}
@Override
public void reportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, boolean exact,
BitSet ambigAlts, ATNConfigSet configs) {
-
if (!tokenValidator.allowAmbiguity) {
System.out.println("reportAmbiguity " +
ambigAlts + ":" + configs +
", input=" + recognizer.getTokenStream().getText(Interval.of(startIndex, stopIndex)));
- printStack(recognizer);
+ printStack(recognizer);
fail("reportAmbiguity");
- } else {
+ } else if (tokenValidator.logLevel > 0) {
System.out.println("allowed Ambiguity " +
ambigAlts + ":" + configs +
", input=" + recognizer.getTokenStream().getText(Interval.of(startIndex, stopIndex)));
@@ -280,7 +319,7 @@ public class ParserValidator {
if (!tokenValidator.allowFullContext) {
printStack(recognizer);
fail("reportAttemptingFullContext");
- } else {
+ } else if (tokenValidator.logLevel > 0) {
System.out.println("allowed AttemptingFullContext");
}
}
@@ -291,9 +330,8 @@ public class ParserValidator {
if (!tokenValidator.allowContextSensitifity) {
printStack(recognizer);
fail("reportContextSensitivity");
- } else {
+ } else if (tokenValidator.logLevel > 0) {
System.out.println("allowed ContextSensitivity");
-
}
}
@@ -331,32 +369,31 @@ public class ParserValidator {
public ParserValidator exFirst() {
try {
- //curWeakException = exceptions.get(0);
+ // curWeakException = exceptions.get(0);
} catch (IndexOutOfBoundsException ex) {
- //curWeakException = null;
+ // curWeakException = null;
}
return this;
}
public ParserValidator exLast() {
- //curWeakException = exceptions.get(exceptions.size() - 1);
+ // curWeakException = exceptions.get(exceptions.size() - 1);
return this;
}
public ParserValidator exAt(int index) {
try {
- //curWeakException = exceptions.get(index);
+ // curWeakException = exceptions.get(index);
} catch (IndexOutOfBoundsException ex) {
- //curWeakException = null;
+ // curWeakException = null;
}
return this;
}
- public ParserValidator lexerlog(int i) {
- this.lexerLog = i;
+ public ParserValidator lexerLog(int i) {
+ lexerLogLevel = i;
return this;
-
}
}
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/2e622040/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/TokenWriter.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/TokenWriter.java b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/TokenWriter.java
index cbd095a..b06fcf7 100644
--- a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/TokenWriter.java
+++ b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/testutil/TokenWriter.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
+ * L icensed 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
@@ -22,15 +22,19 @@ import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ErrorNode;
import org.antlr.v4.runtime.tree.ParseTreeListener;
import org.antlr.v4.runtime.tree.TerminalNode;
-import org.apache.olingo.producer.core.uri.antlr.UriLexer;
public class TokenWriter implements ParseTreeListener {
@Override
public void visitTerminal(TerminalNode node) {
- String out = String.format("%1$-" + 20 + "s", node.getText()); ;
- out += UriLexer.tokenNames[node.getSymbol().getType()];
- System.out.println(out);
+ /*String out = String.format("%1$-" + 20 + "s", node.getText()); ;
+ int tokenType = node.getSymbol().getType();
+ if (tokenType == -1 ) {
+ out += "-1/EOF";
+ } else {
+ out += UriLexer.tokenNames[tokenType];
+ }
+ System.out.println(out); */
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/2e622040/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/uri/antlr/TestLexer.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/uri/antlr/TestLexer.java b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/uri/antlr/TestLexer.java
index 5022c81..faa4178 100644
--- a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/uri/antlr/TestLexer.java
+++ b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/uri/antlr/TestLexer.java
@@ -55,9 +55,10 @@ public class TestLexer {
test = new TokenValidator();
}
- // @Test
+ @Test
public void test() {
- test.globalMode(UriLexer.MODE_QUERY);
+ test.globalMode(UriLexer.DEFAULT_MODE);
+ test.run("ODI?$filter=geo.distance(geometry'SRID=0;Point(142.1 64.1)',geometry'SRID=0;Point(142.1 64.1)')");
// test.log(1).run("$filter='ABC'").isText("ABC").isType(UriLexer.STRING);
// test.log(1).run("ODI?$filter=1 add 2 mul 3");
// test.log(1).run("1 + 2 + 3");
@@ -137,7 +138,7 @@ public class TestLexer {
// ;------------------------------------------------------------------------------
@Test
public void testQueryExpressions() {
- test.globalMode(UriLexer.MODE_SYSTEM_QUERY);
+ test.globalMode(UriLexer.DEFAULT_MODE);
// assertEquals("expected","actual");
test.run("$it").isText("$it").isType(UriLexer.IMPLICIT_VARIABLE_EXPR);
@@ -265,20 +266,15 @@ public class TestLexer {
@Test
public void testLiteralDataValues() {
- test.globalMode(UriLexer.MODE_SYSTEM_QUERY);
+ test.globalMode(UriLexer.DEFAULT_MODE);
// null
test.run("null").isInput().isType(UriLexer.NULLVALUE);
// binary
- test.run("X'ABCD'").isInput().isType(UriLexer.BINARY);
- test.run("X'ABCD'").isInput().isType(UriLexer.BINARY);
test.run("binary'ABCD'").isInput().isType(UriLexer.BINARY);
test.run("BiNaRy'ABCD'").isInput().isType(UriLexer.BINARY);
// not a binary TODO add error handling
- test.run("x'ABCDA'")
- .at(0).isText("x").isType(UriLexer.ODATAIDENTIFIER)
- .at(1).isText("'ABCDA'").isType(UriLexer.STRING);
test.run("BiNaRy'ABCDA'")
.at(0).isText("BiNaRy").isType(UriLexer.ODATAIDENTIFIER)
.at(1).isText("'ABCDA'").isType(UriLexer.STRING);
http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/2e622040/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/uri/antlr/TestParser.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/uri/antlr/TestParser.java b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/uri/antlr/TestParser.java
index e58a2db..5aec72c 100644
--- a/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/uri/antlr/TestParser.java
+++ b/odata4-lib/odata4-producer-core/src/test/java/org/apache/olingo/producer/core/uri/antlr/TestParser.java
@@ -41,16 +41,22 @@ public class TestParser {
test = new ParserValidator();
}
- //@Test
+ @Test
public void test() {
- String text = "ODI?$expand=*";
- text = "aa";
-
- (new TokenValidator()).log(1).run(text);
- // test.log(1).run(text);
-
- //
-
+ /*
+ * test.log(2).run("ODI?$filter=geo.distance("+
+ * "geometry'SRID=0;Point(142.1 64.1)',geometry'SRID=0;Point(142.1 64.1)')")
+ * .isText("odataRelativeUriEOF(odataRelativeUri("
+ * + "resourcePath(pathSegments(pathSegment(odataIdentifier(ODI)))) ? queryOptions("
+ * + "queryOption(systemQueryOption("
+ * + "filter($filter = commonExpr(methodCallExpr("
+ * + "distanceMethodCallExpr("
+ * + "geo.distance( "
+ * + "commonExpr(primitiveLiteral(geometryPoint(geometry' fullpointLiteral(sridLiteral(SRID = 0 ;) "
+ * + "pointLiteral(Point pointData(( positionLiteral(142.1 64.1) )))) '))) , "
+ * + "commonExpr(primitiveLiteral(geometryPoint(geometry' fullpointLiteral(sridLiteral(SRID = 0 ;) "
+ * + "pointLiteral(Point pointData(( positionLiteral(142.1 64.1) )))) '))) ))))))))) <EOF>)");
+ */
}
// ;------------------------------------------------------------------------------
@@ -277,7 +283,7 @@ public class TestParser {
+ "odataIdentifier(ODI)))) ? queryOptions(queryOption(systemQueryOption("
+ "expand($expand = expandItemList("
+ "expandItem(expandPath(odataIdentifier(ODI)) "
- + "expandPathExtension(/ ref($ref) ( expandRefOption(skip($skip = 1)) ))))))))) <EOF>)");
+ + "expandPathExtension(/ ref($ref) ( expandRefOption(skipInline($skip = 1)) ))))))))) <EOF>)");
test.run("ODI?$expand=ODI/$count").isText("odataRelativeUriEOF(odataRelativeUri("
+ "resourcePath(pathSegments(pathSegment("
@@ -292,7 +298,7 @@ public class TestParser {
+ "expand($expand = expandItemList("
+ "expandItem(expandPath(odataIdentifier(ODI)) expandPathExtension(/ count($count) ( "
+ "expandCountOption("
- + "filter($filter = commonExpr(primitiveLiteral(1)))) ))))))))) <EOF>)");
+ + "filterInline($filter = commonExpr(primitiveLiteral(1)))) ))))))))) <EOF>)");
test.run("ODI?$expand=ODI/$count($search=\"abc\")").isText("odataRelativeUriEOF(odataRelativeUri("
+ "resourcePath(pathSegments(pathSegment("
@@ -300,25 +306,25 @@ public class TestParser {
+ "expand($expand = expandItemList("
+ "expandItem(expandPath(odataIdentifier(ODI)) expandPathExtension(/ count($count) ( "
+ "expandCountOption("
- + "search($search searchSpecialToken(= searchExpr(searchPhrase(\"abc\"))))) ))))))))) <EOF>)");
+ + "searchInline($search searchSpecialToken(= searchExpr(searchPhrase(\"abc\"))))) ))))))))) <EOF>)");
test.run("ODI?$expand=ODI/$ref($skip=1;$filter=true)").isText("odataRelativeUriEOF(odataRelativeUri("
+ "resourcePath(pathSegments(pathSegment("
+ "odataIdentifier(ODI)))) ? queryOptions(queryOption(systemQueryOption("
+ "expand($expand = expandItemList("
+ "expandItem(expandPath(odataIdentifier(ODI)) expandPathExtension(/ ref($ref) ( "
- + "expandRefOption(skip($skip = 1)) ; "
+ + "expandRefOption(skipInline($skip = 1)) ; "
+ "expandRefOption(expandCountOption("
- + "filter($filter = commonExpr(primitiveLiteral(booleanNonCase(true)))))) ))))))))) <EOF>)");
+ + "filterInline($filter = commonExpr(primitiveLiteral(booleanNonCase(true)))))) ))))))))) <EOF>)");
test.run("ODI?$expand=ODI($skip=1;$filter=true)").isText("odataRelativeUriEOF(odataRelativeUri("
+ "resourcePath(pathSegments(pathSegment("
+ "odataIdentifier(ODI)))) ? queryOptions(queryOption(systemQueryOption("
+ "expand($expand = expandItemList("
+ "expandItem(expandPath(odataIdentifier(ODI)) expandPathExtension(( "
- + "expandOption(expandRefOption(skip($skip = 1))) ; "
+ + "expandOption(expandRefOption(skipInline($skip = 1))) ; "
+ "expandOption(expandRefOption(expandCountOption("
- + "filter($filter = commonExpr(primitiveLiteral(booleanNonCase(true))))))) ))))))))) <EOF>)");
+ + "filterInline($filter = commonExpr(primitiveLiteral(booleanNonCase(true))))))) ))))))))) <EOF>)");
// Test parser rule filter ( more filter test in method testExpressions)
test.run("ODI?$filter=true")
@@ -347,11 +353,12 @@ public class TestParser {
+ "queryOption(systemQueryOption(id($id = abc))))) <EOF>)");
// Test parser rule count
- /* TODO add count to new mode based lexer
- test.lexerlog(1).run("ODI?$count=true").isText("odataRelativeUriEOF(odataRelativeUri("
- + "resourcePath(pathSegments(pathSegment(odataIdentifier(ODI)))) ? queryOptions(queryOption("
- + "systemQueryOption("
- + "inlinecount($count = booleanNonCase(true)))))) <EOF>)");
+ /*
+ * TODO add count to new mode based lexer
+ * test.lexerlog(1).run("ODI?$count=true").isText("odataRelativeUriEOF(odataRelativeUri("
+ * + "resourcePath(pathSegments(pathSegment(odataIdentifier(ODI)))) ? queryOptions(queryOption("
+ * + "systemQueryOption("
+ * + "inlinecount($count = booleanNonCase(true)))))) <EOF>)");
*/
test.run("ODI?$count=false").isText("odataRelativeUriEOF(odataRelativeUri("
+ "resourcePath(pathSegments(pathSegment(odataIdentifier(ODI)))) ? queryOptions(queryOption("
@@ -562,11 +569,6 @@ public class TestParser {
+ "queryOption(systemQueryOption(filter($filter = commonExpr("
+ "primitiveLiteral(-1.2e-3))))))) <EOF>)");
- test.run("ODI?$filter=X'12AB'").isText("odataRelativeUriEOF(odataRelativeUri("
- + "resourcePath(pathSegments(pathSegment(odataIdentifier(ODI)))) ? queryOptions("
- + "queryOption(systemQueryOption(filter($filter = commonExpr("
- + "primitiveLiteral(X'12AB'))))))) <EOF>)");
-
test.run("ODI?$filter=binary'12AB'").isText("odataRelativeUriEOF(odataRelativeUri("
+ "resourcePath(pathSegments(pathSegment(odataIdentifier(ODI)))) ? queryOptions("
+ "queryOption(systemQueryOption(filter($filter = commonExpr("
@@ -957,23 +959,22 @@ public class TestParser {
+ "filter($filter = commonExpr(methodCallExpr("
+ "ceilingMethodCallExpr(ceiling( commonExpr(primitiveLiteral(12.34)) ))))))))) <EOF>)");
- /* TODO reenable GEOMETRY
- test.run("ODI?$filter=geo.distance(geometry'SRID=0;Point(142.1 64.1)',geometry'SRID=0;Point(142.1 64.1)')")
- .isText("odataRelativeUriEOF(odataRelativeUri("
- + "resourcePath(pathSegments(pathSegment(odataIdentifier(ODI)))) ? queryOptions("
- + "queryOption(systemQueryOption("
- + "filter($filter = commonExpr(methodCallExpr("
- + "distanceMethodCallExpr("
- + "geo.distance( "
- + "commonExpr(primitiveLiteral(geometryPoint(geometry' fullpointLiteral(sridLiteral(SRID = 0 ;) "
- + "pointLiteral(Point pointData(( positionLiteral(142.1 64.1) )))) '))) , "
- + "commonExpr(primitiveLiteral(geometryPoint(geometry' fullpointLiteral(sridLiteral(SRID = 0 ;) "
- + "pointLiteral(Point pointData(( positionLiteral(142.1 64.1) )))) '))) ))))))))) <EOF>)");
- */
- // TODO check this
- /*
- test.run("ODI?$filter=geo.length(geometry'SRID=0;LineString(142.1 64.1,3.14 2.78)')")
- .isText("odataRelativeUriEOF(odataRelativeUri("
+ test.run("ODI?$filter=geo.distance(geometry'SRID=0;Point(142.1 64.1)',geometry'SRID=0;Point(142.1 64.1)')")
+ .isText("odataRelativeUriEOF(odataRelativeUri("
+ + "resourcePath(pathSegments(pathSegment(odataIdentifier(ODI)))) ? queryOptions("
+ + "queryOption(systemQueryOption("
+ + "filter($filter = commonExpr(methodCallExpr("
+ + "distanceMethodCallExpr("
+ + "geo.distance( "
+ + "commonExpr(primitiveLiteral(geometryPoint(geometry' fullpointLiteral(sridLiteral(SRID = 0 ;) "
+ + "pointLiteral(Point pointData(( positionLiteral(142.1 64.1) )))) '))) , "
+ + "commonExpr(primitiveLiteral(geometryPoint(geometry' fullpointLiteral(sridLiteral(SRID = 0 ;) "
+ + "pointLiteral(Point pointData(( positionLiteral(142.1 64.1) )))) '))) ))))))))) <EOF>)");
+
+ // TODO check this
+ /*
+ * test.run("ODI?$filter=geo.length(geometry'SRID=0;LineString(142.1 64.1,3.14 2.78)')")
+ * .isText("odataRelativeUriEOF(odataRelativeUri("
* + "resourcePath(pathSegments(pathSegment(odataIdentifier(ODI)))) ? queryOptions("
* + "queryOption(systemQueryOption(filter($filter = commonExpr(methodCallExpr("
* + "geoLengthMethodCallExpr(geo.length ( commonExpr(primitiveLiteral("
@@ -1184,132 +1185,133 @@ public class TestParser {
@Test
public void testFragment() {
- /*
- * test.run("$metadata#Collection($ref)").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(Collection($ref))) <EOF>)");
- *
- * test.run("$metadata#Collection(Edm.EntityType)").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(Collection(Edm.EntityType))) <EOF>)");
- *
- * test.run("$metadata#Collection(Edm.ComplexType)").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(Collection(Edm.ComplexType))) <EOF>)");
- *
- * test.run("$metadata#singletonEntity").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(singletonEntity))) <EOF>)");
- *
- * test.run("$metadata#NS.ODI").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(namespace(odataIdentifier(NS) .) odataIdentifier(ODI))) <EOF>)");
- *
- * test.run("$metadata#Edm.Boolean").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(Edm.Boolean)) <EOF>)");
- *
- * test.run("$metadata#ODI/$deletedEntity").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) /$deletedEntity)) <EOF>)");
- *
- * test.run("$metadata#ODI/$link").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) /$link)) <EOF>)");
- *
- * test.run("$metadata#ODI/$deletedLink").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) /$deletedLink)) <EOF>)");
- *
- * test.run("$metadata#ODI(1)/ODI").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "/ odataIdentifier(ODI))) <EOF>)");
- *
- * test.run("$metadata#ODI(1)/NS.ODI").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "/ namespace(odataIdentifier(NS) .) odataIdentifier(ODI))) <EOF>)");
- *
- * test.run("$metadata#ODI(1)/NS.ODI/ODI").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "/ namespace(odataIdentifier(NS) .) odataIdentifier(ODI) "
- * + "/ odataIdentifier(ODI))) <EOF>)");
- *
- * test.run("$metadata#NS.ODI(*)").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(namespace(odataIdentifier(NS) .) odataIdentifier(ODI) "
- * + "propertyList(( propertyListItem(*) )))) <EOF>)");
- *
- * test.run("$metadata#ODI(1)").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))))) <EOF>)");
- *
- * test.run("$metadata#ODI(1)/ODI").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "/ odataIdentifier(ODI))) <EOF>)");
- *
- * test.run("$metadata#ODI(1)/NS.ODI").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "/ namespace(odataIdentifier(NS) .) odataIdentifier(ODI))) <EOF>)");
- *
- * test.run("$metadata#ODI(1)/NS.ODI/ODI").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "/ namespace(odataIdentifier(NS) .) odataIdentifier(ODI) / odataIdentifier(ODI))) <EOF>)");
- *
- * test.run("$metadata#ODI(1)(*)").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) propertyList(( propertyListItem(*) )))) <EOF>)");
- *
- * test.run("$metadata#ODI(1)(PROP)").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "propertyList(( propertyListItem(propertyListProperty(odataIdentifier(PROP))) )))) <EOF>)");
- * test.run("$metadata#ODI(1)(NAVPROP+)").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "propertyList(( propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) +)) )))) <EOF>)");
- * test.run("$metadata#ODI(1)(NAVPROP+(*))").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "propertyList(( "
- * + "propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) + "
- * + "propertyList(( "
- * + "propertyListItem(*) )))) )))) <EOF>)");
- * test.run("$metadata#ODI(1)(NAVPROP+(A,B,C))").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "propertyList(( "
- * + "propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) + "
- * + "propertyList(( "
- * + "propertyListItem(propertyListProperty(odataIdentifier(A))) , "
- * + "propertyListItem(propertyListProperty(odataIdentifier(B))) , "
- * + "propertyListItem(propertyListProperty(odataIdentifier(C))) )))) )))) <EOF>)");
- *
- * test.run("$metadata#ODI(1)(NAVPROP+(A,B,C))/$delta").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "propertyList(( "
- * + "propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) + "
- * + "propertyList(( "
- * + "propertyListItem(propertyListProperty(odataIdentifier(A))) , "
- * + "propertyListItem(propertyListProperty(odataIdentifier(B))) , "
- * + "propertyListItem(propertyListProperty(odataIdentifier(C))) )))) )) "
- * + "/$delta)) <EOF>)");
- *
- * test.run("$metadata#ODI(1)(NAVPROP+(A,B,C))/$entity").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "propertyList(( "
- * + "propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) + "
- * + "propertyList(( "
- * + "propertyListItem(propertyListProperty(odataIdentifier(A))) , "
- * + "propertyListItem(propertyListProperty(odataIdentifier(B))) , "
- * + "propertyListItem(propertyListProperty(odataIdentifier(C))) )))) )) "
- * + "entity(/$entity))) <EOF>)");
- * test.run("$metadata#ODI(1)(NAVPROP+(A,B,C))/$delta/$entity").isText("odataRelativeUriEOF(odataRelativeUri("
- * + "$metadata # contextFragment(odataIdentifier(ODI) "
- * + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
- * + "propertyList(( "
- * + "propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) + "
- * + "propertyList(( "
- * + "propertyListItem(propertyListProperty(odataIdentifier(A))) , "
- * + "propertyListItem(propertyListProperty(odataIdentifier(B))) , "
- * + "propertyListItem(propertyListProperty(odataIdentifier(C))) )))) )) "
- * + "/$delta entity(/$entity))) <EOF>)");
- */
+
+ test.run("$metadata#Collection($ref)").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(Collection($ref))) <EOF>)");
+
+ test.run("$metadata#Collection(Edm.EntityType)").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(Collection(Edm.EntityType))) <EOF>)");
+
+ test.run("$metadata#Collection(Edm.ComplexType)").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(Collection(Edm.ComplexType))) <EOF>)");
+
+ test.run("$metadata#singletonEntity").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(singletonEntity))) <EOF>)");
+
+ test.run("$metadata#NS.ODI").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(namespace(odataIdentifier(NS) .) odataIdentifier(ODI))) <EOF>)");
+
+ test.run("$metadata#Edm.Boolean").isText("odataRelativeUriEOF("
+ + "odataRelativeUri($metadata # "
+ + "contextFragment(namespace(odataIdentifier(Edm) .) odataIdentifier(Boolean))) <EOF>)");
+
+ test.run("$metadata#ODI/$deletedEntity").isText("odataRelativeUriEOF("
+ + "odataRelativeUri($metadata # contextFragment(odataIdentifier(ODI) / $deletedEntity)) <EOF>)");
+
+ test.run("$metadata#ODI/$link").isText("odataRelativeUriEOF("
+ + "odataRelativeUri($metadata # contextFragment(odataIdentifier(ODI) / $link)) <EOF>)");
+
+ test.run("$metadata#ODI/$deletedLink").isText("odataRelativeUriEOF("
+ + "odataRelativeUri($metadata # contextFragment(odataIdentifier(ODI) / $deletedLink)) <EOF>)");
+
+ test.run("$metadata#ODI(1)/ODI").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "/ odataIdentifier(ODI))) <EOF>)");
+
+ test.run("$metadata#ODI(1)/NS.ODI").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "/ namespace(odataIdentifier(NS) .) odataIdentifier(ODI))) <EOF>)");
+
+ test.run("$metadata#ODI(1)/NS.ODI/ODI").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "/ namespace(odataIdentifier(NS) .) odataIdentifier(ODI) "
+ + "/ odataIdentifier(ODI))) <EOF>)");
+
+ test.run("$metadata#NS.ODI(*)").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(namespace(odataIdentifier(NS) .) odataIdentifier(ODI) "
+ + "propertyList(( propertyListItem(*) )))) <EOF>)");
+
+ test.run("$metadata#ODI(1)").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))))) <EOF>)");
+
+ test.run("$metadata#ODI(1)/ODI").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "/ odataIdentifier(ODI))) <EOF>)");
+
+ test.run("$metadata#ODI(1)/NS.ODI").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "/ namespace(odataIdentifier(NS) .) odataIdentifier(ODI))) <EOF>)");
+
+ test.run("$metadata#ODI(1)/NS.ODI/ODI").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "/ namespace(odataIdentifier(NS) .) odataIdentifier(ODI) / odataIdentifier(ODI))) <EOF>)");
+
+ test.run("$metadata#ODI(1)(*)").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) propertyList(( propertyListItem(*) )))) <EOF>)");
+
+ test.run("$metadata#ODI(1)(PROP)").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "propertyList(( propertyListItem(propertyListProperty(odataIdentifier(PROP))) )))) <EOF>)");
+ test.run("$metadata#ODI(1)(NAVPROP+)").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "propertyList(( propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) +)) )))) <EOF>)");
+ test.run("$metadata#ODI(1)(NAVPROP+(*))").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "propertyList(( "
+ + "propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) + "
+ + "propertyList(( "
+ + "propertyListItem(*) )))) )))) <EOF>)");
+ test.run("$metadata#ODI(1)(NAVPROP+(A,B,C))").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "propertyList(( "
+ + "propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) + "
+ + "propertyList(( "
+ + "propertyListItem(propertyListProperty(odataIdentifier(A))) , "
+ + "propertyListItem(propertyListProperty(odataIdentifier(B))) , "
+ + "propertyListItem(propertyListProperty(odataIdentifier(C))) )))) )))) <EOF>)");
+
+ test.run("$metadata#ODI(1)(NAVPROP+(A,B,C))/$delta").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "propertyList(( "
+ + "propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) + "
+ + "propertyList(( "
+ + "propertyListItem(propertyListProperty(odataIdentifier(A))) , "
+ + "propertyListItem(propertyListProperty(odataIdentifier(B))) , "
+ + "propertyListItem(propertyListProperty(odataIdentifier(C))) )))) )) "
+ + "/ $delta)) <EOF>)");
+
+ test.run("$metadata#ODI(1)(NAVPROP+(A,B,C))/$entity").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "propertyList(( "
+ + "propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) + "
+ + "propertyList(( "
+ + "propertyListItem(propertyListProperty(odataIdentifier(A))) , "
+ + "propertyListItem(propertyListProperty(odataIdentifier(B))) , "
+ + "propertyListItem(propertyListProperty(odataIdentifier(C))) )))) )) "
+ + "/ $entity)) <EOF>)");
+ test.run("$metadata#ODI(1)(NAVPROP+(A,B,C))/$delta/$entity").isText("odataRelativeUriEOF(odataRelativeUri("
+ + "$metadata # contextFragment(odataIdentifier(ODI) "
+ + "nameValueOptList(valueOnly(( primitiveLiteral(1) ))) "
+ + "propertyList(( "
+ + "propertyListItem(propertyListProperty(odataIdentifier(NAVPROP) + "
+ + "propertyList(( "
+ + "propertyListItem(propertyListProperty(odataIdentifier(A))) , "
+ + "propertyListItem(propertyListProperty(odataIdentifier(B))) , "
+ + "propertyListItem(propertyListProperty(odataIdentifier(C))) )))) )) "
+ + "/ $delta / $entity)) <EOF>)");
+
}
@Test