diff --git a/pom.xml b/pom.xml
index aea79c1..eeae816 100644
--- a/pom.xml
+++ b/pom.xml
@@ -117,6 +117,10 @@
+
+ false
+ true
+
org.apache.maven.plugins
diff --git a/src/main/antlr4/io/github/willena/influxql/parser/InfluxqlLexer.g4 b/src/main/antlr4/io/github/willena/influxql/parser/InfluxqlLexer.g4
new file mode 100644
index 0000000..b04771c
--- /dev/null
+++ b/src/main/antlr4/io/github/willena/influxql/parser/InfluxqlLexer.g4
@@ -0,0 +1,146 @@
+lexer grammar InfluxqlLexer;
+
+options {
+ caseInsensitive = true;
+}
+
+QUOTE: '"';
+SCOL : ';';
+DOT : '.';
+OPEN_PAR : '(';
+CLOSE_PAR : ')';
+COMMA : ',';
+ASSIGN : '=';
+STAR : '*';
+PLUS : '+';
+MINUS : '-';
+TILDE : '~';
+SLASH : '/';
+MOD : '%';
+LT2 : '<<';
+GT2 : '>>';
+AMP : '&';
+LT : '<';
+LT_EQ : '<=';
+GT : '>';
+GT_EQ : '>=';
+EQ : '==';
+NOT_EQ1 : '!=';
+NOT_EQ2 : '<>';
+REG_MATCH: '=~';
+OR_EX: '^';
+PIPE: '|';
+PIPE2: '||';
+START_TAGS: STAR '::tag';
+START_FIELD: STAR '::field';
+
+// Keywords
+AND: 'AND';
+OR: 'OR';
+ALL: 'ALL';
+ALTER: 'ALTER';
+ANALYZE: 'ANALYZE';
+ANY: 'ANY';
+AS: 'AS';
+ASC: 'ASC';
+BEGIN: 'BEGIN';
+BY: 'BY';
+CREATE: 'CREATE';
+CONTINUOUS: 'CONTINUOUS';
+DATABASE: 'DATABASE';
+DATABASES: 'DATABASES';
+DEFAULT: 'DEFAULT';
+DELETE: 'DELETE';
+DESC: 'DESC';
+DESTINATIONS: 'DESTINATIONS';
+DIAGNOSTICS: 'DIAGNOSTICS';
+DISTINCT: 'DISTINCT';
+DROP: 'DROP';
+DURATION: 'DURATION';
+END: 'END';
+EVERY: 'EVERY';
+EXPLAIN: 'EXPLAIN';
+FIELD: 'FIELD';
+FOR: 'FOR';
+FROM: 'FROM';
+GRANT: 'GRANT';
+GRANTS: 'GRANTS';
+GROUP: 'GROUP';
+GROUPS: 'GROUPS';
+IN: 'IN';
+INF: 'INF';
+INSERT: 'INSERT';
+INTO: 'INTO';
+KEY: 'KEY';
+KEYS: 'KEYS';
+KILL: 'KILL';
+LIMIT: 'LIMIT';
+SHOW: 'SHOW';
+MEASUREMENT: 'MEASUREMENT';
+MEASUREMENTS: 'MEASUREMENTS';
+NAME: 'NAME';
+OFFSET: 'OFFSET';
+ON: 'ON';
+ORDER: 'ORDER';
+PASSWORD: 'PASSWORD';
+POLICY: 'POLICY';
+POLICIES: 'POLICIES';
+PRIVILEGES: 'PRIVILEGES';
+QUERIES: 'QUERIES';
+QUERY: 'QUERY';
+READ: 'READ';
+REPLICATION: 'REPLICATION';
+RESAMPLE: 'RESAMPLE';
+RETENTION: 'RETENTION';
+REVOKE: 'REVOKE';
+SELECT: 'SELECT';
+SERIES: 'SERIES';
+SET: 'SET';
+SHARD: 'SHARD';
+SHARDS: 'SHARDS';
+SLIMIT: 'SLIMIT';
+SOFFSET: 'SOFFSET';
+STATS: 'STATS';
+SUBSCRIPTION: 'SUBSCRIPTION';
+SUBSCRIPTIONS: 'SUBSCRIPTIONS';
+TAG: 'TAG';
+TO: 'TO';
+USER: 'USER';
+USERS: 'USERS';
+VALUES: 'VALUES';
+WHERE: 'WHERE';
+WITH: 'WITH';
+WRITE: 'WRITE';
+CARDINALITY: 'CARDINALITY';
+EXACT: 'EXACT';
+
+FILL: 'FILL';
+NULL: 'NULL';
+NONE: 'NONE';
+PREVIOUS: 'PREVIOUS';
+LINEAR: 'LINEAR';
+TZ: 'TZ';
+TRUE: 'TRUE';
+FALSE: 'FALSE';
+MEASUREMENT_BACK_REF: '.:MEASUREMENT';
+
+IDENTIFIER:
+ '"' (~'"' | '""')* '"'
+ | '`' (~'`' | '``')* '`'
+ | [A-Z_\u007F-\uFFFF] [A-Z_0-9\u007F-\uFFFF]*
+ ;
+
+INTEGER_LITERAL: DIGIT+;
+NUMERIC_LITERAL: (DIGIT+ ('.' DIGIT*)? | '.' DIGIT+);
+STRING_LITERAL: '\'' ( ~'\'' | '\'\'')* '\'';
+
+DURATION_LITERAL: INTEGER_LITERAL ('ns' | 'u' | 'µ' | 'ms' | 's' | 'm' | 'h' | 'd' | 'w');
+
+REGULAR_EXPRESSION_LITERAL: '/' UNICODE_CHAR* '/';
+
+UNICODE_CHAR: ~[ \t\r\n];
+
+fragment DIGIT: [0-9];
+
+SPACES: [ \u000B\t\r\n] -> channel(HIDDEN);
+UNEXPECTED_CHAR: .;
diff --git a/src/main/antlr4/io/github/willena/influxql/parser/InfluxqlParser.g4 b/src/main/antlr4/io/github/willena/influxql/parser/InfluxqlParser.g4
index 955e557..f4c669d 100644
--- a/src/main/antlr4/io/github/willena/influxql/parser/InfluxqlParser.g4
+++ b/src/main/antlr4/io/github/willena/influxql/parser/InfluxqlParser.g4
@@ -15,10 +15,10 @@
* limitations under the License.
*/
-grammar InfluxqlParser;
+parser grammar InfluxqlParser;
options {
- caseInsensitive = true;
+ tokenVocab = InfluxqlLexer;
}
// ------------- PARSER ---------------------
@@ -54,7 +54,9 @@ statement : alter_retention_policy_stmt |
show_shards_stmt |
show_subscriptions_stmt|
show_tag_keys_stmt |
+ show_tag_key_cardinality_stmt
show_tag_values_stmt |
+ show_tag_values_cardinality_stmt
show_users_stmt |
revoke_stmt |
select_stmt ;
@@ -64,32 +66,38 @@ create_continuous_query_stmt: CREATE CONTINUOUS QUERY query_name=IDENTIFIER on_c
create_database_stmt: CREATE DATABASE db_name=IDENTIFIER ( WITH retention_policy_duration? retention_policy_replication? retention_policy_shard_group_duration? retention_policy_name? )?;
create_retention_policy_stmt : CREATE RETENTION POLICY policy_name=IDENTIFIER on_clause retention_policy_duration retention_policy_replication ( retention_policy_shard_group_duration )? ( DEFAULT )?;
create_subscription_stmt : CREATE SUBSCRIPTION subscription_name=IDENTIFIER ON db_name=IDENTIFIER DOT retention_policy=IDENTIFIER DESTINATIONS (ANY|ALL) host=STRING_LITERAL ( COMMA host=STRING_LITERAL)*;
-create_user_stmt : CREATE USER user_name=IDENTIFIER WITH PASSWORD password=STRING_LITERAL ( WITH ALL PRIVILEGES )?;
+create_user_stmt : CREATE USER user_name=IDENTIFIER WITH PASSWORD password=STRING_LITERAL (WITH ALL PRIVILEGES)?;
delete_stmt : DELETE ( from_clause | where_clause | from_clause where_clause );
drop_continuous_query_stmt : DROP CONTINUOUS QUERY query_name=IDENTIFIER on_clause;
drop_database_stmt : DROP DATABASE db_name=IDENTIFIER;
-drop_measurement_stmt : DROP MEASUREMENT measurement;
+// Drop measurement does not currently support the full range of rules (limitation of influxdb) and has been updated
+// The described grammar on influx website should be:
+// drop_measurement_stmt : DROP MEASUREMENT measurement;
+drop_measurement_stmt : DROP MEASUREMENT measurement_value=IDENTIFIER;
drop_retention_policy_stmt : DROP RETENTION POLICY policy_name=IDENTIFIER on_clause;
drop_series_stmt : DROP SERIES ( from_clause | where_clause | from_clause where_clause );
-drop_shard_stmt : DROP SHARD ( shard_id=NUMERIC_LITERAL );
+drop_shard_stmt : DROP SHARD ( shard_id=INTEGER_LITERAL );
drop_subscription_stmt : DROP SUBSCRIPTION subscription_name=IDENTIFIER ON db_name=IDENTIFIER DOT retention_policy=IDENTIFIER;
-drop_user_stmt : DROP USER user_name=IDENTIFIER ;
+drop_user_stmt : DROP USER user_name=IDENTIFIER;
explain_stmt : EXPLAIN ANALYZE? select_stmt;
grant_stmt : GRANT privilege on_clause? to_clause;
-kill_query_statement : KILL QUERY query_id=NUMERIC_LITERAL;
+// On host is only available for cluster installation of influxdb
+kill_query_statement : KILL QUERY query_id=INTEGER_LITERAL (ON host=STRING_LITERAL)?;
show_continuous_queries_stmt : SHOW CONTINUOUS QUERIES;
show_databases_stmt : SHOW DATABASES;
-show_field_keys_stmt : SHOW FIELD KEYS from_clause?;
-show_grants_stmt : SHOW GRANTS FOR user_name=IDENTIFIER ;
+show_field_keys_stmt : SHOW FIELD KEYS on_clause? from_clause? order_by_clause? limit_clause? offset_clause?;
+show_grants_stmt : SHOW GRANTS FOR user_name=IDENTIFIER;
show_measurements_stmt : SHOW MEASUREMENTS on_clause? with_measurement_clause? where_clause? limit_clause? offset_clause?;
show_queries_stmt : SHOW QUERIES;
show_retention_policies : SHOW RETENTION POLICIES on_clause;
-show_series_stmt : SHOW SERIES from_clause? where_clause? limit_clause? offset_clause?;
+show_series_stmt : SHOW SERIES on_clause? from_clause? where_clause? limit_clause? offset_clause?;
show_shard_groups_stmt : SHOW SHARD GROUPS;
show_shards_stmt : SHOW SHARDS;
show_subscriptions_stmt : SHOW SUBSCRIPTIONS;
-show_tag_keys_stmt : SHOW TAG KEYS from_clause? where_clause? group_by_clause? limit_clause? offset_clause?;
-show_tag_values_stmt : SHOW TAG VALUES from_clause? with_tag_clause where_clause? group_by_clause? limit_clause? offset_clause?;
+show_tag_keys_stmt : SHOW TAG KEYS on_clause? from_clause? where_clause? order_by_clause? limit_clause? offset_clause?;
+show_tag_key_cardinality_stmt: SHOW TAG KEY EXACT? CARDINALITY on_clause? from_clause? where_clause? group_by_clause? limit_clause? offset_clause?;
+show_tag_values_stmt : SHOW TAG VALUES on_clause? from_clause? with_tag_clause where_clause? limit_clause? offset_clause?;
+show_tag_values_cardinality_stmt: SHOW TAG VALUES EXACT? CARDINALITY on_clause? from_clause? where_clause? group_by_clause? limit_clause? offset_clause? with_tag_clause;
show_users_stmt : SHOW USERS;
revoke_stmt : REVOKE privilege on_clause? FROM user_name=IDENTIFIER ;
select_stmt : SELECT fields from_clause into_clause? where_clause? group_by_clause? order_by_clause? limit_clause? offset_clause? slimit_clause? soffset_clause? timezone_clause?;
@@ -100,7 +108,7 @@ every_stmt: EVERY DURATION_LITERAL;
for_stmt: FOR DURATION_LITERAL;
alias: AS IDENTIFIER;
-back_ref: ( policy_name=IDENTIFIER '.:MEASUREMENT' ) | ( db_name=IDENTIFIER '.' ( policy_name=IDENTIFIER )? '.:MEASUREMENT' );
+back_ref: ( policy_name=IDENTIFIER MEASUREMENT_BACK_REF ) | ( db_name=IDENTIFIER DOT ( policy_name=IDENTIFIER )? MEASUREMENT_BACK_REF );
dimension : expression;
dimensions : dimension ( COMMA dimension )*;
field: expression ( alias )?;
@@ -111,11 +119,11 @@ measurment_with_rp: policy_name=IDENTIFIER DOT simple_measurement_name;
measurement_with_rp_and_database: db_name=IDENTIFIER (DOT policy_name=IDENTIFIER )? DOT simple_measurement_name;
measurements: measurement ( COMMA measurement )*;
simple_measurement_name : IDENTIFIER | REGULAR_EXPRESSION_LITERAL;
-privilege: ALL PRIVILEGES? | READ | WRITE;
+privilege: (ALL PRIVILEGES?) | READ | WRITE;
retention_policy_option : retention_policy_duration | retention_policy_replication | retention_policy_shard_group_duration | DEFAULT;
retention_policy_duration : DURATION DURATION_LITERAL;
-retention_policy_replication : REPLICATION NUMERIC_LITERAL;
+retention_policy_replication : REPLICATION INTEGER_LITERAL;
retention_policy_shard_group_duration : SHARD DURATION DURATION_LITERAL;
retention_policy_name : NAME IDENTIFIER;
@@ -123,160 +131,65 @@ sort_field : field_key=IDENTIFIER ( ASC | DESC )?;
sort_fields : sort_field ( COMMA sort_field )*;
tag_keys : tag_key=IDENTIFIER ( COMMA tag_key=IDENTIFIER )*;
var_ref : measurement;
-binary_op : PLUS | MINUS | STAR | SLASH | MOD | AMP | PIPE | OR_EX | AND | OR | ASSIGN | NOT_EQ1 | NOT_EQ2 | LT | LT_EQ | GT | GT_EQ;
+//binary_op : PLUS | MINUS | STAR | SLASH | MOD | AMP | PIPE | OR_EX| AND | OR | ASSIGN | NOT_EQ1 | NOT_EQ2 | LT | LT_EQ | GT | GT_EQ;
-expression : unary_expr ( binary_op unary_expr )*;
-unary_expr : group_expr | call | var_ref | literal_expr;
+//expression : unary_expr ( binary_op unary_expr )*;
+//unary_expr : group_expr | call | var_ref | literal_expr;
group_expr: OPEN_PAR expression CLOSE_PAR;
-literal_expr: STRING_LITERAL | NUMERIC_LITERAL | TRUE | FALSE | DURATION_LITERAL;
+//literal_expr: STRING_LITERAL | signed_number | TRUE | FALSE | DURATION_LITERAL;
+//signed_number: (PLUS|MINUS)? NUMERIC_LITERAL;
call: IDENTIFIER OPEN_PAR expression CLOSE_PAR;
+unary_operator
+ : MINUS
+ | PLUS
+ | TILDE;
+
+expression
+ : literal_value
+ | unary_operator expression
+ | expression PIPE2 expression
+ | expression ( STAR | SLASH | MOD) expression
+ | expression ( PLUS | MINUS) expression
+ | expression ( LT2 | GT2 | AMP | PIPE | OR_EX) expression
+ | expression ( LT | LT_EQ | GT | GT_EQ) expression
+ | expression (
+ ASSIGN
+ | EQ
+ | NOT_EQ1
+ | NOT_EQ2
+ ) expression
+ | expression AND expression
+ | expression OR expression
+ | call
+ | group_expr
+ | var_ref
+ | STAR | START_FIELD | START_TAGS
+;
+
+literal_value
+ : INTEGER_LITERAL
+ | NUMERIC_LITERAL
+ | STRING_LITERAL
+ | DURATION_LITERAL
+ | NULL
+ | TRUE
+ | FALSE
+;
+
from_clause : FROM measurements;
group_by_clause : GROUP BY dimensions fill_clause?;
into_clause : INTO ( measurement | back_ref );
-limit_clause : LIMIT NUMERIC_LITERAL;
-offset_clause : OFFSET NUMERIC_LITERAL;
-slimit_clause : SLIMIT NUMERIC_LITERAL;
-soffset_clause : SOFFSET NUMERIC_LITERAL;
+limit_clause : LIMIT INTEGER_LITERAL;
+offset_clause : OFFSET INTEGER_LITERAL;
+slimit_clause : SLIMIT INTEGER_LITERAL;
+soffset_clause : SOFFSET INTEGER_LITERAL;
timezone_clause : TZ OPEN_PAR STRING_LITERAL CLOSE_PAR;
on_clause : ON db_name=IDENTIFIER;
fill_clause: FILL OPEN_PAR fill_option CLOSE_PAR;
order_by_clause: ORDER BY sort_fields;
-to_clause : TO user_name= IDENTIFIER ;
+to_clause : TO user_name=IDENTIFIER ;
where_clause : WHERE expression;
with_measurement_clause : WITH MEASUREMENT ( EQ measurement | REG_MATCH REGULAR_EXPRESSION_LITERAL );
-with_tag_clause : WITH KEY ( ASSIGN tag_key=IDENTIFIER | NOT_EQ1 tag_key=IDENTIFIER | REG_MATCH REGULAR_EXPRESSION_LITERAL | IN OPEN_PAR tag_keys CLOSE_PAR );
-
-QUOTE: '"';
-SCOL : ';';
-DOT : '.';
-OPEN_PAR : '(';
-CLOSE_PAR : ')';
-COMMA : ',';
-ASSIGN : '=';
-STAR : '*';
-PLUS : '+';
-MINUS : '-';
-TILDE : '~';
-SLASH : '/';
-MOD : '%';
-LT2 : '<<';
-GT2 : '>>';
-AMP : '&';
-LT : '<';
-LT_EQ : '<=';
-GT : '>';
-GT_EQ : '>=';
-EQ : '==';
-NOT_EQ1 : '!=';
-NOT_EQ2 : '<>';
-REG_MATCH: '=~';
-OR_EX: '^';
-PIPE: '|';
-PIPE2: '||';
-
-// Keywords
-AND: 'AND';
-OR: 'OR';
-ALL: 'ALL';
-ALTER: 'ALTER';
-ANALYZE: 'ANALYZE';
-ANY: 'ANY';
-AS: 'AS';
-ASC: 'ASC';
-BEGIN: 'BEGIN';
-BY: 'BY';
-CREATE: 'CREATE';
-CONTINUOUS: 'CONTINUOUS';
-DATABASE: 'DATABASE';
-DATABASES: 'DATABASES';
-DEFAULT: 'DEFAULT';
-DELETE: 'DELETE';
-DESC: 'DESC';
-DESTINATIONS: 'DESTINATIONS';
-DIAGNOSTICS: 'DIAGNOSTICS';
-DISTINCT: 'DISTINCT';
-DROP: 'DROP';
-DURATION: 'DURATION';
-END: 'END';
-EVERY: 'EVERY';
-EXPLAIN: 'EXPLAIN';
-FIELD: 'FIELD';
-FOR: 'FOR';
-FROM: 'FROM';
-GRANT: 'GRANT';
-GRANTS: 'GRANTS';
-GROUP: 'GROUP';
-GROUPS: 'GROUPS';
-IN: 'IN';
-INF: 'INF';
-INSERT: 'INSERT';
-INTO: 'INTO';
-KEY: 'KEY';
-KEYS: 'KEYS';
-KILL: 'KILL';
-LIMIT: 'LIMIT';
-SHOW: 'SHOW';
-MEASUREMENT: 'MEASUREMENT';
-MEASUREMENTS: 'MEASUREMENTS';
-NAME: 'NAME';
-OFFSET: 'OFFSET';
-ON: 'ON';
-ORDER: 'ORDER';
-PASSWORD: 'PASSWORD';
-POLICY: 'POLICY';
-POLICIES: 'POLICIES';
-PRIVILEGES: 'PRIVILEGES';
-QUERIES: 'QUERIES';
-QUERY: 'QUERY';
-READ: 'READ';
-REPLICATION: 'REPLICATION';
-RESAMPLE: 'RESAMPLE';
-RETENTION: 'RETENTION';
-REVOKE: 'REVOKE';
-SELECT: 'SELECT';
-SERIES: 'SERIES';
-SET: 'SET';
-SHARD: 'SHARD';
-SHARDS: 'SHARDS';
-SLIMIT: 'SLIMIT';
-SOFFSET: 'SOFFSET';
-STATS: 'STATS';
-SUBSCRIPTION: 'SUBSCRIPTION';
-SUBSCRIPTIONS: 'SUBSCRIPTIONS';
-TAG: 'TAG';
-TO: 'TO';
-USER: 'USER';
-USERS: 'USERS';
-VALUES: 'VALUES';
-WHERE: 'WHERE';
-WITH: 'WITH';
-WRITE: 'WRITE';
-
-FILL: 'FILL';
-NULL: 'NULL';
-NONE: 'NONE';
-PREVIOUS: 'PREVIOUS';
-LINEAR: 'LINEAR';
-TZ: 'tz';
-TRUE: 'TRUE';
-FALSE: 'FALSE';
-
-IDENTIFIER:
- '"' (~'"' | '""')* '"'
- | '`' (~'`' | '``')* '`'
- | [A-Z_\u007F-\uFFFF] [A-Z_0-9\u007F-\uFFFF]*
- ;
-
-NUMERIC_LITERAL: (DIGIT+ ('.' DIGIT*)?) | ('.' DIGIT+);
-STRING_LITERAL: '\'' ( ~'\'' | '\'\'')* '\'';
-
-DURATION_LITERAL: ([1-9] DIGIT*)+ ('u' | 'µ' | 'ms' | 's' | 'm' | 'h' | 'd' | 'w');
-REGULAR_EXPRESSION_LITERAL: '/' UNICODE_CHAR* '/';
-
-UNICODE_CHAR: ~[ \t\r\n];
-
-fragment DIGIT: [0-9];
+with_tag_clause : WITH KEY ( op=ASSIGN tag_key=IDENTIFIER | op=NOT_EQ1 tag_key=IDENTIFIER | op=REG_MATCH tag_key=REGULAR_EXPRESSION_LITERAL | op=IN OPEN_PAR tag_keys CLOSE_PAR );
-SPACES: [ \u000B\t\r\n] -> channel(HIDDEN);
-UNEXPECTED_CHAR: .;
diff --git a/src/main/java/io/github/willena/influxql/ast/expr/Dimensions.java b/src/main/java/io/github/willena/influxql/ast/expr/Dimensions.java
index caf1fe5..ea7ad2c 100644
--- a/src/main/java/io/github/willena/influxql/ast/expr/Dimensions.java
+++ b/src/main/java/io/github/willena/influxql/ast/expr/Dimensions.java
@@ -17,11 +17,12 @@
package io.github.willena.influxql.ast.expr;
+import io.github.willena.influxql.ast.Node;
import io.github.willena.influxql.ast.utils.StringJoiningList;
import java.util.List;
/** Dimensions list */
-public class Dimensions extends StringJoiningList {
+public class Dimensions extends StringJoiningList implements Node {
/**
* Create using initialized list
*
diff --git a/src/main/java/io/github/willena/influxql/ast/expr/literal/IdentifierlLiteral.java b/src/main/java/io/github/willena/influxql/ast/expr/literal/IdentifierlLiteral.java
new file mode 100644
index 0000000..0b249f9
--- /dev/null
+++ b/src/main/java/io/github/willena/influxql/ast/expr/literal/IdentifierlLiteral.java
@@ -0,0 +1,56 @@
+/*
+ * InfluxQL Java package
+ * Copyright 2024 Guillaume VILLENA also known as "Willena" on GitHub
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.github.willena.influxql.ast.expr.literal;
+
+import io.github.willena.influxql.ast.Literal;
+
+import static io.github.willena.influxql.ast.utils.Utils.*;
+
+public class IdentifierlLiteral implements Literal {
+ private final String value;
+
+ /**
+ * Build string literal
+ *
+ * @param value string
+ */
+ public IdentifierlLiteral(String value) {
+ this.value = value;
+ ensureDefined("value", value);
+ }
+
+ /**
+ * Create string literal
+ *
+ * @param value string
+ * @return literal
+ */
+ public static IdentifierlLiteral of(String value) {
+ return new IdentifierlLiteral(value);
+ }
+
+ @Override
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return quoteIdentifier(value);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/io/github/willena/influxql/ast/expr/literal/ListLiteral.java b/src/main/java/io/github/willena/influxql/ast/expr/literal/ListLiteral.java
index 7b029c4..9804906 100644
--- a/src/main/java/io/github/willena/influxql/ast/expr/literal/ListLiteral.java
+++ b/src/main/java/io/github/willena/influxql/ast/expr/literal/ListLiteral.java
@@ -25,16 +25,16 @@
import java.util.List;
/** List of string value literal */
-public class ListLiteral implements Literal> {
- private final List values;
+public class ListLiteral implements Literal>> {
+ private final List> values;
/**
* New list literal given an input list of string
*
* @param values list
*/
- public ListLiteral(final List values) {
- this.values = new StringJoiningList<>(values, Utils::quoteIdentifier);
+ public ListLiteral(final List> values) {
+ this.values = new StringJoiningList<>(values);
ensureDefined("values", values);
}
@@ -44,7 +44,7 @@ public ListLiteral(final List values) {
* @param values list
* @return ListLiteral
*/
- public static ListLiteral of(final List values) {
+ public static ListLiteral of(final List> values) {
return new ListLiteral(values);
}
@@ -54,12 +54,12 @@ public static ListLiteral of(final List values) {
* @param values list
* @return ListLiteral
*/
- public static ListLiteral of(String... values) {
+ public static ListLiteral of(Literal>... values) {
return of(List.of(values));
}
@Override
- public List getValue() {
+ public List> getValue() {
return values;
}
diff --git a/src/main/java/io/github/willena/influxql/ast/field/Fields.java b/src/main/java/io/github/willena/influxql/ast/field/Fields.java
index 3347f0a..d47da14 100644
--- a/src/main/java/io/github/willena/influxql/ast/field/Fields.java
+++ b/src/main/java/io/github/willena/influxql/ast/field/Fields.java
@@ -17,11 +17,12 @@
package io.github.willena.influxql.ast.field;
+import io.github.willena.influxql.ast.Node;
import io.github.willena.influxql.ast.utils.StringJoiningList;
import java.util.List;
/** List of fields */
-public class Fields extends StringJoiningList {
+public class Fields extends StringJoiningList implements Node {
/**
* Create initialized list of field
*
diff --git a/src/main/java/io/github/willena/influxql/ast/field/SortFields.java b/src/main/java/io/github/willena/influxql/ast/field/SortFields.java
index 1e77135..64d1247 100644
--- a/src/main/java/io/github/willena/influxql/ast/field/SortFields.java
+++ b/src/main/java/io/github/willena/influxql/ast/field/SortFields.java
@@ -17,11 +17,12 @@
package io.github.willena.influxql.ast.field;
+import io.github.willena.influxql.ast.Node;
import io.github.willena.influxql.ast.utils.StringJoiningList;
import java.util.List;
/** List of sort fields */
-public class SortFields extends StringJoiningList {
+public class SortFields extends StringJoiningList implements Node {
/**
* Create initialized list
*
diff --git a/src/main/java/io/github/willena/influxql/ast/source/Sources.java b/src/main/java/io/github/willena/influxql/ast/source/Sources.java
index 540a454..92b99bf 100644
--- a/src/main/java/io/github/willena/influxql/ast/source/Sources.java
+++ b/src/main/java/io/github/willena/influxql/ast/source/Sources.java
@@ -17,13 +17,14 @@
package io.github.willena.influxql.ast.source;
+import io.github.willena.influxql.ast.Node;
import io.github.willena.influxql.ast.Source;
import io.github.willena.influxql.ast.utils.StringJoiningList;
import java.util.Arrays;
import java.util.List;
/** List of {@link Source} */
-public class Sources extends StringJoiningList