blob: 3e64da49695ed2ee4bd376eef364600d869654c7 [file] [log] [blame]
vinayakb38b7ca42012-03-05 05:44:15 +00001options {
2
Taewoo Kima12d8cd2015-03-04 13:47:08 -08003
vinayakb38b7ca42012-03-05 05:44:15 +00004 STATIC = false;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08005
vinayakb38b7ca42012-03-05 05:44:15 +00006}
7
8
9PARSER_BEGIN(AQLParser)
10
11package edu.uci.ics.asterix.aql.parser;
12
Eldon Carmand2d78ad2015-05-07 16:23:41 -070013// For AQLParserTokenManager
Till Westmann96c1f172013-08-01 02:05:48 -070014import org.apache.xerces.util.IntStack;
15
Eldon Carmand2d78ad2015-05-07 16:23:41 -070016import java.io.BufferedReader;
17import java.io.File;
18import java.io.FileInputStream;
19import java.io.FileNotFoundException;
20import java.io.IOException;
21import java.io.InputStreamReader;
22import java.io.Reader;
23import java.io.StringReader;
24import java.util.ArrayList;
25import java.util.HashMap;
26import java.util.LinkedHashMap;
27import java.util.List;
28import java.util.Map;
29
30import edu.uci.ics.asterix.aql.base.Clause;
31import edu.uci.ics.asterix.aql.base.Expression;
32import edu.uci.ics.asterix.aql.base.Literal;
33import edu.uci.ics.asterix.aql.base.Statement;
34import edu.uci.ics.asterix.aql.context.RootScopeFactory;
35import edu.uci.ics.asterix.aql.context.Scope;
36import edu.uci.ics.asterix.aql.expression.AbstractAccessor;
37import edu.uci.ics.asterix.aql.expression.CallExpr;
38import edu.uci.ics.asterix.aql.expression.CompactStatement;
39import edu.uci.ics.asterix.aql.expression.ConnectFeedStatement;
40import edu.uci.ics.asterix.aql.expression.CreateDataverseStatement;
41import edu.uci.ics.asterix.aql.expression.CreateFeedStatement;
42import edu.uci.ics.asterix.aql.expression.CreateFunctionStatement;
43import edu.uci.ics.asterix.aql.expression.CreateIndexStatement;
44import edu.uci.ics.asterix.aql.expression.DatasetDecl;
45import edu.uci.ics.asterix.aql.expression.DataverseDecl;
46import edu.uci.ics.asterix.aql.expression.DataverseDropStatement;
47import edu.uci.ics.asterix.aql.expression.DeleteStatement;
48import edu.uci.ics.asterix.aql.expression.DisconnectFeedStatement;
49import edu.uci.ics.asterix.aql.expression.DistinctClause;
50import edu.uci.ics.asterix.aql.expression.DropStatement;
51import edu.uci.ics.asterix.aql.expression.ExternalDetailsDecl;
52import edu.uci.ics.asterix.aql.expression.FLWOGRExpression;
53import edu.uci.ics.asterix.aql.expression.FeedDropStatement;
54import edu.uci.ics.asterix.aql.expression.FieldAccessor;
55import edu.uci.ics.asterix.aql.expression.FieldBinding;
56import edu.uci.ics.asterix.aql.expression.ForClause;
57import edu.uci.ics.asterix.aql.expression.FunctionDecl;
58import edu.uci.ics.asterix.aql.expression.FunctionDropStatement;
59import edu.uci.ics.asterix.aql.expression.GbyVariableExpressionPair;
60import edu.uci.ics.asterix.aql.expression.GroupbyClause;
61import edu.uci.ics.asterix.aql.expression.Identifier;
62import edu.uci.ics.asterix.aql.expression.IfExpr;
63import edu.uci.ics.asterix.aql.expression.IndexAccessor;
64import edu.uci.ics.asterix.aql.expression.IndexDropStatement;
65import edu.uci.ics.asterix.aql.expression.InsertStatement;
66import edu.uci.ics.asterix.aql.expression.InternalDetailsDecl;
67import edu.uci.ics.asterix.aql.expression.LetClause;
68import edu.uci.ics.asterix.aql.expression.LimitClause;
69import edu.uci.ics.asterix.aql.expression.ListConstructor;
70import edu.uci.ics.asterix.aql.expression.LiteralExpr;
71import edu.uci.ics.asterix.aql.expression.LoadStatement;
72import edu.uci.ics.asterix.aql.expression.NodeGroupDropStatement;
73import edu.uci.ics.asterix.aql.expression.NodegroupDecl;
74import edu.uci.ics.asterix.aql.expression.OperatorExpr;
75import edu.uci.ics.asterix.aql.expression.OrderbyClause;
76import edu.uci.ics.asterix.aql.expression.OrderedListTypeDefinition;
77import edu.uci.ics.asterix.aql.expression.QuantifiedExpression;
78import edu.uci.ics.asterix.aql.expression.QuantifiedPair;
79import edu.uci.ics.asterix.aql.expression.Query;
80import edu.uci.ics.asterix.aql.expression.RecordConstructor;
81import edu.uci.ics.asterix.aql.expression.RecordTypeDefinition;
82import edu.uci.ics.asterix.aql.expression.RefreshExternalDatasetStatement;
83import edu.uci.ics.asterix.aql.expression.RunStatement;
84import edu.uci.ics.asterix.aql.expression.SetStatement;
85import edu.uci.ics.asterix.aql.expression.TypeDecl;
86import edu.uci.ics.asterix.aql.expression.TypeDropStatement;
87import edu.uci.ics.asterix.aql.expression.TypeExpression;
88import edu.uci.ics.asterix.aql.expression.TypeReferenceExpression;
89import edu.uci.ics.asterix.aql.expression.UnaryExpr;
90import edu.uci.ics.asterix.aql.expression.UnaryExpr.Sign;
91import edu.uci.ics.asterix.aql.expression.UnionExpr;
92import edu.uci.ics.asterix.aql.expression.UnorderedListTypeDefinition;
93import edu.uci.ics.asterix.aql.expression.UpdateClause;
94import edu.uci.ics.asterix.aql.expression.UpdateStatement;
95import edu.uci.ics.asterix.aql.expression.VarIdentifier;
96import edu.uci.ics.asterix.aql.expression.VariableExpr;
97import edu.uci.ics.asterix.aql.expression.WhereClause;
98import edu.uci.ics.asterix.aql.expression.WriteStatement;
vinayakb38b7ca42012-03-05 05:44:15 +000099import edu.uci.ics.asterix.aql.literal.DoubleLiteral;
100import edu.uci.ics.asterix.aql.literal.FalseLiteral;
Eldon Carmand2d78ad2015-05-07 16:23:41 -0700101import edu.uci.ics.asterix.aql.literal.FloatLiteral;
ilovesoupc9fef1d2012-07-08 19:30:42 +0000102import edu.uci.ics.asterix.aql.literal.LongIntegerLiteral;
vinayakb38b7ca42012-03-05 05:44:15 +0000103import edu.uci.ics.asterix.aql.literal.NullLiteral;
104import edu.uci.ics.asterix.aql.literal.StringLiteral;
105import edu.uci.ics.asterix.aql.literal.TrueLiteral;
Eldon Carmand2d78ad2015-05-07 16:23:41 -0700106import edu.uci.ics.asterix.aql.util.RangeMapBuilder;
107import edu.uci.ics.asterix.common.annotations.AutoDataGen;
108import edu.uci.ics.asterix.common.annotations.DateBetweenYearsDataGen;
109import edu.uci.ics.asterix.common.annotations.DatetimeAddRandHoursDataGen;
110import edu.uci.ics.asterix.common.annotations.DatetimeBetweenYearsDataGen;
111import edu.uci.ics.asterix.common.annotations.FieldIntervalDataGen;
112import edu.uci.ics.asterix.common.annotations.FieldValFileDataGen;
113import edu.uci.ics.asterix.common.annotations.FieldValFileSameIndexDataGen;
114import edu.uci.ics.asterix.common.annotations.IRecordFieldDataGen;
115import edu.uci.ics.asterix.common.annotations.InsertRandIntDataGen;
116import edu.uci.ics.asterix.common.annotations.ListDataGen;
117import edu.uci.ics.asterix.common.annotations.ListValFileDataGen;
118import edu.uci.ics.asterix.common.annotations.SkipSecondaryIndexSearchExpressionAnnotation;
119import edu.uci.ics.asterix.common.annotations.TypeDataGen;
120import edu.uci.ics.asterix.common.annotations.UndeclaredFieldsDataGen;
vinayakb38b7ca42012-03-05 05:44:15 +0000121import edu.uci.ics.asterix.common.config.DatasetConfig.DatasetType;
122import edu.uci.ics.asterix.common.config.DatasetConfig.IndexType;
vinayakb38b7ca42012-03-05 05:44:15 +0000123import edu.uci.ics.asterix.common.exceptions.AsterixException;
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +0000124import edu.uci.ics.asterix.common.functions.FunctionSignature;
Eldon Carmand2d78ad2015-05-07 16:23:41 -0700125import edu.uci.ics.asterix.metadata.bootstrap.MetadataConstants;
126import edu.uci.ics.hyracks.algebricks.common.utils.Pair;
127import edu.uci.ics.hyracks.algebricks.common.utils.Triple;
alexander.behm07617fd2012-07-25 10:13:50 +0000128import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IExpressionAnnotation;
129import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IndexedNLJoinExpressionAnnotation;
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +0000130import edu.uci.ics.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
Eldon Carmand2d78ad2015-05-07 16:23:41 -0700131import edu.uci.ics.hyracks.dataflow.common.data.partition.range.IRangeMap;
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +0000132
133
vinayakb38b7ca42012-03-05 05:44:15 +0000134
135
136public class AQLParser extends ScopeChecker {
137
vinayakb38b7ca42012-03-05 05:44:15 +0000138 // optimizer hints
Eldon Carmand2d78ad2015-05-07 16:23:41 -0700139 private static final String AUTO_HINT = "auto";
vinayakb38b7ca42012-03-05 05:44:15 +0000140 private static final String BROADCAST_JOIN_HINT = "bcast";
vinayakb38b7ca42012-03-05 05:44:15 +0000141 private static final String COMPOSE_VAL_FILES_HINT = "compose-val-files";
vinayakb38b7ca42012-03-05 05:44:15 +0000142 private static final String DATE_BETWEEN_YEARS_HINT = "date-between-years";
143 private static final String DATETIME_ADD_RAND_HOURS_HINT = "datetime-add-rand-hours";
Eldon Carmand2d78ad2015-05-07 16:23:41 -0700144 private static final String DATETIME_BETWEEN_YEARS_HINT = "datetime-between-years";
145 private static final String HASH_GROUP_BY_HINT = "hash";
146 private static final String INDEXED_NESTED_LOOP_JOIN_HINT = "indexnl";
147 private static final String INMEMORY_HINT = "inmem";
148 private static final String INSERT_RAND_INT_HINT = "insert-rand-int";
149 private static final String INTERVAL_HINT = "interval";
150 private static final String LIST_HINT = "list";
151 private static final String LIST_VAL_FILE_HINT = "list-val-file";
152 private static final String RANGE_HINT = "range";
153 private static final String SKIP_SECONDARY_INDEX_SEARCH_HINT = "skip-index";
154 private static final String VAL_FILE_HINT = "val-files";
155 private static final String VAL_FILE_SAME_INDEX_HINT = "val-file-same-idx";
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800156
157 private static final String GEN_FIELDS_HINT = "gen-fields";
158
vinayakb38b7ca42012-03-05 05:44:15 +0000159 // data generator hints
160 private static final String DGEN_HINT = "dgen";
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800161
Till Westmann31c21f92013-05-08 09:21:53 -0700162 private static class IndexParams {
163 public IndexType type;
164 public int gramLength;
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800165
Till Westmann31c21f92013-05-08 09:21:53 -0700166 public IndexParams(IndexType type, int gramLength) {
167 this.type = type;
168 this.gramLength = gramLength;
169 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800170 };
171
ramangrover299f76a5e2013-06-18 10:25:17 -0700172 private static class FunctionName {
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800173 public String dataverse = null;
174 public String library = null;
175 public String function = null;
176 }
ramangrover299f76a5e2013-06-18 10:25:17 -0700177
vinayakb38b7ca42012-03-05 05:44:15 +0000178 private static String getHint(Token t) {
Till Westmann31c21f92013-05-08 09:21:53 -0700179 if (t.specialToken == null) {
180 return null;
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800181 }
Till Westmann31c21f92013-05-08 09:21:53 -0700182 String s = t.specialToken.image;
183 int n = s.length();
184 if (n < 2) {
185 return null;
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800186 }
Till Westmann31c21f92013-05-08 09:21:53 -0700187 return s.substring(1).trim();
vinayakb38b7ca42012-03-05 05:44:15 +0000188 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800189
Till Westmann77cb2f42013-07-15 16:44:19 -0700190 private static IRecordFieldDataGen parseFieldDataGen(String hint) throws ParseException {
191 IRecordFieldDataGen rfdg = null;
192 String splits[] = hint.split(" +");
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800193 if (splits[0].equals(VAL_FILE_HINT)) {
Till Westmann77cb2f42013-07-15 16:44:19 -0700194 File[] valFiles = new File[splits.length - 1];
195 for (int k=1; k<splits.length; k++) {
196 valFiles[k-1] = new File(splits[k]);
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800197 }
Till Westmann77cb2f42013-07-15 16:44:19 -0700198 rfdg = new FieldValFileDataGen(valFiles);
199 } else if (splits[0].equals(VAL_FILE_SAME_INDEX_HINT)) {
200 rfdg = new FieldValFileSameIndexDataGen(new File(splits[1]), splits[2]);
201 } else if (splits[0].equals(LIST_VAL_FILE_HINT)) {
202 rfdg = new ListValFileDataGen(new File(splits[1]), Integer.parseInt(splits[2]), Integer.parseInt(splits[3]));
203 } else if (splits[0].equals(LIST_HINT)) {
204 rfdg = new ListDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]));
205 } else if (splits[0].equals(INTERVAL_HINT)) {
206 FieldIntervalDataGen.ValueType vt;
207 if (splits[1].equals("int")) {
208 vt = FieldIntervalDataGen.ValueType.INT;
209 } else if (splits[1].equals("long")) {
210 vt = FieldIntervalDataGen.ValueType.LONG;
211 } else if (splits[1].equals("float")) {
212 vt = FieldIntervalDataGen.ValueType.FLOAT;
213 } else if (splits[1].equals("double")) {
214 vt = FieldIntervalDataGen.ValueType.DOUBLE;
215 } else {
216 throw new ParseException("Unknown type for interval data gen: " + splits[1]);
217 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800218 rfdg = new FieldIntervalDataGen(vt, splits[2], splits[3]);
Till Westmann77cb2f42013-07-15 16:44:19 -0700219 } else if (splits[0].equals(INSERT_RAND_INT_HINT)) {
220 rfdg = new InsertRandIntDataGen(splits[1], splits[2]);
221 } else if (splits[0].equals(DATE_BETWEEN_YEARS_HINT)) {
222 rfdg = new DateBetweenYearsDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]));
223 } else if (splits[0].equals(DATETIME_BETWEEN_YEARS_HINT)) {
224 rfdg = new DatetimeBetweenYearsDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]));
225 } else if (splits[0].equals(DATETIME_ADD_RAND_HOURS_HINT)) {
226 rfdg = new DatetimeAddRandHoursDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]), splits[3]);
227 } else if (splits[0].equals(AUTO_HINT)) {
228 rfdg = new AutoDataGen(splits[1]);
229 }
230 return rfdg;
231 }
vinayakb38b7ca42012-03-05 05:44:15 +0000232
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +0000233 public AQLParser(String s){
Till Westmann31c21f92013-05-08 09:21:53 -0700234 this(new StringReader(s));
235 super.setInput(s);
236 }
vinayakb38b7ca42012-03-05 05:44:15 +0000237
Till Westmann31c21f92013-05-08 09:21:53 -0700238 public static void main(String args[]) throws ParseException, TokenMgrError, IOException, FileNotFoundException, AsterixException {
239 File file = new File(args[0]);
240 Reader fis = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
241 AQLParser parser = new AQLParser(fis);
Till Westmanne3e8ffa2014-08-02 17:51:23 -0700242 List<Statement> st = parser.parse();
Till Westmann31c21f92013-05-08 09:21:53 -0700243 //st.accept(new AQLPrintVisitor(), 0);
244 }
Till Westmanne3e8ffa2014-08-02 17:51:23 -0700245
246 public List<Statement> parse() throws ParseException {
247 try {
248 return Statement();
249 } catch (Error e) {
250 // this is here as the JavaCharStream that's below the lexer somtimes throws Errors that are not handled
251 // by the ANTLR-generated lexer or parser (e.g it does this for invalid backslash u + 4 hex digits escapes)
252 throw new ParseException(e.getMessage());
253 }
254 }
vinayakb38b7ca42012-03-05 05:44:15 +0000255}
256
257PARSER_END(AQLParser)
258
259
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +0000260List<Statement> Statement() throws ParseException:
vinayakb38b7ca42012-03-05 05:44:15 +0000261{
vinayakb38b7ca42012-03-05 05:44:15 +0000262 scopeStack.push(RootScopeFactory.createRootScope(this));
263 List<Statement> decls = new ArrayList<Statement>();
Till Westmann31c21f92013-05-08 09:21:53 -0700264 Statement stmt = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000265}
266{
Till Westmann31c21f92013-05-08 09:21:53 -0700267 ( stmt = SingleStatement() (";") ?
vinayakb38b7ca42012-03-05 05:44:15 +0000268 {
Till Westmann31c21f92013-05-08 09:21:53 -0700269 decls.add(stmt);
270 }
271 )*
272 <EOF>
273 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800274 return decls;
Till Westmann31c21f92013-05-08 09:21:53 -0700275 }
276}
277
278Statement SingleStatement() throws ParseException:
279{
280 Statement stmt = null;
281}
282{
283 (
284 stmt = DataverseDeclaration()
285 | stmt = FunctionDeclaration()
286 | stmt = CreateStatement()
287 | stmt = LoadStatement()
288 | stmt = DropStatement()
289 | stmt = WriteStatement()
290 | stmt = SetStatement()
291 | stmt = InsertStatement()
292 | stmt = DeleteStatement()
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800293 | stmt = UpdateStatement()
Till Westmann31c21f92013-05-08 09:21:53 -0700294 | stmt = FeedStatement()
salsubaiee0b423fa2013-09-19 19:16:48 -0700295 | stmt = CompactStatement()
Till Westmann31c21f92013-05-08 09:21:53 -0700296 | stmt = Query()
Abdullah Alamoudid9057732014-06-12 13:38:27 -0700297 | stmt = RefreshExternalDatasetStatement()
Markus Holzemer52c568e2014-12-18 10:51:49 -0800298 | stmt = RunStatement()
Till Westmann31c21f92013-05-08 09:21:53 -0700299 )
300 {
301 return stmt;
302 }
303}
304
305DataverseDecl DataverseDeclaration() throws ParseException:
306{
Till Westmann14a20a72013-05-09 00:06:24 -0700307 String dvName = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700308}
309{
Till Westmanna4242bc2013-05-08 17:49:55 -0700310 "use" "dataverse" dvName = Identifier()
Till Westmann31c21f92013-05-08 09:21:53 -0700311 {
Till Westmann14a20a72013-05-09 00:06:24 -0700312 defaultDataverse = dvName;
313 return new DataverseDecl(new Identifier(dvName));
Till Westmann31c21f92013-05-08 09:21:53 -0700314 }
315}
316
317Statement CreateStatement() throws ParseException:
318{
319 String hint = null;
320 boolean dgen = false;
321 Statement stmt = null;
322}
323{
324 "create"
325 (
326 {
327 hint = getHint(token);
328 if (hint != null && hint.startsWith(DGEN_HINT)) {
329 dgen = true;
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800330 }
Till Westmann31c21f92013-05-08 09:21:53 -0700331 }
332 stmt = TypeSpecification(hint, dgen)
333 | stmt = NodegroupSpecification()
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800334 | stmt = DatasetSpecification()
Till Westmann31c21f92013-05-08 09:21:53 -0700335 | stmt = IndexSpecification()
336 | stmt = DataverseSpecification()
337 | stmt = FunctionSpecification()
ramangrover29a774ef22013-07-17 09:29:18 -0700338 | stmt = FeedSpecification()
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800339 )
Till Westmann31c21f92013-05-08 09:21:53 -0700340 {
341 return stmt;
342 }
343}
344
345TypeDecl TypeSpecification(String hint, boolean dgen) throws ParseException:
346{
347 Pair<Identifier,Identifier> nameComponents = null;
348 boolean ifNotExists = false;
349 TypeExpression typeExpr = null;
350}
351{
ramangrover299f76a5e2013-06-18 10:25:17 -0700352 "type" nameComponents = TypeName() ifNotExists = IfNotExists()
Till Westmann31c21f92013-05-08 09:21:53 -0700353 "as" typeExpr = TypeExpr()
354 {
355 long numValues = -1;
356 String filename = null;
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800357 if (dgen) {
Till Westmann31c21f92013-05-08 09:21:53 -0700358 String splits[] = hint.split(" +");
359 if (splits.length != 3) {
360 throw new ParseException("Expecting /*+ dgen <filename> <numberOfItems> */");
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800361 }
Till Westmann31c21f92013-05-08 09:21:53 -0700362 filename = splits[1];
363 numValues = Long.parseLong(splits[2]);
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800364 }
Till Westmann31c21f92013-05-08 09:21:53 -0700365 TypeDataGen tddg = new TypeDataGen(dgen, filename, numValues);
366 return new TypeDecl(nameComponents.first, nameComponents.second, typeExpr, tddg, ifNotExists);
367 }
368}
369
370
371NodegroupDecl NodegroupSpecification() throws ParseException:
372{
Till Westmann14a20a72013-05-09 00:06:24 -0700373 String name = null;
374 String tmp = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700375 boolean ifNotExists = false;
376 List<Identifier>ncNames = null;
377}
378{
Till Westmanna4242bc2013-05-08 17:49:55 -0700379 "nodegroup" name = Identifier()
380 ifNotExists = IfNotExists() "on" tmp = Identifier()
Till Westmann31c21f92013-05-08 09:21:53 -0700381 {
382 ncNames = new ArrayList<Identifier>();
Till Westmann14a20a72013-05-09 00:06:24 -0700383 ncNames.add(new Identifier(tmp));
Till Westmann31c21f92013-05-08 09:21:53 -0700384 }
Till Westmann96c1f172013-08-01 02:05:48 -0700385 ( <COMMA> tmp = Identifier()
Till Westmann31c21f92013-05-08 09:21:53 -0700386 {
Till Westmann14a20a72013-05-09 00:06:24 -0700387 ncNames.add(new Identifier(tmp));
Till Westmann31c21f92013-05-08 09:21:53 -0700388 }
389 )*
390 {
Till Westmann14a20a72013-05-09 00:06:24 -0700391 return new NodegroupDecl(new Identifier(name), ncNames, ifNotExists);
Till Westmann31c21f92013-05-08 09:21:53 -0700392 }
393}
394
395DatasetDecl DatasetSpecification() throws ParseException:
396{
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800397 Pair<Identifier,Identifier> nameComponents = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700398 boolean ifNotExists = false;
Till Westmann14a20a72013-05-09 00:06:24 -0700399 String typeName = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700400 String adapterName = null;
401 Map<String,String> properties = null;
salsubaiee801bffe2013-09-22 23:42:35 -0700402 Map<String,String> compactionPolicyProperties = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700403 FunctionSignature appliedFunction = null;
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700404 List<List<String>> primaryKeyFields = null;
Till Westmann14a20a72013-05-09 00:06:24 -0700405 String nodeGroupName = null;
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800406 Map<String,String> hints = new HashMap<String,String>();
Till Westmann31c21f92013-05-08 09:21:53 -0700407 DatasetDecl dsetDecl = null;
zheilbron2467f2e2013-08-23 19:07:31 -0700408 boolean autogenerated = false;
salsubaiee0b423fa2013-09-19 19:16:48 -0700409 String compactionPolicy = null;
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700410 List<String> filterField = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700411}
412{
413 (
Till Westmanna4242bc2013-05-08 17:49:55 -0700414 "external" <DATASET> nameComponents = QualifiedName()
415 <LEFTPAREN> typeName = Identifier() <RIGHTPAREN>
416 ifNotExists = IfNotExists()
Till Westmann31c21f92013-05-08 09:21:53 -0700417 "using" adapterName = AdapterName() properties = Configuration()
Abdullah Alamoudid9057732014-06-12 13:38:27 -0700418 ("on" nodeGroupName = Identifier() )?
Till Westmann31c21f92013-05-08 09:21:53 -0700419 ( "hints" hints = Properties() )?
salsubaiee661b9c72014-07-17 17:19:45 -0700420 ( "using" "compaction" "policy" compactionPolicy = CompactionPolicy() (compactionPolicyProperties = Configuration())? )?
Till Westmann31c21f92013-05-08 09:21:53 -0700421 {
422 ExternalDetailsDecl edd = new ExternalDetailsDecl();
423 edd.setAdapter(adapterName);
424 edd.setProperties(properties);
Abdullah Alamoudid9057732014-06-12 13:38:27 -0700425 edd.setNodegroupName(nodeGroupName != null? new Identifier(nodeGroupName): null);
426 edd.setCompactionPolicy(compactionPolicy);
427 edd.setCompactionPolicyProperties(compactionPolicyProperties);
Till Westmann14a20a72013-05-09 00:06:24 -0700428 dsetDecl = new DatasetDecl(nameComponents.first,
429 nameComponents.second,
430 new Identifier(typeName),
431 hints,
432 DatasetType.EXTERNAL,
433 edd,
434 ifNotExists);
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800435 }
Till Westmann31c21f92013-05-08 09:21:53 -0700436
Till Westmannd7dcb122013-05-16 13:19:09 -0700437 | ("internal")? <DATASET> nameComponents = QualifiedName()
Till Westmanna4242bc2013-05-08 17:49:55 -0700438 <LEFTPAREN> typeName = Identifier() <RIGHTPAREN>
439 ifNotExists = IfNotExists()
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800440 primaryKeyFields = PrimaryKey()
441 ("autogenerated" { autogenerated = true; } )?
zheilbron2467f2e2013-08-23 19:07:31 -0700442 ("on" nodeGroupName = Identifier() )?
Till Westmann31c21f92013-05-08 09:21:53 -0700443 ( "hints" hints = Properties() )?
salsubaiee661b9c72014-07-17 17:19:45 -0700444 ( "using" "compaction" "policy" compactionPolicy = CompactionPolicy() (compactionPolicyProperties = Configuration())? )?
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700445 ( "with filter on" filterField = NestedField() )?
Till Westmann31c21f92013-05-08 09:21:53 -0700446 {
Till Westmann14a20a72013-05-09 00:06:24 -0700447 InternalDetailsDecl idd = new InternalDetailsDecl(nodeGroupName != null
448 ? new Identifier(nodeGroupName)
449 : null,
salsubaiee801bffe2013-09-22 23:42:35 -0700450 primaryKeyFields,
zheilbron9082e6c2013-10-24 12:25:21 -0700451 autogenerated,
salsubaiee801bffe2013-09-22 23:42:35 -0700452 compactionPolicy,
salsubaieea5af4e02014-07-08 15:20:02 -0700453 compactionPolicyProperties,
454 filterField);
Till Westmann14a20a72013-05-09 00:06:24 -0700455 dsetDecl = new DatasetDecl(nameComponents.first,
456 nameComponents.second,
457 new Identifier(typeName),
458 hints,
459 DatasetType.INTERNAL,
460 idd,
461 ifNotExists);
Till Westmann31c21f92013-05-08 09:21:53 -0700462 }
463 )
464 {
465 return dsetDecl;
466 }
467}
468
Abdullah Alamoudid9057732014-06-12 13:38:27 -0700469RefreshExternalDatasetStatement RefreshExternalDatasetStatement() throws ParseException:
470{
471 RefreshExternalDatasetStatement redss = new RefreshExternalDatasetStatement();
472 Pair<Identifier,Identifier> nameComponents = null;
473 String datasetName = null;
474}
475{
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800476 "refresh external" <DATASET> nameComponents = QualifiedName()
477 {
478 redss.setDataverseName(nameComponents.first);
479 redss.setDatasetName(nameComponents.second);
480 return redss;
481 }
Abdullah Alamoudid9057732014-06-12 13:38:27 -0700482}
483
Markus Holzemer52c568e2014-12-18 10:51:49 -0800484RunStatement RunStatement() throws ParseException:
485{
486 String system = null;
487 String tmp;
488 ArrayList<String> parameters = new ArrayList<String>();
489 Pair<Identifier,Identifier> nameComponentsFrom = null;
490 Pair<Identifier,Identifier> nameComponentsTo = null;
491}
492{
493 "run" system = Identifier()<LEFTPAREN> ( tmp = Identifier() [<COMMA>]
494 {
495 parameters.add(tmp);
496 }
497 )*<RIGHTPAREN>
498 <FROM> <DATASET> nameComponentsFrom = QualifiedName()
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800499 "to" <DATASET> nameComponentsTo = QualifiedName()
Markus Holzemer52c568e2014-12-18 10:51:49 -0800500 {
501 return new RunStatement(system, parameters, nameComponentsFrom.first, nameComponentsFrom.second, nameComponentsTo.first, nameComponentsTo.second);
502 }
503}
504
Till Westmann31c21f92013-05-08 09:21:53 -0700505CreateIndexStatement IndexSpecification() throws ParseException:
506{
507 CreateIndexStatement cis = new CreateIndexStatement();
Till Westmann14a20a72013-05-09 00:06:24 -0700508 String indexName = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700509 boolean ifNotExists = false;
510 Pair<Identifier,Identifier> nameComponents = null;
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700511 Pair<List<String>, TypeExpression> fieldPair = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700512 IndexParams indexType = null;
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700513 boolean enforced = false;
Till Westmann31c21f92013-05-08 09:21:53 -0700514}
515{
Till Westmanna4242bc2013-05-08 17:49:55 -0700516 "index" indexName = Identifier()
Till Westmann31c21f92013-05-08 09:21:53 -0700517 ifNotExists = IfNotExists()
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800518 "on" nameComponents = QualifiedName()
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700519 <LEFTPAREN> ( fieldPair = OpenField()
Till Westmann31c21f92013-05-08 09:21:53 -0700520 {
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700521 cis.addFieldExprPair(fieldPair);
Till Westmann31c21f92013-05-08 09:21:53 -0700522 }
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700523 ) (<COMMA> fieldPair = OpenField()
Till Westmann31c21f92013-05-08 09:21:53 -0700524 {
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700525 cis.addFieldExprPair(fieldPair);
Till Westmann31c21f92013-05-08 09:21:53 -0700526 }
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700527 )* <RIGHTPAREN> ( "type" indexType = IndexType() )? ( "enforced" { enforced = true; } )?
Till Westmann31c21f92013-05-08 09:21:53 -0700528 {
Till Westmann14a20a72013-05-09 00:06:24 -0700529 cis.setIndexName(new Identifier(indexName));
Till Westmann31c21f92013-05-08 09:21:53 -0700530 cis.setIfNotExists(ifNotExists);
531 cis.setDataverseName(nameComponents.first);
532 cis.setDatasetName(nameComponents.second);
533 if (indexType != null) {
534 cis.setIndexType(indexType.type);
535 cis.setGramLength(indexType.gramLength);
536 }
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700537 cis.setEnforced(enforced);
Till Westmann31c21f92013-05-08 09:21:53 -0700538 return cis;
539 }
540}
541
salsubaiee0b423fa2013-09-19 19:16:48 -0700542String CompactionPolicy() throws ParseException :
543{
544 String compactionPolicy = null;
545}
546{
547 compactionPolicy = Identifier()
548 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800549 return compactionPolicy;
salsubaiee0b423fa2013-09-19 19:16:48 -0700550 }
551}
552
salsubaieea5af4e02014-07-08 15:20:02 -0700553String FilterField() throws ParseException :
554{
555 String filterField = null;
556}
557{
558 filterField = Identifier()
559 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800560 return filterField;
salsubaieea5af4e02014-07-08 15:20:02 -0700561 }
562}
563
Till Westmann31c21f92013-05-08 09:21:53 -0700564IndexParams IndexType() throws ParseException:
565{
566 IndexType type = null;
567 int gramLength = 0;
568}
569{
570 ("btree"
571 {
572 type = IndexType.BTREE;
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800573 }
Till Westmann31c21f92013-05-08 09:21:53 -0700574 | "rtree"
575 {
576 type = IndexType.RTREE;
577 }
578 | "keyword"
579 {
JIMAHNb75446d2013-06-03 08:35:27 -0700580 type = IndexType.LENGTH_PARTITIONED_WORD_INVIX;
Till Westmann31c21f92013-05-08 09:21:53 -0700581 }
582 | "ngram" <LEFTPAREN> <INTEGER_LITERAL>
583 {
JIMAHNb75446d2013-06-03 08:35:27 -0700584 type = IndexType.LENGTH_PARTITIONED_NGRAM_INVIX;
Till Westmann31c21f92013-05-08 09:21:53 -0700585 gramLength = Integer.valueOf(token.image);
586 }
587 <RIGHTPAREN>)
588 {
589 return new IndexParams(type, gramLength);
590 }
591}
592
593CreateDataverseStatement DataverseSpecification() throws ParseException :
594{
Till Westmann14a20a72013-05-09 00:06:24 -0700595 String dvName = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700596 boolean ifNotExists = false;
597 String format = null;
598}
599{
Till Westmanna4242bc2013-05-08 17:49:55 -0700600 "dataverse" dvName = Identifier()
Till Westmann31c21f92013-05-08 09:21:53 -0700601 ifNotExists = IfNotExists()
Till Westmann7d535322013-05-09 00:40:02 -0700602 ( "with format" format = StringLiteral() )?
Till Westmann31c21f92013-05-08 09:21:53 -0700603 {
Till Westmann14a20a72013-05-09 00:06:24 -0700604 return new CreateDataverseStatement(new Identifier(dvName), format, ifNotExists);
Till Westmann31c21f92013-05-08 09:21:53 -0700605 }
606}
607
608CreateFunctionStatement FunctionSpecification() throws ParseException:
609{
610 FunctionSignature signature;
611 boolean ifNotExists = false;
612 List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
613 String functionBody;
ramangrover29bdba1a82013-06-21 17:17:52 -0700614 VarIdentifier var = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700615 Expression functionBodyExpr;
616 Token beginPos;
617 Token endPos;
ramangrover299f76a5e2013-06-18 10:25:17 -0700618 FunctionName fctName = null;
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800619
Till Westmann31c21f92013-05-08 09:21:53 -0700620 createNewScope();
621}
622{
ramangrover299f76a5e2013-06-18 10:25:17 -0700623 "function" fctName = FunctionName()
Till Westmann31c21f92013-05-08 09:21:53 -0700624 ifNotExists = IfNotExists()
Till Westmannd7dcb122013-05-16 13:19:09 -0700625 paramList = ParameterList()
Till Westmann96c1f172013-08-01 02:05:48 -0700626 <LEFTBRACE>
Raman Groverf6b4b292013-09-24 11:11:20 +0530627 {
628 beginPos = token;
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800629 }
Till Westmann96c1f172013-08-01 02:05:48 -0700630 functionBodyExpr = Expression() <RIGHTBRACE>
Till Westmannd7dcb122013-05-16 13:19:09 -0700631 {
632 endPos = token;
633 functionBody = extractFragment(beginPos.beginLine, beginPos.beginColumn, endPos.beginLine, endPos.beginColumn);
ramangrover299f76a5e2013-06-18 10:25:17 -0700634 // TODO use fctName.library
635 signature = new FunctionSignature(fctName.dataverse, fctName.function, paramList.size());
Till Westmannd7dcb122013-05-16 13:19:09 -0700636 getCurrentScope().addFunctionDescriptor(signature, false);
Steven Jacobsa84eee42014-12-16 13:55:08 -0800637 removeCurrentScope();
Till Westmannd7dcb122013-05-16 13:19:09 -0700638 return new CreateFunctionStatement(signature, paramList, functionBody, ifNotExists);
639 }
640}
641
ramangrover29a774ef22013-07-17 09:29:18 -0700642CreateFeedStatement FeedSpecification() throws ParseException:
643{
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800644 Pair<Identifier,Identifier> nameComponents = null;
ramangrover29a774ef22013-07-17 09:29:18 -0700645 boolean ifNotExists = false;
Chris Hillerye64055d2014-10-11 00:14:39 -0700646 String adapterName = null;
ramangrover29a774ef22013-07-17 09:29:18 -0700647 Map<String,String> properties = null;
648 FunctionSignature appliedFunction = null;
649 CreateFeedStatement cfs = null;
650}
651{
652 (
653 "feed" nameComponents = QualifiedName()
654 ifNotExists = IfNotExists()
Chris Hillerye64055d2014-10-11 00:14:39 -0700655 "using" adapterName = AdapterName() properties = Configuration()
ramangrover29a774ef22013-07-17 09:29:18 -0700656 (appliedFunction = ApplyFunction())?
657 {
658 cfs = new CreateFeedStatement(nameComponents.first,
Chris Hillerye64055d2014-10-11 00:14:39 -0700659 nameComponents.second, adapterName, properties, appliedFunction, ifNotExists);
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800660 }
661
ramangrover29a774ef22013-07-17 09:29:18 -0700662 )
663 {
664 return cfs;
665 }
666}
667
668
669
Till Westmannd7dcb122013-05-16 13:19:09 -0700670List<VarIdentifier> ParameterList() throws ParseException:
671{
672 List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
673 VarIdentifier var = null;
674}
675{
Till Westmann31c21f92013-05-08 09:21:53 -0700676 <LEFTPAREN> (<VARIABLE>
677 {
678 var = new VarIdentifier();
Till Westmanna4242bc2013-05-08 17:49:55 -0700679 var.setValue(token.image);
Till Westmann31c21f92013-05-08 09:21:53 -0700680 paramList.add(var);
681 getCurrentScope().addNewVarSymbolToScope(var);
682 }
Till Westmann96c1f172013-08-01 02:05:48 -0700683 (<COMMA> <VARIABLE>
Till Westmann31c21f92013-05-08 09:21:53 -0700684 {
685 var = new VarIdentifier();
Till Westmanna4242bc2013-05-08 17:49:55 -0700686 var.setValue(token.image);
Till Westmann31c21f92013-05-08 09:21:53 -0700687 paramList.add(var);
688 getCurrentScope().addNewVarSymbolToScope(var);
689 }
Till Westmannd7dcb122013-05-16 13:19:09 -0700690 )*)? <RIGHTPAREN>
Till Westmann31c21f92013-05-08 09:21:53 -0700691 {
Till Westmannd7dcb122013-05-16 13:19:09 -0700692 return paramList;
Till Westmann31c21f92013-05-08 09:21:53 -0700693 }
694}
695
696boolean IfNotExists() throws ParseException:
697{
698}
699{
700 ( "if not exists"
701 {
702 return true;
703 }
704 )?
705 {
706 return false;
707 }
708}
709
710FunctionSignature ApplyFunction() throws ParseException:
711{
Raman Grover25a2b2e2013-09-27 18:22:23 +0530712 FunctionName functioName = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700713 FunctionSignature funcSig = null;
714}
715{
Raman Grover25a2b2e2013-09-27 18:22:23 +0530716 "apply" "function" functioName = FunctionName()
Till Westmann31c21f92013-05-08 09:21:53 -0700717 {
Raman Grover25a2b2e2013-09-27 18:22:23 +0530718 String fqFunctionName = functioName.library == null ? functioName.function : functioName.library + "#" + functioName.function;
719 return new FunctionSignature(functioName.dataverse, fqFunctionName, 1);
Till Westmann31c21f92013-05-08 09:21:53 -0700720 }
721}
722
ramangrover29566b3a92013-05-28 09:07:10 -0700723String GetPolicy() throws ParseException:
724{
725 String policy = null;
726}
727{
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800728 "using" "policy" policy = Identifier()
ramangrover29566b3a92013-05-28 09:07:10 -0700729 {
730 return policy;
731 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800732
733}
ramangrover29566b3a92013-05-28 09:07:10 -0700734
Till Westmann31c21f92013-05-08 09:21:53 -0700735FunctionSignature FunctionSignature() throws ParseException:
736{
ramangrover299f76a5e2013-06-18 10:25:17 -0700737 FunctionName fctName = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700738 int arity = 0;
739}
740{
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800741 fctName = FunctionName() "@" <INTEGER_LITERAL>
742 {
Till Westmanna4242bc2013-05-08 17:49:55 -0700743 arity = new Integer(token.image);
Till Westmann31c21f92013-05-08 09:21:53 -0700744 if (arity < 0 && arity != FunctionIdentifier.VARARGS) {
745 throw new ParseException(" invalid arity:" + arity);
746 }
747
ramangrover299f76a5e2013-06-18 10:25:17 -0700748 // TODO use fctName.library
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800749 String fqFunctionName = fctName.library == null ? fctName.function : fctName.library + "#" + fctName.function;
ramangrover2993dd8232013-07-03 22:51:25 -0700750 return new FunctionSignature(fctName.dataverse, fqFunctionName, arity);
Till Westmann31c21f92013-05-08 09:21:53 -0700751 }
752}
753
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700754List<List<String>> PrimaryKey() throws ParseException:
Till Westmann31c21f92013-05-08 09:21:53 -0700755{
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700756 List<String> tmp = null;
757 List<List<String>> primaryKeyFields = new ArrayList<List<String>>();
Till Westmann31c21f92013-05-08 09:21:53 -0700758}
759{
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700760 "primary" "key" tmp = NestedField()
Till Westmann31c21f92013-05-08 09:21:53 -0700761 {
Till Westmann14a20a72013-05-09 00:06:24 -0700762 primaryKeyFields.add(tmp);
Till Westmann31c21f92013-05-08 09:21:53 -0700763 }
Ildar Absalyamov04b2b772015-03-19 15:09:51 -0700764 ( <COMMA> tmp = NestedField()
Till Westmann31c21f92013-05-08 09:21:53 -0700765 {
Till Westmann14a20a72013-05-09 00:06:24 -0700766 primaryKeyFields.add(tmp);
Till Westmann31c21f92013-05-08 09:21:53 -0700767 }
768 )*
769 {
770 return primaryKeyFields;
771 }
772}
773
774Statement DropStatement() throws ParseException:
775{
Till Westmann14a20a72013-05-09 00:06:24 -0700776 String id = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700777 Pair<Identifier,Identifier> pairId = null;
778 Triple<Identifier,Identifier,Identifier> tripleId = null;
779 FunctionSignature funcSig = null;
780 boolean ifExists = false;
781 Statement stmt = null;
782}
783{
784 "drop"
785 (
786 <DATASET> pairId = QualifiedName() ifExists = IfExists()
787 {
788 stmt = new DropStatement(pairId.first, pairId.second, ifExists);
789 }
790 | "index" tripleId = DoubleQualifiedName() ifExists = IfExists()
791 {
792 stmt = new IndexDropStatement(tripleId.first, tripleId.second, tripleId.third, ifExists);
793 }
Till Westmanna4242bc2013-05-08 17:49:55 -0700794 | "nodegroup" id = Identifier() ifExists = IfExists()
Till Westmann31c21f92013-05-08 09:21:53 -0700795 {
Till Westmann14a20a72013-05-09 00:06:24 -0700796 stmt = new NodeGroupDropStatement(new Identifier(id), ifExists);
Till Westmann31c21f92013-05-08 09:21:53 -0700797 }
ramangrover299f76a5e2013-06-18 10:25:17 -0700798 | "type" pairId = TypeName() ifExists = IfExists()
Till Westmann31c21f92013-05-08 09:21:53 -0700799 {
800 stmt = new TypeDropStatement(pairId.first, pairId.second, ifExists);
801 }
Till Westmanna4242bc2013-05-08 17:49:55 -0700802 | "dataverse" id = Identifier() ifExists = IfExists()
Till Westmann31c21f92013-05-08 09:21:53 -0700803 {
Till Westmann14a20a72013-05-09 00:06:24 -0700804 stmt = new DataverseDropStatement(new Identifier(id), ifExists);
Till Westmann31c21f92013-05-08 09:21:53 -0700805 }
806 | "function" funcSig = FunctionSignature() ifExists = IfExists()
807 {
808 stmt = new FunctionDropStatement(funcSig, ifExists);
809 }
ramangrover29a774ef22013-07-17 09:29:18 -0700810 | "feed" pairId = QualifiedName() ifExists = IfExists()
811 {
812 stmt = new FeedDropStatement(pairId.first, pairId.second, ifExists);
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800813 }
Till Westmann31c21f92013-05-08 09:21:53 -0700814 )
815 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800816 return stmt;
Till Westmann31c21f92013-05-08 09:21:53 -0700817 }
818}
819
820boolean IfExists() throws ParseException :
821{
822}
823{
Till Westmann96c1f172013-08-01 02:05:48 -0700824 ( <IF> "exists"
Till Westmann31c21f92013-05-08 09:21:53 -0700825 {
826 return true;
827 }
828 )?
829 {
830 return false;
vinayakb38b7ca42012-03-05 05:44:15 +0000831 }
832}
833
834InsertStatement InsertStatement() throws ParseException:
835{
Till Westmann31c21f92013-05-08 09:21:53 -0700836 Pair<Identifier,Identifier> nameComponents = null;
837 Query query;
vinayakb38b7ca42012-03-05 05:44:15 +0000838}
839{
Till Westmann31c21f92013-05-08 09:21:53 -0700840 "insert" "into" <DATASET> nameComponents = QualifiedName() query = Query()
841 {
842 return new InsertStatement(nameComponents.first, nameComponents.second, query, getVarCounter());
843 }
vinayakb38b7ca42012-03-05 05:44:15 +0000844}
845
846DeleteStatement DeleteStatement() throws ParseException:
847{
Till Westmann31c21f92013-05-08 09:21:53 -0700848 VariableExpr var = null;
849 Expression condition = null;
850 Pair<Identifier, Identifier> nameComponents;
Abdullah Alamoudidb37f662014-07-14 21:51:37 +0300851 // This is related to the new metadata lock management
852 setDataverses(new ArrayList<String>());
853 setDatasets(new ArrayList<String>());
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800854
vinayakb38b7ca42012-03-05 05:44:15 +0000855}
856{
Till Westmann31c21f92013-05-08 09:21:53 -0700857 "delete" var = Variable()
858 {
859 getCurrentScope().addNewVarSymbolToScope(var.getVar());
860 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800861 <FROM> <DATASET> nameComponents = QualifiedName()
salsubaieedf89fbc2013-12-21 19:51:42 -0800862 (<WHERE> condition = Expression())?
863 {
Abdullah Alamoudidb37f662014-07-14 21:51:37 +0300864 // First we get the dataverses and datasets that we want to lock
865 List<String> dataverses = getDataverses();
866 List<String> datasets = getDatasets();
867 // we remove the pointer to the dataverses and datasets
868 setDataverses(null);
869 setDatasets(null);
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800870 return new DeleteStatement(var, nameComponents.first, nameComponents.second,
871 condition, getVarCounter(), dataverses, datasets);
Till Westmann31c21f92013-05-08 09:21:53 -0700872 }
vinayakb38b7ca42012-03-05 05:44:15 +0000873}
874
875UpdateStatement UpdateStatement() throws ParseException:
876{
Till Westmann31c21f92013-05-08 09:21:53 -0700877 VariableExpr vars;
878 Expression target;
879 Expression condition;
880 UpdateClause uc;
881 List<UpdateClause> ucs = new ArrayList<UpdateClause>();
vinayakb38b7ca42012-03-05 05:44:15 +0000882}
883{
Till Westmann96c1f172013-08-01 02:05:48 -0700884 "update" vars = Variable() <IN> target = Expression()
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800885 <WHERE> condition = Expression()
Till Westmann31c21f92013-05-08 09:21:53 -0700886 <LEFTPAREN> (uc = UpdateClause()
887 {
888 ucs.add(uc);
889 }
Till Westmann96c1f172013-08-01 02:05:48 -0700890 (<COMMA> uc = UpdateClause()
Till Westmann31c21f92013-05-08 09:21:53 -0700891 {
892 ucs.add(uc);
893 }
894 )*) <RIGHTPAREN>
895 {
896 return new UpdateStatement(vars, target, condition, ucs);
897 }
vinayakb38b7ca42012-03-05 05:44:15 +0000898}
899
vinayakb38b7ca42012-03-05 05:44:15 +0000900UpdateClause UpdateClause() throws ParseException:
901{
Till Westmann31c21f92013-05-08 09:21:53 -0700902 Expression target = null;
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800903 Expression value = null ;
Till Westmann31c21f92013-05-08 09:21:53 -0700904 InsertStatement is = null;
905 DeleteStatement ds = null;
906 UpdateStatement us = null;
907 Expression condition = null;
908 UpdateClause ifbranch = null;
909 UpdateClause elsebranch = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000910}
911{
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800912 "set" target = Expression() <ASSIGN> value = Expression()
Till Westmann31c21f92013-05-08 09:21:53 -0700913 | is = InsertStatement()
914 | ds = DeleteStatement()
915 | us = UpdateStatement()
Till Westmann96c1f172013-08-01 02:05:48 -0700916 | <IF> <LEFTPAREN> condition = Expression() <RIGHTPAREN>
917 <THEN> ifbranch = UpdateClause()
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800918 [LOOKAHEAD(1) <ELSE> elsebranch = UpdateClause()]
Till Westmann31c21f92013-05-08 09:21:53 -0700919 {
920 return new UpdateClause(target, value, is, ds, us, condition, ifbranch, elsebranch);
921 }
vinayakb38b7ca42012-03-05 05:44:15 +0000922}
923
vinayakb38b7ca42012-03-05 05:44:15 +0000924Statement SetStatement() throws ParseException:
925{
926 String pn = null;
Till Westmann31c21f92013-05-08 09:21:53 -0700927 String pv = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000928}
929{
Till Westmann7d535322013-05-09 00:40:02 -0700930 "set" pn = Identifier() pv = StringLiteral()
Till Westmann31c21f92013-05-08 09:21:53 -0700931 {
Till Westmann31c21f92013-05-08 09:21:53 -0700932 return new SetStatement(pn, pv);
933 }
vinayakb38b7ca42012-03-05 05:44:15 +0000934}
935
936Statement WriteStatement() throws ParseException:
937{
Till Westmann14a20a72013-05-09 00:06:24 -0700938 String nodeName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000939 String fileName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000940 Query query;
941 String writerClass = null;
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +0000942 Pair<Identifier,Identifier> nameComponents = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000943}
944{
Till Westmann96c1f172013-08-01 02:05:48 -0700945 "write" "output" "to" nodeName = Identifier() <COLON> fileName = StringLiteral()
Till Westmann7d535322013-05-09 00:40:02 -0700946 ( "using" writerClass = StringLiteral() )?
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800947 {
948 return new WriteStatement(new Identifier(nodeName), fileName, writerClass);
vinayakb38b7ca42012-03-05 05:44:15 +0000949 }
950}
951
zheilbron28e026f2013-11-20 10:15:15 -0800952LoadStatement LoadStatement() throws ParseException:
vinayakb38b7ca42012-03-05 05:44:15 +0000953{
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +0000954 Identifier dataverseName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000955 Identifier datasetName = null;
956 boolean alreadySorted = false;
ramangrover29669d8f62013-02-11 06:03:32 +0000957 String adapterName;
vinayakb38b7ca42012-03-05 05:44:15 +0000958 Map<String,String> properties;
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +0000959 Pair<Identifier,Identifier> nameComponents = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000960}
961{
Till Westmann31c21f92013-05-08 09:21:53 -0700962 "load" <DATASET> nameComponents = QualifiedName()
vinayakb38b7ca42012-03-05 05:44:15 +0000963 {
Till Westmann31c21f92013-05-08 09:21:53 -0700964 dataverseName = nameComponents.first;
965 datasetName = nameComponents.second;
vinayakb38b7ca42012-03-05 05:44:15 +0000966 }
Till Westmann31c21f92013-05-08 09:21:53 -0700967 "using" adapterName = AdapterName() properties = Configuration()
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800968 ("pre-sorted"
vinayakb38b7ca42012-03-05 05:44:15 +0000969 {
Till Westmann31c21f92013-05-08 09:21:53 -0700970 alreadySorted = true;
vinayakb38b7ca42012-03-05 05:44:15 +0000971 }
972 )?
Till Westmann31c21f92013-05-08 09:21:53 -0700973 {
zheilbron28e026f2013-11-20 10:15:15 -0800974 return new LoadStatement(dataverseName, datasetName, adapterName, properties, alreadySorted);
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800975 }
vinayakb38b7ca42012-03-05 05:44:15 +0000976}
977
vinayakb38b7ca42012-03-05 05:44:15 +0000978
Till Westmann31c21f92013-05-08 09:21:53 -0700979String AdapterName() throws ParseException :
vinayakb38b7ca42012-03-05 05:44:15 +0000980{
ramangrover29669d8f62013-02-11 06:03:32 +0000981 String adapterName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000982}
983{
Till Westmann68d99652013-05-09 11:15:21 -0700984 adapterName = Identifier()
vinayakb38b7ca42012-03-05 05:44:15 +0000985 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800986 return adapterName;
vinayakb38b7ca42012-03-05 05:44:15 +0000987 }
vinayakb38b7ca42012-03-05 05:44:15 +0000988}
989
salsubaiee0b423fa2013-09-19 19:16:48 -0700990Statement CompactStatement() throws ParseException:
991{
992 Pair<Identifier,Identifier> nameComponents = null;
993 Statement stmt = null;
994}
995{
996 "compact" <DATASET> nameComponents = QualifiedName()
997 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -0800998 stmt = new CompactStatement(nameComponents.first, nameComponents.second);
salsubaiee0b423fa2013-09-19 19:16:48 -0700999 }
1000 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001001 return stmt;
salsubaiee0b423fa2013-09-19 19:16:48 -07001002 }
1003}
1004
Till Westmann31c21f92013-05-08 09:21:53 -07001005Statement FeedStatement() throws ParseException:
vinayakb38b7ca42012-03-05 05:44:15 +00001006{
ramangrover29a774ef22013-07-17 09:29:18 -07001007 Pair<Identifier,Identifier> feedNameComponents = null;
1008 Pair<Identifier,Identifier> datasetNameComponents = null;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001009
Till Westmann31c21f92013-05-08 09:21:53 -07001010 Map<String,String> configuration = null;
1011 Statement stmt = null;
ramangrover29566b3a92013-05-28 09:07:10 -07001012 String policy = null;
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001013}
1014{
Till Westmann31c21f92013-05-08 09:21:53 -07001015 (
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001016 "connect" "feed" feedNameComponents = QualifiedName() "to" <DATASET> datasetNameComponents = QualifiedName() (policy = GetPolicy())?
Till Westmann31c21f92013-05-08 09:21:53 -07001017 {
ramangrover29a774ef22013-07-17 09:29:18 -07001018 stmt = new ConnectFeedStatement(feedNameComponents, datasetNameComponents, policy, getVarCounter());
Till Westmann31c21f92013-05-08 09:21:53 -07001019 }
buyingyi2fd7fa62014-11-24 19:31:55 -08001020 | "disconnect" "feed" feedNameComponents = QualifiedName() <FROM> <DATASET> datasetNameComponents = QualifiedName()
Till Westmann31c21f92013-05-08 09:21:53 -07001021 {
ramangrover29a774ef22013-07-17 09:29:18 -07001022 stmt = new DisconnectFeedStatement(feedNameComponents, datasetNameComponents);
Till Westmann31c21f92013-05-08 09:21:53 -07001023 }
1024 )
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001025 {
Till Westmann31c21f92013-05-08 09:21:53 -07001026 return stmt;
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001027 }
1028}
1029
Till Westmann31c21f92013-05-08 09:21:53 -07001030Map<String,String> Configuration() throws ParseException :
vinayakb38b7ca42012-03-05 05:44:15 +00001031{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001032 Map<String,String> configuration = new LinkedHashMap<String,String>();
1033 Pair<String, String> keyValuePair = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001034}
1035{
Till Westmann31c21f92013-05-08 09:21:53 -07001036 <LEFTPAREN> ( keyValuePair = KeyValuePair()
vinayakb38b7ca42012-03-05 05:44:15 +00001037 {
Till Westmann31c21f92013-05-08 09:21:53 -07001038 configuration.put(keyValuePair.first, keyValuePair.second);
vinayakb38b7ca42012-03-05 05:44:15 +00001039 }
Till Westmann96c1f172013-08-01 02:05:48 -07001040 ( <COMMA> keyValuePair = KeyValuePair()
vinayakb38b7ca42012-03-05 05:44:15 +00001041 {
Till Westmann31c21f92013-05-08 09:21:53 -07001042 configuration.put(keyValuePair.first, keyValuePair.second);
vinayakb38b7ca42012-03-05 05:44:15 +00001043 }
Till Westmann31c21f92013-05-08 09:21:53 -07001044 )* )? <RIGHTPAREN>
1045 {
1046 return configuration;
1047 }
1048}
1049
1050Pair<String, String> KeyValuePair() throws ParseException:
1051{
1052 String key;
1053 String value;
1054}
1055{
Till Westmann96c1f172013-08-01 02:05:48 -07001056 <LEFTPAREN> key = StringLiteral() <EQ> value = StringLiteral() <RIGHTPAREN>
Till Westmann31c21f92013-05-08 09:21:53 -07001057 {
1058 return new Pair<String, String>(key, value);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001059 }
Till Westmann31c21f92013-05-08 09:21:53 -07001060}
1061
1062Map<String,String> Properties() throws ParseException:
1063{
1064 Map<String,String> properties = new HashMap<String,String>();
1065 Pair<String, String> property;
1066}
1067{
1068 ( <LEFTPAREN> property = Property()
1069 {
1070 properties.put(property.first, property.second);
1071 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001072 ( <COMMA> property = Property()
Till Westmann31c21f92013-05-08 09:21:53 -07001073 {
1074 properties.put(property.first, property.second);
1075 }
1076 )* <RIGHTPAREN> )?
1077 {
1078 return properties;
1079 }
1080}
1081
1082Pair<String, String> Property() throws ParseException:
1083{
1084 String key;
1085 String value;
1086}
1087{
Till Westmann96c1f172013-08-01 02:05:48 -07001088 key = Identifier() <EQ> ( value = StringLiteral() | <INTEGER_LITERAL>
Till Westmann31c21f92013-05-08 09:21:53 -07001089 {
1090 try {
1091 value = "" + Long.valueOf(token.image);
1092 } catch (NumberFormatException nfe) {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001093 throw new ParseException("inapproriate value: " + token.image);
Till Westmann31c21f92013-05-08 09:21:53 -07001094 }
1095 }
1096 )
1097 {
1098 return new Pair<String, String>(key.toUpperCase(), value);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001099 }
vinayakb38b7ca42012-03-05 05:44:15 +00001100}
1101
Ildar Absalyamov04b2b772015-03-19 15:09:51 -07001102TypeExpression IndexedTypeExpr() throws ParseException:
1103{
1104 TypeExpression typeExpr = null;
1105}
1106{
1107 (
1108 typeExpr = TypeReference()
1109 | typeExpr = OrderedListTypeDef()
1110 | typeExpr = UnorderedListTypeDef()
1111 )
1112 {
1113 return typeExpr;
1114 }
1115}
1116
vinayakb38b7ca42012-03-05 05:44:15 +00001117TypeExpression TypeExpr() throws ParseException:
1118{
1119 TypeExpression typeExpr = null;
1120}
1121{
1122 (
1123 typeExpr = RecordTypeDef()
1124 | typeExpr = TypeReference()
1125 | typeExpr = OrderedListTypeDef()
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001126 | typeExpr = UnorderedListTypeDef()
1127 )
vinayakb38b7ca42012-03-05 05:44:15 +00001128 {
1129 return typeExpr;
1130 }
1131}
1132
1133RecordTypeDefinition RecordTypeDef() throws ParseException:
1134{
1135 RecordTypeDefinition recType = new RecordTypeDefinition();
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001136 RecordTypeDefinition.RecordKind recordKind = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001137}
1138{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001139 ( "closed" { recordKind = RecordTypeDefinition.RecordKind.CLOSED; }
vinayakb38b7ca42012-03-05 05:44:15 +00001140 | "open" { recordKind = RecordTypeDefinition.RecordKind.OPEN; } )?
Till Westmann96c1f172013-08-01 02:05:48 -07001141 <LEFTBRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00001142 {
1143 String hint = getHint(token);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001144 if (hint != null) {
vinayakb38b7ca42012-03-05 05:44:15 +00001145 String splits[] = hint.split(" +");
1146 if (splits[0].equals(GEN_FIELDS_HINT)) {
1147 if (splits.length != 5) {
1148 throw new ParseException("Expecting: /*+ gen-fields <type> <min> <max> <prefix>*/");
1149 }
1150 if (!splits[1].equals("int")) {
1151 throw new ParseException("The only supported type for gen-fields is int.");
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001152 }
1153 UndeclaredFieldsDataGen ufdg = new UndeclaredFieldsDataGen(UndeclaredFieldsDataGen.Type.INT,
vinayakb38b7ca42012-03-05 05:44:15 +00001154 Integer.parseInt(splits[2]), Integer.parseInt(splits[3]), splits[4]);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001155 recType.setUndeclaredFieldsDataGen(ufdg);
vinayakb38b7ca42012-03-05 05:44:15 +00001156 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001157 }
1158
vinayakb38b7ca42012-03-05 05:44:15 +00001159 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001160 (
1161 RecordField(recType)
1162 ( <COMMA> RecordField(recType) )*
1163 )?
Till Westmann96c1f172013-08-01 02:05:48 -07001164 <RIGHTBRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00001165 {
1166 if (recordKind == null) {
1167 recordKind = RecordTypeDefinition.RecordKind.OPEN;
1168 }
1169 recType.setRecordKind(recordKind);
1170 return recType;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001171 }
vinayakb38b7ca42012-03-05 05:44:15 +00001172}
1173
1174void RecordField(RecordTypeDefinition recType) throws ParseException:
1175{
Till Westmann77cb2f42013-07-15 16:44:19 -07001176 String fieldName;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001177 TypeExpression type = null;
Till Westmann77cb2f42013-07-15 16:44:19 -07001178 boolean nullable = false;
vinayakb38b7ca42012-03-05 05:44:15 +00001179}
1180{
Till Westmann77cb2f42013-07-15 16:44:19 -07001181 fieldName = Identifier()
1182 {
1183 String hint = getHint(token);
1184 IRecordFieldDataGen rfdg = hint != null ? parseFieldDataGen(hint) : null;
1185 }
Till Westmann96c1f172013-08-01 02:05:48 -07001186 <COLON> type = TypeExpr() (<QUES> { nullable = true; } )?
Till Westmann77cb2f42013-07-15 16:44:19 -07001187 {
1188 recType.addField(fieldName, type, nullable, rfdg);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001189 }
vinayakb38b7ca42012-03-05 05:44:15 +00001190}
1191
1192TypeReferenceExpression TypeReference() throws ParseException:
vinayakb38b7ca42012-03-05 05:44:15 +00001193{
Till Westmann14a20a72013-05-09 00:06:24 -07001194 String id = null;
Till Westmanna4242bc2013-05-08 17:49:55 -07001195}
1196{
1197 id = Identifier()
1198 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001199 if (id.equalsIgnoreCase("int")) {
1200 id = "int64";
1201 }
1202
Till Westmann14a20a72013-05-09 00:06:24 -07001203 return new TypeReferenceExpression(new Identifier(id));
Till Westmanna4242bc2013-05-08 17:49:55 -07001204 }
vinayakb38b7ca42012-03-05 05:44:15 +00001205}
1206
1207OrderedListTypeDefinition OrderedListTypeDef() throws ParseException:
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001208{
vinayakb38b7ca42012-03-05 05:44:15 +00001209 TypeExpression type = null;
1210}
1211{
Till Westmann96c1f172013-08-01 02:05:48 -07001212 <LEFTBRACKET>
vinayakb38b7ca42012-03-05 05:44:15 +00001213 ( type = TypeExpr() )
Till Westmann96c1f172013-08-01 02:05:48 -07001214 <RIGHTBRACKET>
vinayakb38b7ca42012-03-05 05:44:15 +00001215 {
1216 return new OrderedListTypeDefinition(type);
1217 }
1218}
1219
1220
1221UnorderedListTypeDefinition UnorderedListTypeDef() throws ParseException:
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001222{
vinayakb38b7ca42012-03-05 05:44:15 +00001223 TypeExpression type = null;
1224}
1225{
Till Westmann96c1f172013-08-01 02:05:48 -07001226 <LEFTDBLBRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00001227 ( type = TypeExpr() )
Till Westmann96c1f172013-08-01 02:05:48 -07001228 <RIGHTDBLBRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00001229 {
1230 return new UnorderedListTypeDefinition(type);
1231 }
1232}
1233
ramangrover299f76a5e2013-06-18 10:25:17 -07001234FunctionName FunctionName() throws ParseException:
1235{
1236 String first = null;
1237 String second = null;
1238 String third = null;
1239 boolean secondAfterDot = false;
1240}
1241{
zheilbron555dc9d2013-08-14 19:58:00 -07001242 first = Identifier() ( <DOT> second = Identifier()
ramangrover299f76a5e2013-06-18 10:25:17 -07001243 {
1244 secondAfterDot = true;
1245 }
1246 ("#" third = Identifier())? | "#" second = Identifier() )?
1247 {
1248 FunctionName result = new FunctionName();
1249 if (second == null) {
1250 result.dataverse = defaultDataverse;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001251 result.library = null;
1252 result.function = first;
ramangrover299f76a5e2013-06-18 10:25:17 -07001253 } else if (third == null) {
1254 if (secondAfterDot) {
1255 result.dataverse = first;
1256 result.library = null;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001257 result.function = second;
ramangrover299f76a5e2013-06-18 10:25:17 -07001258 } else {
1259 result.dataverse = defaultDataverse;
1260 result.library = first;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001261 result.function = second;
ramangrover299f76a5e2013-06-18 10:25:17 -07001262 }
1263 } else {
1264 result.dataverse = first;
1265 result.library = second;
1266 result.function = third;
1267 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001268
1269 if (result.function.equalsIgnoreCase("int")) {
1270 result.function = "int64";
1271 }
ramangrover299f76a5e2013-06-18 10:25:17 -07001272 return result;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001273 }
ramangrover299f76a5e2013-06-18 10:25:17 -07001274}
Till Westmann31c21f92013-05-08 09:21:53 -07001275
ramangrover299f76a5e2013-06-18 10:25:17 -07001276
1277Pair<Identifier,Identifier> TypeName() throws ParseException:
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001278{
Till Westmann31c21f92013-05-08 09:21:53 -07001279 Pair<Identifier,Identifier> name = null;
1280}
1281{
1282 name = QualifiedName()
1283 {
1284 if (name.first == null) {
1285 name.first = new Identifier(defaultDataverse);
1286 }
1287 return name;
1288 }
1289}
1290
Till Westmann14a20a72013-05-09 00:06:24 -07001291String Identifier() throws ParseException:
Till Westmanna4242bc2013-05-08 17:49:55 -07001292{
Till Westmann68d99652013-05-09 11:15:21 -07001293 String lit = null;
Till Westmanna4242bc2013-05-08 17:49:55 -07001294}
1295{
1296 <IDENTIFIER>
1297 {
Till Westmann14a20a72013-05-09 00:06:24 -07001298 return token.image;
Till Westmanna4242bc2013-05-08 17:49:55 -07001299 }
Till Westmann68d99652013-05-09 11:15:21 -07001300 | lit = StringLiteral()
1301 {
1302 return lit;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001303 }
Till Westmanna4242bc2013-05-08 17:49:55 -07001304}
1305
Ildar Absalyamov04b2b772015-03-19 15:09:51 -07001306Pair<List<String>, TypeExpression> OpenField() throws ParseException:
1307{
1308 TypeExpression fieldType = null;
1309 List<String> fieldList = null;
1310}
1311{
1312 fieldList = NestedField()
1313 ( <COLON> fieldType = IndexedTypeExpr() )?
1314 {
1315 return new Pair<List<String>, TypeExpression>(fieldList, fieldType);
1316 }
1317}
1318
1319List<String> NestedField() throws ParseException:
1320{
1321 List<String> exprList = new ArrayList<String>();
1322 String lit = null;
1323}
1324{
1325 lit = Identifier()
1326 {
1327 exprList.add(lit);
1328 }
1329 (<DOT>
1330 lit = Identifier()
1331 {
1332 exprList.add(lit);
1333 }
1334 )*
1335 {
1336 return exprList;
1337 }
1338}
1339
1340
1341
Till Westmann7d535322013-05-09 00:40:02 -07001342String StringLiteral() throws ParseException:
1343{
1344}
1345{
1346 <STRING_LITERAL>
1347 {
1348 return removeQuotesAndEscapes(token.image);
1349 }
1350}
1351
Till Westmann31c21f92013-05-08 09:21:53 -07001352Pair<Identifier,Identifier> QualifiedName() throws ParseException:
1353{
Till Westmann14a20a72013-05-09 00:06:24 -07001354 String first = null;
1355 String second = null;
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001356}
1357{
Till Westmann96c1f172013-08-01 02:05:48 -07001358 first = Identifier() (<DOT> second = Identifier())?
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001359 {
Till Westmann14a20a72013-05-09 00:06:24 -07001360 Identifier id1 = null;
1361 Identifier id2 = null;
Till Westmann31c21f92013-05-08 09:21:53 -07001362 if (second == null) {
Till Westmann14a20a72013-05-09 00:06:24 -07001363 id2 = new Identifier(first);
1364 } else
1365 {
1366 id1 = new Identifier(first);
1367 id2 = new Identifier(second);
1368 }
1369 return new Pair<Identifier,Identifier>(id1, id2);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001370 }
1371}
1372
Till Westmann31c21f92013-05-08 09:21:53 -07001373Triple<Identifier,Identifier,Identifier> DoubleQualifiedName() throws ParseException:
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001374{
Till Westmann14a20a72013-05-09 00:06:24 -07001375 String first = null;
1376 String second = null;
1377 String third = null;
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001378}
1379{
Till Westmann96c1f172013-08-01 02:05:48 -07001380 first = Identifier() <DOT> second = Identifier() (<DOT> third = Identifier())?
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001381 {
Till Westmann14a20a72013-05-09 00:06:24 -07001382 Identifier id1 = null;
1383 Identifier id2 = null;
1384 Identifier id3 = null;
Till Westmann31c21f92013-05-08 09:21:53 -07001385 if (third == null) {
Till Westmann14a20a72013-05-09 00:06:24 -07001386 id2 = new Identifier(first);
1387 id3 = new Identifier(second);
1388 } else {
1389 id1 = new Identifier(first);
1390 id2 = new Identifier(second);
1391 id3 = new Identifier(third);
1392 }
1393 return new Triple<Identifier,Identifier,Identifier>(id1, id2, id3);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001394 }
1395}
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001396
vinayakb38b7ca42012-03-05 05:44:15 +00001397FunctionDecl FunctionDeclaration() throws ParseException:
1398{
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001399 FunctionDecl funcDecl;
1400 FunctionSignature signature;
ramangrover29a13f2422012-03-15 23:01:27 +00001401 String functionName;
vinayakb38b7ca42012-03-05 05:44:15 +00001402 List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
1403 Expression funcBody;
vinayakb38b7ca42012-03-05 05:44:15 +00001404 createNewScope();
1405}
1406{
Till Westmannd7dcb122013-05-16 13:19:09 -07001407 "declare" "function" functionName = Identifier()
1408 paramList = ParameterList()
Till Westmann96c1f172013-08-01 02:05:48 -07001409 <LEFTBRACE> funcBody = Expression() <RIGHTBRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00001410 {
Till Westmannd7dcb122013-05-16 13:19:09 -07001411 signature = new FunctionSignature(defaultDataverse, functionName, paramList.size());
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001412 getCurrentScope().addFunctionDescriptor(signature, false);
1413 funcDecl = new FunctionDecl(signature, paramList, funcBody);
Till Westmannc6c4a742013-05-20 17:59:21 -07001414 removeCurrentScope();
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001415 return funcDecl;
vinayakb38b7ca42012-03-05 05:44:15 +00001416 }
1417}
1418
vinayakb38b7ca42012-03-05 05:44:15 +00001419
Till Westmann31c21f92013-05-08 09:21:53 -07001420Query Query() throws ParseException:
vinayakb38b7ca42012-03-05 05:44:15 +00001421{
1422 Query query = new Query();
Abdullah Alamoudidb37f662014-07-14 21:51:37 +03001423 // we set the pointers to the dataverses and datasets lists to fill them with entities to be locked
1424 setDataverses(query.getDataverses());
1425 setDatasets(query.getDatasets());
vinayakb38b7ca42012-03-05 05:44:15 +00001426 Expression expr;
1427}
1428{
Till Westmann31c21f92013-05-08 09:21:53 -07001429 expr = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00001430 {
1431 query.setBody(expr);
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001432 query.setVarCounter(getVarCounter());
Abdullah Alamoudidb37f662014-07-14 21:51:37 +03001433 // we remove the pointers to the locked entities before we return the query object
1434 setDataverses(null);
1435 setDatasets(null);
vinayakb38b7ca42012-03-05 05:44:15 +00001436 return query;
1437 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001438
vinayakb38b7ca42012-03-05 05:44:15 +00001439}
1440
1441
1442
1443Expression Expression():
1444{
1445 Expression expr = null;
1446 Expression exprP = null;
1447}
1448{
1449(
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001450
vinayakb38b7ca42012-03-05 05:44:15 +00001451//OperatorExpr | IfThenElse | FLWOGRExpression | QuantifiedExpression
1452 expr = OperatorExpr()
1453 | expr = IfThenElse()
1454 | expr = FLWOGR()
1455 | expr = QuantifiedExpression()
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001456
vinayakb38b7ca42012-03-05 05:44:15 +00001457
1458)
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001459 {
1460 return (exprP==null) ? expr : exprP;
1461 }
vinayakb38b7ca42012-03-05 05:44:15 +00001462}
1463
1464
1465
1466Expression OperatorExpr()throws ParseException:
1467{
1468 OperatorExpr op = null;
1469 Expression operand = null;
1470}
1471{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001472 operand = AndExpr()
1473 (
1474
1475 <OR>
1476 {
1477 if (op == null) {
1478 op = new OperatorExpr();
1479 op.addOperand(operand);
1480 op.setCurrentop(true);
1481 }
Till Westmanna4242bc2013-05-08 17:49:55 -07001482 op.addOperator(token.image);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001483 }
vinayakb38b7ca42012-03-05 05:44:15 +00001484
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001485 operand = AndExpr()
1486 {
1487 op.addOperand(operand);
1488 }
vinayakb38b7ca42012-03-05 05:44:15 +00001489
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001490 )*
1491
1492 {
1493 return op==null? operand: op;
1494 }
vinayakb38b7ca42012-03-05 05:44:15 +00001495}
1496
1497Expression AndExpr()throws ParseException:
1498{
1499 OperatorExpr op = null;
1500 Expression operand = null;
1501}
1502{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001503 operand = RelExpr()
1504 (
1505
1506 <AND>
1507 {
1508 if (op == null) {
1509 op = new OperatorExpr();
1510 op.addOperand(operand);
1511 op.setCurrentop(true);
1512 }
Till Westmanna4242bc2013-05-08 17:49:55 -07001513 op.addOperator(token.image);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001514 }
vinayakb38b7ca42012-03-05 05:44:15 +00001515
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001516 operand = RelExpr()
1517 {
1518 op.addOperand(operand);
1519 }
vinayakb38b7ca42012-03-05 05:44:15 +00001520
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001521 )*
1522
1523 {
1524 return op==null? operand: op;
1525 }
vinayakb38b7ca42012-03-05 05:44:15 +00001526}
1527
1528
1529
1530Expression RelExpr()throws ParseException:
1531{
1532 OperatorExpr op = null;
1533 Expression operand = null;
1534 boolean broadcast = false;
alexander.behm07617fd2012-07-25 10:13:50 +00001535 IExpressionAnnotation annotation = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001536}
1537{
1538 operand = AddExpr()
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001539 {
1540 if (operand instanceof VariableExpr) {
1541 String hint = getHint(token);
vinayakb38b7ca42012-03-05 05:44:15 +00001542 if (hint != null && hint.equals(BROADCAST_JOIN_HINT)) {
alexander.behm07617fd2012-07-25 10:13:50 +00001543 broadcast = true;
vinayakb38b7ca42012-03-05 05:44:15 +00001544 }
1545 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001546 }
vinayakb38b7ca42012-03-05 05:44:15 +00001547
1548 (
Till Westmann96c1f172013-08-01 02:05:48 -07001549 LOOKAHEAD(2)( <LT> | <GT> | <LE> | <GE> | <EQ> | <NE> |<SIMILAR>)
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001550 {
1551 String mhint = getHint(token);
1552 if (mhint != null) {
1553 if (mhint.equals(INDEXED_NESTED_LOOP_JOIN_HINT)) {
salsubaieedf89fbc2013-12-21 19:51:42 -08001554 annotation = IndexedNLJoinExpressionAnnotation.INSTANCE;
1555 } else if (mhint.equals(SKIP_SECONDARY_INDEX_SEARCH_HINT)) {
1556 annotation = SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE;
1557 }
alexander.behm07617fd2012-07-25 10:13:50 +00001558 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001559 if (op == null) {
1560 op = new OperatorExpr();
1561 op.addOperand(operand, broadcast);
vinayakb38b7ca42012-03-05 05:44:15 +00001562 op.setCurrentop(true);
1563 broadcast = false;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001564 }
Till Westmanna4242bc2013-05-08 17:49:55 -07001565 op.addOperator(token.image);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001566 }
1567
1568 operand = AddExpr()
1569 {
1570 broadcast = false;
alexander.behm07617fd2012-07-25 10:13:50 +00001571 if (operand instanceof VariableExpr) {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001572 String hint = getHint(token);
vinayakb38b7ca42012-03-05 05:44:15 +00001573 if (hint != null && hint.equals(BROADCAST_JOIN_HINT)) {
1574 broadcast = true;
1575 }
alexander.behm07617fd2012-07-25 10:13:50 +00001576 }
vinayakb38b7ca42012-03-05 05:44:15 +00001577 op.addOperand(operand, broadcast);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001578 }
vinayakb38b7ca42012-03-05 05:44:15 +00001579 )?
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001580
1581 {
1582 if (annotation != null) {
1583 op.addHint(annotation);
1584 }
1585 return op==null? operand: op;
1586 }
vinayakb38b7ca42012-03-05 05:44:15 +00001587}
1588
1589Expression AddExpr()throws ParseException:
1590{
1591 OperatorExpr op = null;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001592 Expression operand = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001593}
1594{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001595 operand = MultExpr()
vinayakb38b7ca42012-03-05 05:44:15 +00001596
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001597 ( (<PLUS> | <MINUS>)
1598 {
1599 if (op == null) {
1600 op = new OperatorExpr();
1601 op.addOperand(operand);
1602 op.setCurrentop(true);
1603 }
1604 ((OperatorExpr)op).addOperator(token.image);
1605 }
vinayakb38b7ca42012-03-05 05:44:15 +00001606
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001607 operand = MultExpr()
1608 {
1609 op.addOperand(operand);
1610 }
1611 )*
1612
1613 {
1614 return op==null? operand: op;
1615 }
vinayakb38b7ca42012-03-05 05:44:15 +00001616}
1617
1618Expression MultExpr()throws ParseException:
1619{
1620 OperatorExpr op = null;
1621 Expression operand = null;
1622}
1623{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001624 operand = UnionExpr()
vinayakb38b7ca42012-03-05 05:44:15 +00001625
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001626 (( <MUL> | <DIV> | <MOD> | <CARET> | <IDIV>)
1627 {
1628 if (op == null) {
1629 op = new OperatorExpr();
vinayakb38b7ca42012-03-05 05:44:15 +00001630 op.addOperand(operand);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001631 op.setCurrentop(true);
1632 }
1633 op.addOperator(token.image);
1634 }
1635 operand = UnionExpr()
1636 {
1637 op.addOperand(operand);
1638 }
1639 )*
1640
1641 {
1642 return op==null?operand:op;
1643 }
vinayakb38b7ca42012-03-05 05:44:15 +00001644}
1645
1646Expression UnionExpr() throws ParseException:
1647{
1648 UnionExpr union = null;
1649 Expression operand1 = null;
1650 Expression operand2 = null;
1651}
1652{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001653 operand1 = UnaryExpr()
1654 (<UNION>
vinayakb38b7ca42012-03-05 05:44:15 +00001655 (operand2 = UnaryExpr()) {
1656 if (union == null) {
1657 union = new UnionExpr();
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001658 union.addExpr(operand1);
vinayakb38b7ca42012-03-05 05:44:15 +00001659 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001660 union.addExpr(operand2);
vinayakb38b7ca42012-03-05 05:44:15 +00001661 } )*
1662 {
1663 return (union == null)? operand1: union;
1664 }
1665}
1666
1667Expression UnaryExpr() throws ParseException:
1668{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001669 Expression uexpr = null;
1670 Expression expr = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001671}
1672{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001673 ( (<PLUS> | <MINUS>)
1674 {
1675 uexpr = new UnaryExpr();
1676 if("+".equals(token.image))
1677 ((UnaryExpr)uexpr).setSign(Sign.POSITIVE);
1678 else if("-".equals(token.image))
1679 ((UnaryExpr)uexpr).setSign(Sign.NEGATIVE);
1680 else
1681 throw new ParseException();
1682 }
1683 )?
1684
1685 expr = ValueExpr()
1686 {
1687 if(uexpr!=null){
1688 ((UnaryExpr)uexpr).setExpr(expr);
1689 return uexpr;
1690 }
1691 else{
1692 return expr;
1693 }
1694 }
vinayakb38b7ca42012-03-05 05:44:15 +00001695}
1696
Till Westmann04478e72013-05-13 23:01:34 -07001697Expression ValueExpr()throws ParseException:
vinayakb38b7ca42012-03-05 05:44:15 +00001698{
1699 Expression expr = null;
1700 Identifier ident = null;
1701 AbstractAccessor fa = null;
icetindila611ac72014-05-16 10:10:11 -07001702 Expression indexExpr = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001703}
1704{
Till Westmann04478e72013-05-13 23:01:34 -07001705 expr = PrimaryExpr() ( ident = Field()
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001706 {
1707 fa = (fa == null ? new FieldAccessor(expr, ident)
Till Westmann04478e72013-05-13 23:01:34 -07001708 : new FieldAccessor(fa, ident));
1709 }
icetindila611ac72014-05-16 10:10:11 -07001710 | indexExpr = Index()
Till Westmann04478e72013-05-13 23:01:34 -07001711 {
icetindila611ac72014-05-16 10:10:11 -07001712 fa = (fa == null ? new IndexAccessor(expr, indexExpr)
1713 : new IndexAccessor(fa, indexExpr));
Till Westmann04478e72013-05-13 23:01:34 -07001714 }
1715 )*
1716 {
1717 return fa == null ? expr : fa;
1718 }
vinayakb38b7ca42012-03-05 05:44:15 +00001719}
1720
1721Identifier Field() throws ParseException:
1722{
Till Westmann14a20a72013-05-09 00:06:24 -07001723 String ident = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001724}
1725{
Till Westmann96c1f172013-08-01 02:05:48 -07001726 <DOT> ident = Identifier()
Till Westmanna4242bc2013-05-08 17:49:55 -07001727 {
Till Westmann14a20a72013-05-09 00:06:24 -07001728 return new Identifier(ident);
Till Westmanna4242bc2013-05-08 17:49:55 -07001729 }
vinayakb38b7ca42012-03-05 05:44:15 +00001730}
1731
icetindila611ac72014-05-16 10:10:11 -07001732Expression Index() throws ParseException:
vinayakb38b7ca42012-03-05 05:44:15 +00001733{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001734 Expression expr = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001735}
1736{
Till Westmann96c1f172013-08-01 02:05:48 -07001737 <LEFTBRACKET> ( expr = Expression()
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001738 {
1739 if(expr.getKind() == Expression.Kind.LITERAL_EXPRESSION)
1740 {
1741 Literal lit = ((LiteralExpr)expr).getValue();
1742 if(lit.getLiteralType() != Literal.Type.INTEGER &&
1743 lit.getLiteralType() != Literal.Type.LONG) {
1744 throw new ParseException("Index should be an INTEGER");
vinayakb38b7ca42012-03-05 05:44:15 +00001745 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001746 }
1747 }
vinayakb38b7ca42012-03-05 05:44:15 +00001748
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001749 | <QUES> // ANY
1750
1751 )
vinayakb38b7ca42012-03-05 05:44:15 +00001752
Till Westmann96c1f172013-08-01 02:05:48 -07001753 <RIGHTBRACKET>
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001754 {
1755 return expr;
1756 }
vinayakb38b7ca42012-03-05 05:44:15 +00001757}
1758
1759
1760Expression PrimaryExpr()throws ParseException:
1761{
1762 Expression expr = null;
1763}
1764{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001765 ( LOOKAHEAD(2)
Till Westmann68d99652013-05-09 11:15:21 -07001766 expr = FunctionCallExpr()
1767 | expr = Literal()
1768 | expr = DatasetAccessExpression()
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001769 | expr = VariableRef()
vinayakb38b7ca42012-03-05 05:44:15 +00001770 {
1771 if(((VariableExpr)expr).getIsNewVar() == true)
Till Westmann68d99652013-05-09 11:15:21 -07001772 throw new ParseException("can't find variable " + ((VariableExpr)expr).getVar());
vinayakb38b7ca42012-03-05 05:44:15 +00001773 }
Till Westmann68d99652013-05-09 11:15:21 -07001774 | expr = ListConstructor()
1775 | expr = RecordConstructor()
1776 | expr = ParenthesizedExpression()
1777 )
1778 {
1779 return expr;
1780 }
vinayakb38b7ca42012-03-05 05:44:15 +00001781}
1782
1783Expression Literal() throws ParseException:
1784{
vinayakb38b7ca42012-03-05 05:44:15 +00001785 LiteralExpr lit = new LiteralExpr();
Till Westmann7d535322013-05-09 00:40:02 -07001786 String str = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001787}
1788{
Till Westmann7d535322013-05-09 00:40:02 -07001789 ( str = StringLiteral()
vinayakb38b7ca42012-03-05 05:44:15 +00001790 {
Till Westmann7d535322013-05-09 00:40:02 -07001791 lit.setValue(new StringLiteral(str));
Till Westmanna4242bc2013-05-08 17:49:55 -07001792 }
1793 | <INTEGER_LITERAL>
vinayakb38b7ca42012-03-05 05:44:15 +00001794 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001795 lit.setValue(new LongIntegerLiteral(new Long(token.image)));
Till Westmanna4242bc2013-05-08 17:49:55 -07001796 }
1797 | <FLOAT_LITERAL>
vinayakb38b7ca42012-03-05 05:44:15 +00001798 {
Till Westmanna4242bc2013-05-08 17:49:55 -07001799 lit.setValue(new FloatLiteral(new Float(token.image)));
1800 }
1801 | <DOUBLE_LITERAL>
1802 {
1803 lit.setValue(new DoubleLiteral(new Double(token.image)));
1804 }
1805 | <NULL>
1806 {
1807 lit.setValue(NullLiteral.INSTANCE);
1808 }
1809 | <TRUE>
1810 {
1811 lit.setValue(TrueLiteral.INSTANCE);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001812 }
Till Westmanna4242bc2013-05-08 17:49:55 -07001813 | <FALSE>
1814 {
1815 lit.setValue(FalseLiteral.INSTANCE);
1816 }
1817 )
vinayakb38b7ca42012-03-05 05:44:15 +00001818 {
1819 return lit;
1820 }
1821}
1822
1823
1824VariableExpr VariableRef() throws ParseException:
1825{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001826 VariableExpr varExp = new VariableExpr();
1827 VarIdentifier var = new VarIdentifier();
vinayakb38b7ca42012-03-05 05:44:15 +00001828}
1829{
Till Westmann4f58e1a2013-05-20 18:29:54 -07001830 <VARIABLE>
vinayakb38b7ca42012-03-05 05:44:15 +00001831 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001832 String varName = token.image;
vinayakb38b7ca42012-03-05 05:44:15 +00001833 Identifier ident = lookupSymbol(varName);
1834 if (isInForbiddenScopes(varName)) {
1835 throw new ParseException("Inside limit clauses, it is disallowed to reference a variable having the same name as any variable bound in the same scope as the limit clause.");
1836 }
1837 if(ident != null) { // exist such ident
1838 varExp.setIsNewVar(false);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001839 varExp.setVar((VarIdentifier)ident);
vinayakb38b7ca42012-03-05 05:44:15 +00001840 } else {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001841 varExp.setVar(var);
vinayakb38b7ca42012-03-05 05:44:15 +00001842 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001843 var.setValue(varName);
vinayakb38b7ca42012-03-05 05:44:15 +00001844 return varExp;
1845 }
1846}
1847
1848
1849VariableExpr Variable() throws ParseException:
1850{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001851 VariableExpr varExp = new VariableExpr();
1852 VarIdentifier var = new VarIdentifier();
vinayakb38b7ca42012-03-05 05:44:15 +00001853}
1854{
Till Westmann4f58e1a2013-05-20 18:29:54 -07001855 <VARIABLE>
vinayakb38b7ca42012-03-05 05:44:15 +00001856 {
Till Westmanna4242bc2013-05-08 17:49:55 -07001857 Identifier ident = lookupSymbol(token.image);
vinayakb38b7ca42012-03-05 05:44:15 +00001858 if(ident != null) { // exist such ident
1859 varExp.setIsNewVar(false);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001860 }
1861 varExp.setVar(var);
1862 var.setValue(token.image);
vinayakb38b7ca42012-03-05 05:44:15 +00001863 return varExp;
1864 }
1865}
1866
1867Expression ListConstructor() throws ParseException:
1868{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001869 Expression expr = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001870}
1871{
1872 (
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001873 expr = OrderedListConstructor() | expr = UnorderedListConstructor()
vinayakb38b7ca42012-03-05 05:44:15 +00001874 )
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001875
vinayakb38b7ca42012-03-05 05:44:15 +00001876 {
1877 return expr;
1878 }
1879}
1880
1881
1882ListConstructor OrderedListConstructor() throws ParseException:
1883{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001884 ListConstructor expr = new ListConstructor();
1885 Expression tmp = null;
1886 List<Expression> exprList = new ArrayList<Expression>();
1887 expr.setType(ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR);
vinayakb38b7ca42012-03-05 05:44:15 +00001888}
1889{
1890
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001891 <LEFTBRACKET>
1892 ( tmp = Expression()
1893 {
1894 exprList.add(tmp);
1895 }
1896
1897 (<COMMA> tmp = Expression() { exprList.add(tmp); })*
1898 )?
1899
Till Westmann96c1f172013-08-01 02:05:48 -07001900 <RIGHTBRACKET>
vinayakb38b7ca42012-03-05 05:44:15 +00001901
1902 {
1903 expr.setExprList(exprList);
1904 return expr;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001905 }
vinayakb38b7ca42012-03-05 05:44:15 +00001906}
1907
1908ListConstructor UnorderedListConstructor() throws ParseException:
1909{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001910 ListConstructor expr = new ListConstructor();
1911 Expression tmp = null;
1912 List<Expression> exprList = new ArrayList<Expression>();
1913 expr.setType(ListConstructor.Type.UNORDERED_LIST_CONSTRUCTOR);
vinayakb38b7ca42012-03-05 05:44:15 +00001914}
1915{
1916
Till Westmann96c1f172013-08-01 02:05:48 -07001917 <LEFTDBLBRACE> ( tmp = Expression()
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001918 {
1919 exprList.add(tmp);
1920 }
Till Westmann96c1f172013-08-01 02:05:48 -07001921 (<COMMA> tmp = Expression() { exprList.add(tmp); })*)? <RIGHTDBLBRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00001922 {
1923 expr.setExprList(exprList);
1924 return expr;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001925 }
vinayakb38b7ca42012-03-05 05:44:15 +00001926}
1927
1928RecordConstructor RecordConstructor() throws ParseException:
1929{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001930 RecordConstructor expr = new RecordConstructor();
1931 FieldBinding tmp = null;
1932 List<FieldBinding> fbList = new ArrayList<FieldBinding>();
vinayakb38b7ca42012-03-05 05:44:15 +00001933}
1934{
Till Westmann96c1f172013-08-01 02:05:48 -07001935 <LEFTBRACE> (tmp = FieldBinding()
vinayakb38b7ca42012-03-05 05:44:15 +00001936 {
1937 fbList.add(tmp);
1938 }
Till Westmann96c1f172013-08-01 02:05:48 -07001939 (<COMMA> tmp = FieldBinding() { fbList.add(tmp); })*)? <RIGHTBRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00001940 {
1941 expr.setFbList(fbList);
1942 return expr;
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001943 }
vinayakb38b7ca42012-03-05 05:44:15 +00001944}
1945
1946FieldBinding FieldBinding() throws ParseException:
1947{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001948 FieldBinding fb = new FieldBinding();
1949 Expression left, right;
vinayakb38b7ca42012-03-05 05:44:15 +00001950}
1951{
Till Westmann96c1f172013-08-01 02:05:48 -07001952 left = Expression() <COLON> right = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00001953 {
1954 fb.setLeftExpr(left);
1955 fb.setRightExpr(right);
1956 return fb;
1957 }
1958}
1959
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001960
vinayakb38b7ca42012-03-05 05:44:15 +00001961Expression FunctionCallExpr() throws ParseException:
1962{
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00001963 CallExpr callExpr;
alexander.behm07617fd2012-07-25 10:13:50 +00001964 List<Expression> argList = new ArrayList<Expression>();
vinayakb38b7ca42012-03-05 05:44:15 +00001965 Expression tmp;
1966 int arity = 0;
ramangrover299f76a5e2013-06-18 10:25:17 -07001967 FunctionName funcName = null;
Till Westmann31c21f92013-05-08 09:21:53 -07001968 String hint = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001969}
Taewoo Kima12d8cd2015-03-04 13:47:08 -08001970{
ramangrover299f76a5e2013-06-18 10:25:17 -07001971 funcName = FunctionName()
vinayakb38b7ca42012-03-05 05:44:15 +00001972 {
Till Westmann31c21f92013-05-08 09:21:53 -07001973 hint = getHint(token);
vinayakb38b7ca42012-03-05 05:44:15 +00001974 }
Till Westmann31c21f92013-05-08 09:21:53 -07001975 <LEFTPAREN> (tmp = Expression()
1976 {
1977 argList.add(tmp);
1978 arity ++;
1979 }
Till Westmann96c1f172013-08-01 02:05:48 -07001980 (<COMMA> tmp = Expression()
Till Westmann31c21f92013-05-08 09:21:53 -07001981 {
1982 argList.add(tmp);
1983 arity++;
1984 }
1985 )*)? <RIGHTPAREN>
1986 {
ramangrover299f76a5e2013-06-18 10:25:17 -07001987 // TODO use funcName.library
ramangrover29bdba1a82013-06-21 17:17:52 -07001988 String fqFunctionName = funcName.library == null ? funcName.function : funcName.library + "#" + funcName.function;
ramangrover299f76a5e2013-06-18 10:25:17 -07001989 FunctionSignature signature
ramangrover29bdba1a82013-06-21 17:17:52 -07001990 = lookupFunctionSignature(funcName.dataverse, fqFunctionName, arity);
Till Westmann31c21f92013-05-08 09:21:53 -07001991 if (signature == null) {
ramangrover29bdba1a82013-06-21 17:17:52 -07001992 signature = new FunctionSignature(funcName.dataverse, fqFunctionName, arity);
Till Westmann31c21f92013-05-08 09:21:53 -07001993 }
1994 callExpr = new CallExpr(signature,argList);
salsubaieedf89fbc2013-12-21 19:51:42 -08001995 if (hint != null) {
1996 if (hint.startsWith(INDEXED_NESTED_LOOP_JOIN_HINT)) {
1997 callExpr.addHint(IndexedNLJoinExpressionAnnotation.INSTANCE);
1998 } else if (hint.startsWith(SKIP_SECONDARY_INDEX_SEARCH_HINT)) {
1999 callExpr.addHint(SkipSecondaryIndexSearchExpressionAnnotation.INSTANCE);
2000 }
Till Westmann31c21f92013-05-08 09:21:53 -07002001 }
2002 return callExpr;
2003 }
vinayakb38b7ca42012-03-05 05:44:15 +00002004}
2005
ramangrover29@gmail.com5f248e12013-04-11 01:03:09 +00002006
pouria.pirzadeh@gmail.comfa890742013-03-07 23:59:21 +00002007Expression DatasetAccessExpression() throws ParseException:
2008{
pouria.pirzadeh@gmail.comfa890742013-03-07 23:59:21 +00002009 String funcName;
Till Westmann14a20a72013-05-09 00:06:24 -07002010 String arg1 = null;
2011 String arg2 = null;
pouria.pirzadeh@gmail.comfa890742013-03-07 23:59:21 +00002012 Expression nameArg;
pouria.pirzadeh@gmail.comfa890742013-03-07 23:59:21 +00002013}
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002014{
Till Westmann14a20a72013-05-09 00:06:24 -07002015 <DATASET>
2016 {
Till Westmann14a20a72013-05-09 00:06:24 -07002017 funcName = token.image;
2018 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002019 ( ( arg1 = Identifier() ( <DOT> arg2 = Identifier() )? )
Till Westmann14a20a72013-05-09 00:06:24 -07002020 {
2021 String name = arg2 == null ? arg1 : arg1 + "." + arg2;
Till Westmann1f7a2362013-05-24 08:43:40 -07002022 LiteralExpr ds = new LiteralExpr();
Till Westmann14a20a72013-05-09 00:06:24 -07002023 ds.setValue( new StringLiteral(name) );
Till Westmann1f7a2362013-05-24 08:43:40 -07002024 nameArg = ds;
Abdullah Alamoudidb37f662014-07-14 21:51:37 +03002025 if(arg2 != null){
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002026 addDataverse(arg1.toString());
2027 addDataset(name);
Abdullah Alamoudidb37f662014-07-14 21:51:37 +03002028 } else {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002029 addDataset(defaultDataverse + "." + name);
Abdullah Alamoudidb37f662014-07-14 21:51:37 +03002030 }
Till Westmann14a20a72013-05-09 00:06:24 -07002031 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002032 | ( <LEFTPAREN> nameArg = Expression() <RIGHTPAREN> ) )
Till Westmann14a20a72013-05-09 00:06:24 -07002033 {
Till Westmann1f7a2362013-05-24 08:43:40 -07002034 String dataverse = MetadataConstants.METADATA_DATAVERSE_NAME;
2035 FunctionSignature signature = lookupFunctionSignature(dataverse, funcName, 1);
2036 if (signature == null) {
2037 signature = new FunctionSignature(dataverse, funcName, 1);
2038 }
2039 List<Expression> argList = new ArrayList<Expression>();
Till Westmann14a20a72013-05-09 00:06:24 -07002040 argList.add(nameArg);
Till Westmann1f7a2362013-05-24 08:43:40 -07002041 return new CallExpr(signature, argList);
Till Westmann14a20a72013-05-09 00:06:24 -07002042 }
pouria.pirzadeh@gmail.comfa890742013-03-07 23:59:21 +00002043}
RamanGrover29@gmail.com58cf3302012-11-09 00:27:45 +00002044
vinayakb38b7ca42012-03-05 05:44:15 +00002045Expression ParenthesizedExpression() throws ParseException:
2046{
2047 Expression expr;
2048}
2049{
2050 <LEFTPAREN> expr = Expression() <RIGHTPAREN>
2051 {
2052 return expr;
2053 }
2054}
2055
2056Expression IfThenElse() throws ParseException:
2057{
2058 Expression condExpr;
2059 Expression thenExpr;
2060 Expression elseExpr;
2061 IfExpr ifExpr = new IfExpr();
2062}
2063{
Till Westmann96c1f172013-08-01 02:05:48 -07002064 <IF> <LEFTPAREN> condExpr = Expression() <RIGHTPAREN> <THEN> thenExpr = Expression() <ELSE> elseExpr = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00002065
2066 {
2067 ifExpr.setCondExpr(condExpr);
2068 ifExpr.setThenExpr(thenExpr);
2069 ifExpr.setElseExpr(elseExpr);
2070 return ifExpr;
2071 }
2072}
2073
2074Expression FLWOGR() throws ParseException:
2075{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002076 FLWOGRExpression flworg = new FLWOGRExpression();
2077 List<Clause> clauseList = new ArrayList<Clause>();
2078 Expression returnExpr;
2079 Clause tmp;
2080 createNewScope();
vinayakb38b7ca42012-03-05 05:44:15 +00002081}
2082{
2083 (tmp = ForClause() {clauseList.add(tmp);} | tmp = LetClause() {clauseList.add(tmp);})
buyingyi2fd7fa62014-11-24 19:31:55 -08002084 (tmp = Clause() {clauseList.add(tmp);})* (<RETURN>|<SELECT>) returnExpr = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00002085
2086 {
2087 flworg.setClauseList(clauseList);
2088 flworg.setReturnExpr(returnExpr);
2089 removeCurrentScope();
2090 return flworg;
2091 }
2092}
2093
2094Clause Clause()throws ParseException :
2095{
2096 Clause clause;
2097}
2098{
2099 (
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002100 clause = ForClause()
2101 | clause = LetClause()
2102 | clause = WhereClause()
2103 | clause = OrderbyClause()
2104 | clause = GroupClause()
vinayakb38b7ca42012-03-05 05:44:15 +00002105 | clause = LimitClause()
2106 | clause = DistinctClause()
vinayakb38b7ca42012-03-05 05:44:15 +00002107 )
2108 {
2109 return clause;
2110 }
2111}
2112
2113Clause ForClause()throws ParseException :
2114{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002115 ForClause fc = new ForClause();
2116 VariableExpr varExp;
2117 VariableExpr varPos = null;
2118 Expression inExp;
2119 extendCurrentScope();
vinayakb38b7ca42012-03-05 05:44:15 +00002120}
2121{
buyingyi2fd7fa62014-11-24 19:31:55 -08002122 (<FOR>|<FROM>) varExp = Variable() (<AT> varPos = Variable())? <IN> ( inExp = Expression() )
vinayakb38b7ca42012-03-05 05:44:15 +00002123 {
2124 fc.setVarExpr(varExp);
Vinayak Borkar62e66c02013-05-28 13:56:11 -07002125 getCurrentScope().addNewVarSymbolToScope(varExp.getVar());
vinayakb38b7ca42012-03-05 05:44:15 +00002126 fc.setInExpr(inExp);
2127 if (varPos != null) {
2128 fc.setPosExpr(varPos);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002129 getCurrentScope().addNewVarSymbolToScope(varPos.getVar());
vinayakb38b7ca42012-03-05 05:44:15 +00002130 }
2131 return fc;
2132 }
2133}
2134
2135Clause LetClause() throws ParseException:
2136{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002137 LetClause lc = new LetClause();
2138 VariableExpr varExp;
2139 Expression beExp;
2140 extendCurrentScope();
vinayakb38b7ca42012-03-05 05:44:15 +00002141}
2142{
buyingyi2fd7fa62014-11-24 19:31:55 -08002143 (<LET>|<WITH>) varExp = Variable() <ASSIGN> beExp = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00002144 {
2145 getCurrentScope().addNewVarSymbolToScope(varExp.getVar());
vinayakb38b7ca42012-03-05 05:44:15 +00002146 lc.setVarExpr(varExp);
2147 lc.setBeExpr(beExp);
2148 return lc;
2149 }
2150}
2151
2152Clause WhereClause()throws ParseException :
2153{
2154 WhereClause wc = new WhereClause();
2155 Expression whereExpr;
2156}
2157{
salsubaieedf89fbc2013-12-21 19:51:42 -08002158 <WHERE> whereExpr = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00002159 {
2160 wc.setWhereExpr(whereExpr);
2161 return wc;
2162 }
2163}
2164
2165Clause OrderbyClause()throws ParseException :
2166{
Eldon Carmand2d78ad2015-05-07 16:23:41 -07002167 OrderbyClause oc = new OrderbyClause();
2168 Expression orderbyExpr;
2169 List<Expression> orderbyList = new ArrayList<Expression>();
2170 List<OrderbyClause.OrderModifier> modifierList = new ArrayList<OrderbyClause.OrderModifier >();
2171 int numOfOrderby = 0;
vinayakb38b7ca42012-03-05 05:44:15 +00002172}
2173{
2174 (
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002175 <ORDER>
vinayakb38b7ca42012-03-05 05:44:15 +00002176 {
Eldon Carmand2d78ad2015-05-07 16:23:41 -07002177 String hint = getHint(token);
2178 if (hint != null) {
2179 if (hint.startsWith(INMEMORY_HINT)) {
2180 String splits[] = hint.split(" +");
2181 int numFrames = Integer.parseInt(splits[1]);
2182 int numTuples = Integer.parseInt(splits[2]);
2183 oc.setNumFrames(numFrames);
2184 oc.setNumTuples(numTuples);
2185 }
2186 if (hint.startsWith(RANGE_HINT)) {
2187 oc.setRangeMap(RangeMapBuilder.parseHint(hint.substring(RANGE_HINT.length())));
2188 }
2189 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002190 }
Till Westmann96c1f172013-08-01 02:05:48 -07002191 <BY> orderbyExpr = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00002192 {
2193 orderbyList.add(orderbyExpr);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002194 OrderbyClause.OrderModifier modif = OrderbyClause.OrderModifier.ASC;
vinayakb38b7ca42012-03-05 05:44:15 +00002195 }
Till Westmann96c1f172013-08-01 02:05:48 -07002196 ( (<ASC> { modif = OrderbyClause.OrderModifier.ASC; })
2197 | (<DESC> { modif = OrderbyClause.OrderModifier.DESC; }))?
vinayakb38b7ca42012-03-05 05:44:15 +00002198 {
2199 modifierList.add(modif);
2200 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002201
Till Westmann96c1f172013-08-01 02:05:48 -07002202 (<COMMA> orderbyExpr = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00002203 {
2204 orderbyList.add(orderbyExpr);
2205 modif = OrderbyClause.OrderModifier.ASC;
2206 }
Till Westmann96c1f172013-08-01 02:05:48 -07002207 ( (<ASC> { modif = OrderbyClause.OrderModifier.ASC; })
2208 | (<DESC> { modif = OrderbyClause.OrderModifier.DESC; }))?
vinayakb38b7ca42012-03-05 05:44:15 +00002209 {
2210 modifierList.add(modif);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002211 }
vinayakb38b7ca42012-03-05 05:44:15 +00002212 )*
2213)
2214 {
2215 oc.setModifierList(modifierList);
2216 oc.setOrderbyList(orderbyList);
2217 return oc;
2218 }
2219}
2220Clause GroupClause()throws ParseException :
2221{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002222 GroupbyClause gbc = new GroupbyClause();
2223 // GbyVariableExpressionPair pair = new GbyVariableExpressionPair();
2224 List<GbyVariableExpressionPair> vePairList = new ArrayList<GbyVariableExpressionPair>();
vinayakb38b7ca42012-03-05 05:44:15 +00002225 List<GbyVariableExpressionPair> decorPairList = new ArrayList<GbyVariableExpressionPair>();
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002226 List<VariableExpr> withVarList= new ArrayList<VariableExpr>();
2227 VariableExpr var = null;
2228 VariableExpr withVar = null;
2229 Expression expr = null;
2230 VariableExpr decorVar = null;
2231 Expression decorExpr = null;
vinayakb38b7ca42012-03-05 05:44:15 +00002232}
2233{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002234 {
2235 Scope newScope = extendCurrentScopeNoPush(true);
2236 // extendCurrentScope(true);
2237 }
Till Westmann96c1f172013-08-01 02:05:48 -07002238 <GROUP>
vinayakb38b7ca42012-03-05 05:44:15 +00002239 {
2240 String hint = getHint(token);
2241 if (hint != null && hint.equals(HASH_GROUP_BY_HINT)) {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002242 gbc.setHashGroupByHint(true);
2243 }
2244 }
Till Westmann96c1f172013-08-01 02:05:48 -07002245 <BY> (LOOKAHEAD(2) var = Variable()
vinayakb38b7ca42012-03-05 05:44:15 +00002246 {
2247 newScope.addNewVarSymbolToScope(var.getVar());
Till Westmann96c1f172013-08-01 02:05:48 -07002248 } <ASSIGN>)?
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002249 expr = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00002250 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002251 GbyVariableExpressionPair pair1 = new GbyVariableExpressionPair(var, expr);
vinayakb38b7ca42012-03-05 05:44:15 +00002252 vePairList.add(pair1);
2253 }
Till Westmann96c1f172013-08-01 02:05:48 -07002254 (<COMMA> ( LOOKAHEAD(2) var = Variable()
vinayakb38b7ca42012-03-05 05:44:15 +00002255 {
2256 newScope.addNewVarSymbolToScope(var.getVar());
Till Westmann96c1f172013-08-01 02:05:48 -07002257 } <ASSIGN>)?
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002258 expr = Expression()
2259 {
2260 GbyVariableExpressionPair pair2 = new GbyVariableExpressionPair(var, expr);
vinayakb38b7ca42012-03-05 05:44:15 +00002261 vePairList.add(pair2);
2262 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002263 )*
Till Westmann96c1f172013-08-01 02:05:48 -07002264 (<DECOR> decorVar = Variable() <ASSIGN> decorExpr = Expression()
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002265 {
2266 newScope.addNewVarSymbolToScope(decorVar.getVar());
vinayakb38b7ca42012-03-05 05:44:15 +00002267 GbyVariableExpressionPair pair3 = new GbyVariableExpressionPair(decorVar, decorExpr);
2268 decorPairList.add(pair3);
2269 }
Till Westmann96c1f172013-08-01 02:05:48 -07002270 (<COMMA> <DECOR> decorVar = Variable() <ASSIGN> decorExpr = Expression()
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002271 {
2272 newScope.addNewVarSymbolToScope(decorVar.getVar());
vinayakb38b7ca42012-03-05 05:44:15 +00002273 GbyVariableExpressionPair pair4 = new GbyVariableExpressionPair(decorVar, decorExpr);
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002274 decorPairList.add(pair4);
vinayakb38b7ca42012-03-05 05:44:15 +00002275 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002276 )*
2277 )?
buyingyi3ca46d02015-01-27 23:22:09 -08002278 (<WITH>|<KEEPING>) withVar = VariableRef()
vinayakb38b7ca42012-03-05 05:44:15 +00002279 {
2280 if(withVar.getIsNewVar()==true)
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002281 throw new ParseException("can't find variable " + withVar.getVar());
vinayakb38b7ca42012-03-05 05:44:15 +00002282 withVarList.add(withVar);
2283 newScope.addNewVarSymbolToScope(withVar.getVar());
2284 }
Till Westmann96c1f172013-08-01 02:05:48 -07002285 (<COMMA> withVar = VariableRef()
vinayakb38b7ca42012-03-05 05:44:15 +00002286 {
2287 if(withVar.getIsNewVar()==true)
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002288 throw new ParseException("can't find variable " + withVar.getVar());
vinayakb38b7ca42012-03-05 05:44:15 +00002289 withVarList.add(withVar);
2290 newScope.addNewVarSymbolToScope(withVar.getVar());
2291 })*
2292 {
2293 gbc.setGbyPairList(vePairList);
2294 gbc.setDecorPairList(decorPairList);
2295 gbc.setWithVarList(withVarList);
2296 replaceCurrentScope(newScope);
2297 return gbc;
2298 }
2299}
2300
2301
2302LimitClause LimitClause() throws ParseException:
2303{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002304 LimitClause lc = new LimitClause();
2305 Expression expr;
2306 pushForbiddenScope(getCurrentScope());
vinayakb38b7ca42012-03-05 05:44:15 +00002307}
2308{
Till Westmann96c1f172013-08-01 02:05:48 -07002309 <LIMIT> expr = Expression() { lc.setLimitExpr(expr); }
2310 (<OFFSET> expr = Expression() { lc.setOffset(expr); })?
vinayakb38b7ca42012-03-05 05:44:15 +00002311
2312 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002313 popForbiddenScope();
vinayakb38b7ca42012-03-05 05:44:15 +00002314 return lc;
2315 }
2316}
2317
2318DistinctClause DistinctClause() throws ParseException:
2319{
2320 List<Expression> exprs = new ArrayList<Expression>();
2321 Expression expr;
2322}
2323{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002324 <DISTINCT> <BY> expr = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00002325 {
2326 exprs.add(expr);
2327 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002328 (<COMMA> expr = Expression()
2329 {
2330 exprs.add(expr);
2331 }
vinayakb38b7ca42012-03-05 05:44:15 +00002332 )*
2333 {
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002334 return new DistinctClause(exprs);
vinayakb38b7ca42012-03-05 05:44:15 +00002335 }
2336}
2337
vinayakb38b7ca42012-03-05 05:44:15 +00002338QuantifiedExpression QuantifiedExpression()throws ParseException:
2339{
2340 QuantifiedExpression qc = new QuantifiedExpression();
2341 List<QuantifiedPair> quantifiedList = new ArrayList<QuantifiedPair>();
2342 Expression satisfiesExpr;
2343 VariableExpr var;
2344 Expression inExpr;
2345 QuantifiedPair pair;
2346}
2347{
2348 {
2349 createNewScope();
2350 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002351
Till Westmann96c1f172013-08-01 02:05:48 -07002352 ( (<SOME> { qc.setQuantifier(QuantifiedExpression.Quantifier.SOME); })
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002353 | (<EVERY> { qc.setQuantifier(QuantifiedExpression.Quantifier.EVERY); }))
2354 var = Variable() <IN> inExpr = Expression()
2355 {
vinayakb38b7ca42012-03-05 05:44:15 +00002356 pair = new QuantifiedPair(var, inExpr);
2357 getCurrentScope().addNewVarSymbolToScope(var.getVar());
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002358 quantifiedList.add(pair);
2359 }
2360 (
2361 <COMMA> var = Variable() <IN> inExpr = Expression()
2362 {
2363 pair = new QuantifiedPair(var, inExpr);
2364 getCurrentScope().addNewVarSymbolToScope(var.getVar());
2365 quantifiedList.add(pair);
2366 }
2367 )*
2368 <SATISFIES> satisfiesExpr = Expression()
2369 {
2370 qc.setSatisfiesExpr(satisfiesExpr);
2371 qc.setQuantifiedList(quantifiedList);
2372 removeCurrentScope();
2373 return qc;
2374 }
vinayakb38b7ca42012-03-05 05:44:15 +00002375}
2376
2377TOKEN_MGR_DECLS:
2378{
Till Westmann96c1f172013-08-01 02:05:48 -07002379 public int commentDepth = 0;
2380 public IntStack lexerStateStack = new IntStack();
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002381
Till Westmann96c1f172013-08-01 02:05:48 -07002382 public void pushState() {
2383 lexerStateStack.push( curLexState );
2384 }
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002385
Till Westmannfd733ee2014-07-10 00:57:37 -07002386 public void popState(String token) {
Till Westmann96c1f172013-08-01 02:05:48 -07002387 if (lexerStateStack.size() > 0) {
2388 SwitchTo( lexerStateStack.pop() );
2389 } else {
Till Westmannfd733ee2014-07-10 00:57:37 -07002390 int errorLine = input_stream.getEndLine();
2391 int errorColumn = input_stream.getEndColumn();
2392 String msg = "Lexical error at line " + errorLine + ", column " + errorColumn + ". Encountered \"" + token
2393 + "\" but state stack is empty.";
2394 throw new TokenMgrError(msg, -1);
Till Westmann96c1f172013-08-01 02:05:48 -07002395 }
2396 }
vinayakb38b7ca42012-03-05 05:44:15 +00002397}
2398
Till Westmann96c1f172013-08-01 02:05:48 -07002399<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002400TOKEN :
2401{
Till Westmann5df7b452013-08-02 13:07:16 -07002402 <ASC : "asc">
2403 | <AT : "at">
2404 | <BY : "by">
2405 | <DATASET : "dataset">
2406 | <DECOR : "decor">
2407 | <DESC : "desc">
2408 | <DISTINCT : "distinct">
2409 | <ELSE : "else">
2410 | <EVERY : "every">
2411 | <FOR : "for">
buyingyi2fd7fa62014-11-24 19:31:55 -08002412 | <FROM : "from">
Till Westmann5df7b452013-08-02 13:07:16 -07002413 | <GROUP : "group">
2414 | <IF : "if">
2415 | <IN : "in">
2416 | <LET : "let">
2417 | <LIMIT : "limit">
2418 | <OFFSET : "offset">
2419 | <ORDER : "order">
2420 | <RETURN : "return">
2421 | <SATISFIES : "satisfies">
buyingyi2fd7fa62014-11-24 19:31:55 -08002422 | <SELECT : "select">
Till Westmann5df7b452013-08-02 13:07:16 -07002423 | <SOME : "some">
2424 | <THEN : "then">
2425 | <UNION : "union">
2426 | <WHERE : "where">
2427 | <WITH : "with">
buyingyi3ca46d02015-01-27 23:22:09 -08002428 | <KEEPING : "keeping">
vinayakb38b7ca42012-03-05 05:44:15 +00002429}
2430
Till Westmann96c1f172013-08-01 02:05:48 -07002431<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002432TOKEN :
2433{
Till Westmann5df7b452013-08-02 13:07:16 -07002434 <CARET : "^">
2435 | <DIV : "/">
2436 | <IDIV : "idiv">
2437 | <MINUS : "-">
2438 | <MOD : "%">
2439 | <MUL : "*">
2440 | <PLUS : "+">
2441
2442 | <LEFTPAREN : "(">
2443 | <RIGHTPAREN : ")">
2444 | <LEFTBRACKET : "[">
2445 | <RIGHTBRACKET : "]">
2446
2447 | <COLON : ":">
2448 | <COMMA : ",">
2449 | <DOT : ".">
2450 | <QUES : "?">
2451
2452 | <LT : "<">
2453 | <GT : ">">
2454 | <LE : "<=">
2455 | <GE : ">=">
2456 | <EQ : "=">
2457 | <NE : "!=">
2458 | <SIMILAR : "~=">
2459 | <ASSIGN : ":=">
2460
2461 | <AND : "and">
2462 | <OR : "or">
vinayakb38b7ca42012-03-05 05:44:15 +00002463}
2464
Till Westmann96c1f172013-08-01 02:05:48 -07002465<DEFAULT,IN_DBL_BRACE>
2466TOKEN :
2467{
Till Westmann5df7b452013-08-02 13:07:16 -07002468 <LEFTBRACE : "{"> { pushState(); } : DEFAULT
vinayakb38b7ca42012-03-05 05:44:15 +00002469}
2470
2471<DEFAULT>
2472TOKEN :
2473{
Till Westmannfd733ee2014-07-10 00:57:37 -07002474 <RIGHTBRACE : "}"> { popState("}"); }
vinayakb38b7ca42012-03-05 05:44:15 +00002475}
2476
Till Westmann96c1f172013-08-01 02:05:48 -07002477<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002478TOKEN :
2479{
Till Westmann5df7b452013-08-02 13:07:16 -07002480 <LEFTDBLBRACE : "{{"> { pushState(); } : IN_DBL_BRACE
vinayakb38b7ca42012-03-05 05:44:15 +00002481}
2482
Till Westmann96c1f172013-08-01 02:05:48 -07002483<IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002484TOKEN :
2485{
Till Westmannfd733ee2014-07-10 00:57:37 -07002486 <RIGHTDBLBRACE : "}}"> { popState("}}"); }
vinayakb38b7ca42012-03-05 05:44:15 +00002487}
2488
Till Westmann96c1f172013-08-01 02:05:48 -07002489<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002490TOKEN :
2491{
Till Westmann5df7b452013-08-02 13:07:16 -07002492 <INTEGER_LITERAL : (<DIGIT>)+ >
vinayakb38b7ca42012-03-05 05:44:15 +00002493}
2494
Till Westmann96c1f172013-08-01 02:05:48 -07002495<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002496TOKEN :
2497{
Till Westmann5df7b452013-08-02 13:07:16 -07002498 <NULL : "null">
2499 | <TRUE : "true">
2500 | <FALSE : "false">
vinayakb38b7ca42012-03-05 05:44:15 +00002501}
2502
Till Westmann96c1f172013-08-01 02:05:48 -07002503<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002504TOKEN :
2505{
Till Westmann5df7b452013-08-02 13:07:16 -07002506 <#DIGIT : ["0" - "9"]>
vinayakb38b7ca42012-03-05 05:44:15 +00002507}
2508
Till Westmann96c1f172013-08-01 02:05:48 -07002509<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002510TOKEN:
2511{
Till Westmann5df7b452013-08-02 13:07:16 -07002512 < DOUBLE_LITERAL: <DIGITS>
Till Westmannaf0551c2013-07-23 14:53:31 -07002513 | <DIGITS> ( "." <DIGITS> )?
2514 | "." <DIGITS>
Till Westmann5df7b452013-08-02 13:07:16 -07002515 >
2516 | < FLOAT_LITERAL: <DIGITS> ( "f" | "F" )
Till Westmannaf0551c2013-07-23 14:53:31 -07002517 | <DIGITS> ( "." <DIGITS> ( "f" | "F" ) )?
2518 | "." <DIGITS> ( "f" | "F" )
Till Westmann5df7b452013-08-02 13:07:16 -07002519 >
2520 | <DIGITS : (<DIGIT>)+ >
vinayakb38b7ca42012-03-05 05:44:15 +00002521}
2522
Till Westmann96c1f172013-08-01 02:05:48 -07002523<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002524TOKEN :
2525{
Till Westmann5df7b452013-08-02 13:07:16 -07002526 <#LETTER : ["A" - "Z", "a" - "z"]>
2527 | <SPECIALCHARS : ["$", "_", "-"]>
vinayakb38b7ca42012-03-05 05:44:15 +00002528}
2529
Till Westmann96c1f172013-08-01 02:05:48 -07002530<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002531TOKEN :
2532{
Till Westmanne3e8ffa2014-08-02 17:51:23 -07002533 // backslash u + 4 hex digits escapes are handled in the underlying JavaCharStream
2534 <STRING_LITERAL : ("\"" (
2535 <EscapeQuot>
2536 | <EscapeBslash>
2537 | <EscapeSlash>
2538 | <EscapeBspace>
2539 | <EscapeFormf>
2540 | <EscapeNl>
2541 | <EscapeCr>
2542 | <EscapeTab>
2543 | ~["\"","\\"])* "\"")
2544 | ("\'"(
2545 <EscapeApos>
2546 | <EscapeBslash>
2547 | <EscapeSlash>
2548 | <EscapeBspace>
2549 | <EscapeFormf>
2550 | <EscapeNl>
2551 | <EscapeCr>
2552 | <EscapeTab>
2553 | ~["\'","\\"])* "\'")>
Till Westmann5df7b452013-08-02 13:07:16 -07002554 | < #EscapeQuot: "\\\"" >
2555 | < #EscapeApos: "\\\'" >
Till Westmanne0cc01c2014-03-31 10:26:10 -07002556 | < #EscapeBslash: "\\\\" >
Till Westmanne3e8ffa2014-08-02 17:51:23 -07002557 | < #EscapeSlash: "\\/" >
2558 | < #EscapeBspace: "\\b" >
2559 | < #EscapeFormf: "\\f" >
2560 | < #EscapeNl: "\\n" >
2561 | < #EscapeCr: "\\r" >
2562 | < #EscapeTab: "\\t" >
vinayakb38b7ca42012-03-05 05:44:15 +00002563}
2564
Till Westmann96c1f172013-08-01 02:05:48 -07002565<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002566TOKEN :
2567{
Till Westmann5df7b452013-08-02 13:07:16 -07002568 <IDENTIFIER : <LETTER> (<LETTER> | <DIGIT> | <SPECIALCHARS>)*>
vinayakb38b7ca42012-03-05 05:44:15 +00002569}
2570
Till Westmann96c1f172013-08-01 02:05:48 -07002571<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002572TOKEN :
2573{
Till Westmann5df7b452013-08-02 13:07:16 -07002574 <VARIABLE : "$" <LETTER> (<LETTER> | <DIGIT> | "_")*>
vinayakb38b7ca42012-03-05 05:44:15 +00002575}
2576
Till Westmann96c1f172013-08-01 02:05:48 -07002577<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002578SKIP:
2579{
2580 " "
Till Westmann5df7b452013-08-02 13:07:16 -07002581 | "\t"
2582 | "\r"
2583 | "\n"
vinayakb38b7ca42012-03-05 05:44:15 +00002584}
2585
Till Westmann96c1f172013-08-01 02:05:48 -07002586<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002587SKIP:
2588{
Till Westmann5df7b452013-08-02 13:07:16 -07002589 <"//" (~["\n"])* "\n">
vinayakb38b7ca42012-03-05 05:44:15 +00002590}
2591
Till Westmann96c1f172013-08-01 02:05:48 -07002592<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002593SKIP:
2594{
Taewoo Kima12d8cd2015-03-04 13:47:08 -08002595 <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")?>
vinayakb38b7ca42012-03-05 05:44:15 +00002596}
2597
Till Westmann96c1f172013-08-01 02:05:48 -07002598<DEFAULT,IN_DBL_BRACE>
vinayakb38b7ca42012-03-05 05:44:15 +00002599SKIP:
2600{
Till Westmann96c1f172013-08-01 02:05:48 -07002601 <"/*"> { pushState(); } : INSIDE_COMMENT
vinayakb38b7ca42012-03-05 05:44:15 +00002602}
2603
2604<INSIDE_COMMENT>
2605SPECIAL_TOKEN:
2606{
Till Westmann5df7b452013-08-02 13:07:16 -07002607 <"+"(" ")*(~["*"])*>
vinayakb38b7ca42012-03-05 05:44:15 +00002608}
2609
2610<INSIDE_COMMENT>
2611SKIP:
2612{
Till Westmann96c1f172013-08-01 02:05:48 -07002613 <"/*"> { pushState(); }
vinayakb38b7ca42012-03-05 05:44:15 +00002614}
2615
2616<INSIDE_COMMENT>
2617SKIP:
2618{
Till Westmannfd733ee2014-07-10 00:57:37 -07002619 <"*/"> { popState("*/"); }
Till Westmann5df7b452013-08-02 13:07:16 -07002620 | <~[]>
vinayakb38b7ca42012-03-05 05:44:15 +00002621}