blob: 4b12c13597d9850d27551b451cc99e119564b113 [file] [log] [blame]
lexer grammar ProvenanceQueryLexer;
@header {
package org.apache.nifi.pql;
import org.apache.nifi.pql.exception.ProvenanceQueryLanguageParsingException;
}
@rulecatch {
catch(final Exception e) {
throw new ProvenanceQueryLanguageParsingException(e);
}
}
@members {
public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
final StringBuilder sb = new StringBuilder();
if ( e.token == null ) {
sb.append("Unrecognized token ");
} else {
sb.append("Unexpected token '").append(e.token.getText()).append("' ");
}
sb.append("at line ").append(e.line);
if ( e.approximateLineInfo ) {
sb.append(" (approximately)");
}
sb.append(", column ").append(e.charPositionInLine);
sb.append(". Query: ").append(e.input.toString());
throw new ProvenanceQueryLanguageParsingException(sb.toString());
}
public void recover(RecognitionException e) {
final StringBuilder sb = new StringBuilder();
if ( e.token == null ) {
sb.append("Unrecognized token ");
} else {
sb.append("Unexpected token '").append(e.token.getText()).append("' ");
}
sb.append("at line ").append(e.line);
if ( e.approximateLineInfo ) {
sb.append(" (approximately)");
}
sb.append(", column ").append(e.charPositionInLine);
sb.append(". Query: ").append(e.input.toString());
throw new ProvenanceQueryLanguageParsingException(sb.toString());
}
}
// PUNCTUATION & SPECIAL CHARACTERS
WHITESPACE : (' '|'\t'|'\n'|'\r')+ { $channel = HIDDEN; };
COMMENT : '#' ( ~('\n') )* '\n' { $channel = HIDDEN; };
LPAREN : '(';
RPAREN : ')';
LBRACKET : '[';
RBRACKET : ']';
COMMA : ',';
DOT : '.';
SEMICOLON : ';';
ASTERISK : '*';
EQUALS : '=';
NOT_EQUALS : '!=' | '<>';
GT : '>';
LT : '<';
GE : '>=';
LE : '<=';
PIPE : '|';
NUMBER : ('0'..'9')+;
// Keywords
SELECT : 'SELECT' | 'select' | 'Select';
AS : 'AS' | 'as' | 'As';
FROM : 'FROM' | 'from' | 'From';
WHERE : 'WHERE' | 'where' | 'Where';
HAVING : 'HAVING' | 'having' | 'Having';
ORDER_BY : 'ORDER BY' | 'order by' | 'Order By';
ASC : 'ASC' | 'asc' | 'Asc';
DESC : 'DESC' | 'desc' | 'Desc';
GROUP_BY : 'GROUP BY' | 'group by' | 'Group By';
EVENT : 'EVENT' | 'event' | 'Event';
// Operators
WITHIN : 'WITHIN' | 'within' | 'Within';
MATCHES : 'MATCHES' | 'matches' | 'Matches';
CONTAINS : 'CONTAINS' | 'contains' | 'Contains';
IS_NULL : 'IS NULL' | 'is null' | 'Is Null';
NOT_NULL : 'NOT NULL' | 'not null' | 'Not Null';
IN : 'IN' | 'in' | 'In';
BETWEEN : 'BETWEEN' | 'between' | 'Between';
AND : 'AND' | 'and' | 'And';
OR : 'OR' | 'or' | 'Or';
NOT : 'NOT' | 'not' | 'Not';
LIMIT : 'LIMIT' | 'limit' | 'Limit';
STARTS_WITH : 'STARTS WITH' | 'starts with' | 'Starts with' | 'Starts With';
// Functions
COUNT : 'COUNT' | 'count' | 'Count';
SUM : 'SUM' | 'sum' | 'Sum';
MIN : 'MIN' | 'min' | 'Min';
MAX : 'MAX' | 'max' | 'Max';
AVG : 'AVG' | 'avg' | 'Avg';
HOUR : 'HOUR' | 'hour' | 'Hour';
MINUTE : 'MINUTE' | 'minute' | 'Minute';
SECOND : 'SECOND' | 'second' | 'Second';
DAY : 'DAY' | 'day' | 'Day';
MONTH : 'MONTH' | 'month' | 'Month';
YEAR : 'YEAR' | 'year' | 'Year';
// Event Properties
TRANSIT_URI : 'TRANSITURI' | 'transituri' | 'TransitUri';
TIMESTAMP : 'TIME' | 'time' | 'Time';
FILESIZE : 'SIZE' | 'size' | 'Size';
TYPE : 'TYPE' | 'type' | 'Type';
COMPONENT_ID : 'COMPONENTID' | 'componentid' | 'ComponentId' | 'componentId' | 'componentID' | 'ComponentID';
COMPONENT_TYPE : 'COMPONENTTYPE' | 'componenttype' | 'ComponentType' | 'componentType';
UUID : 'UUID' | 'uuid' | 'Uuid';
RELATIONSHIP : 'RELATIONSHIP' | 'relationship' | 'Relationship';
DETAILS : 'DETAILS' | 'details' | 'Details';
// Event Types
RECEIVE : 'RECEIVE' | 'receive' | 'Receive';
SEND : 'SEND' | 'send' | 'Send';
DROP : 'DROP' | 'drop' | 'Drop';
CREATE : 'CREATE' | 'create' | 'Create';
EXPIRE : 'EXPIRE' | 'expire' | 'Expire';
FORK : 'FORK' | 'fork' | 'Fork';
JOIN : 'JOIN' | 'join' | 'Join';
CLONE : 'CLONE' | 'clone' | 'Clone';
CONTENT_MODIFIED : 'CONTENT_MODIFIED' | 'content_modified' | 'Content_Modified';
ATTRIBUTES_MODIFIED : 'ATTRIBUTES_MODIFIED' | 'attributes_modified' | 'Attributes_Modified';
ROUTE : 'ROUTE' | 'route' | 'Route';
REPLAY : 'REPLAY' | 'replay' | 'Replay';
IDENTIFIER : (
('a'..'z' | 'A'..'Z' | '$')
('a'..'z' | 'A'..'Z' | '$' | '0'..'9' | '_' )*
);
// STRINGS
STRING_LITERAL
@init{StringBuilder lBuf = new StringBuilder();}
:
(
'"'
(
escaped=ESC {lBuf.append(getText());} |
normal = ~( '"' | '\\' | '\n' | '\r' | '\t' ) { lBuf.appendCodePoint(normal);}
)*
'"'
)
{
setText(lBuf.toString());
}
|
(
'\''
(
escaped=ESC {lBuf.append(getText());} |
normal = ~( '\'' | '\\' | '\n' | '\r' | '\t' ) { lBuf.appendCodePoint(normal);}
)*
'\''
)
{
setText(lBuf.toString());
}
;
fragment
ESC
: '\\'
(
'"' { setText("\""); }
| '\'' { setText("\'"); }
| 'r' { setText("\r"); }
| 'n' { setText("\n"); }
| 't' { setText("\t"); }
| '\\' { setText("\\\\"); }
| nextChar = ~('"' | '\'' | 'r' | 'n' | 't' | '\\')
{
StringBuilder lBuf = new StringBuilder(); lBuf.append("\\\\").appendCodePoint(nextChar); setText(lBuf.toString());
}
)
;