Skip to content

Commit

Permalink
Merge branch 'feature/query-dsl'
Browse files Browse the repository at this point in the history
  • Loading branch information
tonydamage committed Jan 11, 2021
2 parents 92d1051 + 374fd9f commit f21005a
Show file tree
Hide file tree
Showing 9 changed files with 746 additions and 16 deletions.
1 change: 0 additions & 1 deletion infra/axiom/pom.xml
Expand Up @@ -37,7 +37,6 @@
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>4.8-1</version>
</dependency>
<!-- test dependencies -->
<dependency>
Expand Down
@@ -0,0 +1,75 @@
grammar AxiomQuery;

SEMICOLON : ';';
LEFT_BRACE : '{';
RIGHT_BRACE : '}';
COLON : ':';
PLUS : '+';
LINE_COMMENT : [ \n\r\t]* ('//' (~[\r\n]*)) [ \n\r\t]* -> skip;
SEP: [ \n\r\t]+;

AND_KEYWORD: 'and';
OR_KEYWORD: 'or';
NOT_KEYWORD: 'not';
IDENTIFIER : [a-zA-Z_][a-zA-Z0-9_\-]*;

fragment SQOUTE : '\'';
fragment DQOUTE : '"';

fragment ESC : '\\';

STRING_SINGLEQUOTE: SQOUTE ((ESC SQOUTE) | ~[\n'])* SQOUTE;
STRING_DOUBLEQUOTE: DQOUTE ((ESC DQOUTE) | ~[\n"])* DQOUTE;
STRING_MULTILINE_START: '"""' ('\r')? '\n';
//statement : SEP* identifier SEP* (argument)? SEP* (SEMICOLON | LEFT_BRACE SEP* (statement)* SEP* RIGHT_BRACE SEP*) SEP*;
itemName: prefixedName #dataName
| '@' prefixedName #infraName;
prefixedName: (prefix=IDENTIFIER COLON)? localName=IDENTIFIER
| (prefix=IDENTIFIER)? COLON localName=(AND_KEYWORD | NOT_KEYWORD | OR_KEYWORD);
argument : prefixedName | string;
string : STRING_SINGLEQUOTE #singleQuoteString
| STRING_DOUBLEQUOTE #doubleQuoteString
| STRING_MULTILINE_START (~('"""'))*'"""' # multilineString;
variable: '$' itemName;
parent: '..';
// Path could start with ../ or context variable ($var) or item name
firstComponent: (parent ( '/' parent )*) | variable | pathComponent;
path: firstComponent ( '/' pathComponent)*;
pathComponent: itemName (pathValue)?;
pathValue: '[' argument ']';
// Aliases for basic filters (equals, less, greater, lessOrEquals, greaterOrEquals
//
filterNameAlias: '=' | '<' | '>' | '<=' | '>=';
filterName: prefixedName | filterNameAlias;
matchingRule: '[' prefixedName ']';
// Currently value could be string or path
valueSpecification: string | path;
negation: NOT_KEYWORD;
// Filter could be Value filter or Logic Filter
filter: left=filter (SEP+ AND_KEYWORD SEP+ right=filter) #andFilter
| left=filter (SEP+ OR_KEYWORD SEP+ right=filter) #orFilter
| itemFilter #genFilter
| subfilter #subFilter;
subfilter: '(' SEP* filter SEP* ')';
itemFilter: path (SEP+ negation)? SEP+ filterName (matchingRule)? (SEP+ (subfilterOrValue))?;
subfilterOrValue : subfilter | valueSpecification;
Expand Up @@ -144,26 +144,14 @@ static String convertToString(ArgumentContext context) {

static String convert(StringContext string) {
if(string.singleQuoteString() != null) {
return convertSingleQuote(string.singleQuoteString().getText());
return AxiomAntlrLiterals.convertSingleQuote(string.singleQuoteString().getText());
}
if(string.doubleQuoteString() != null) {
return covertDoubleQuote(string.doubleQuoteString().getText());
return AxiomAntlrLiterals.convertDoubleQuote(string.doubleQuoteString().getText());
}
return convertMultiline(string.multilineString().getText());
return AxiomAntlrLiterals.convertMultiline(string.multilineString().getText());
}

private static String convertSingleQuote(String text) {
int stop = text.length();
return text.substring(1, stop - 1);
}

private static String covertDoubleQuote(String text) {
int stop = text.length();
return text.substring(1, stop - 1);
}

private static String convertMultiline(String text) {
return text.replace("\"\"\"", "");
}

}
@@ -0,0 +1,18 @@
package com.evolveum.axiom.lang.antlr;

public class AxiomAntlrLiterals {

public static String convertSingleQuote(String text) {
int stop = text.length();
return text.substring(1, stop - 1);
}

public static String convertDoubleQuote(String text) {
int stop = text.length();
return text.substring(1, stop - 1);
}

public static String convertMultiline(String text) {
return text.replace("\"\"\"", "");
}
}
@@ -0,0 +1,30 @@
package com.evolveum.axiom.lang.antlr;

import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CodePointCharStream;
import org.antlr.v4.runtime.CommonTokenStream;

import com.evolveum.axiom.lang.antlr.query.AxiomQueryLexer;
import com.evolveum.axiom.lang.antlr.query.AxiomQueryParser;
import com.evolveum.axiom.lang.antlr.query.AxiomQueryParser.FilterContext;

public class AxiomQuerySource {

private final FilterContext root;

public AxiomQuerySource(FilterContext root) {
this.root = root;
}

public static final AxiomQuerySource from(String query) {
CodePointCharStream stream = CharStreams.fromString(query);
AxiomQueryLexer lexer = new AxiomQueryLexer(stream);
AxiomQueryParser parser = new AxiomQueryParser(new CommonTokenStream(lexer));
FilterContext root = parser.filter();
return new AxiomQuerySource(root);
}

public FilterContext root() {
return root;
}
}
6 changes: 6 additions & 0 deletions infra/prism-impl/pom.xml
Expand Up @@ -26,6 +26,12 @@
<artifactId>axiom</artifactId>
<version>4.3-SNAPSHOT</version>
</dependency>

<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
</dependency>

<dependency>
<groupId>com.evolveum.midpoint.infra</groupId>
<artifactId>util</artifactId>
Expand Down

0 comments on commit f21005a

Please sign in to comment.