blob: 8e3e20369797f61b0e671bfe5839d73237682a2c [file] [log] [blame]
vinayakb38b7ca42012-03-05 05:44:15 +00001options {
2
3
4 STATIC = false;
5
6}
7
8
9PARSER_BEGIN(AQLParser)
10
11package edu.uci.ics.asterix.aql.parser;
12
13import java.io.*;
14import java.util.List;
15import java.util.ArrayList;
16import java.util.Stack;
17
18import java.util.Map;
19import java.util.HashMap;
vinayakb5ee049d2013-04-06 21:21:29 +000020import java.util.LinkedHashMap;
vinayakb38b7ca42012-03-05 05:44:15 +000021import edu.uci.ics.asterix.aql.literal.FloatLiteral;
22import edu.uci.ics.asterix.aql.literal.DoubleLiteral;
23import edu.uci.ics.asterix.aql.literal.FalseLiteral;
vinayakb5ee049d2013-04-06 21:21:29 +000024import edu.uci.ics.asterix.aql.base.Literal;
vinayakb38b7ca42012-03-05 05:44:15 +000025import edu.uci.ics.asterix.aql.literal.IntegerLiteral;
vinayakb5ee049d2013-04-06 21:21:29 +000026import edu.uci.ics.asterix.aql.literal.LongIntegerLiteral;
vinayakb38b7ca42012-03-05 05:44:15 +000027import edu.uci.ics.asterix.aql.literal.NullLiteral;
28import edu.uci.ics.asterix.aql.literal.StringLiteral;
29import edu.uci.ics.asterix.aql.literal.TrueLiteral;
vinayakb5ee049d2013-04-06 21:21:29 +000030import edu.uci.ics.asterix.metadata.bootstrap.MetadataConstants;
vinayakb38b7ca42012-03-05 05:44:15 +000031
32import edu.uci.ics.asterix.aql.base.*;
33import edu.uci.ics.asterix.aql.expression.*;
34import edu.uci.ics.asterix.common.config.DatasetConfig.DatasetType;
35import edu.uci.ics.asterix.common.config.DatasetConfig.IndexType;
36import edu.uci.ics.asterix.aql.expression.visitor.AQLPrintVisitor;
37import edu.uci.ics.asterix.aql.expression.UnaryExpr.Sign;
38import edu.uci.ics.asterix.aql.base.Statement.Kind;
39import edu.uci.ics.asterix.aql.context.Scope;
40import edu.uci.ics.asterix.aql.context.RootScopeFactory;
41import edu.uci.ics.asterix.common.annotations.*;
42import edu.uci.ics.asterix.common.exceptions.AsterixException;
ramangrover29a13f2422012-03-15 23:01:27 +000043import edu.uci.ics.asterix.om.functions.AsterixFunction;
vinayakb5ee049d2013-04-06 21:21:29 +000044import edu.uci.ics.asterix.common.functions.FunctionSignature;
45import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IExpressionAnnotation;
46import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IndexedNLJoinExpressionAnnotation;
47import edu.uci.ics.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
48import edu.uci.ics.hyracks.algebricks.common.utils.Pair;
49import edu.uci.ics.hyracks.algebricks.common.utils.Triple;
50
51
vinayakb38b7ca42012-03-05 05:44:15 +000052
53
54public class AQLParser extends ScopeChecker {
55
vinayakb38b7ca42012-03-05 05:44:15 +000056 // optimizer hints
57 private static final String HASH_GROUP_BY_HINT = "hash";
58 private static final String BROADCAST_JOIN_HINT = "bcast";
vinayakb5ee049d2013-04-06 21:21:29 +000059 private static final String INDEXED_NESTED_LOOP_JOIN_HINT = "indexnl";
vinayakb38b7ca42012-03-05 05:44:15 +000060 private static final String INMEMORY_HINT = "inmem";
61 private static final String VAL_FILE_HINT = "val-files";
62 private static final String VAL_FILE_SAME_INDEX_HINT = "val-file-same-idx";
63 private static final String INTERVAL_HINT = "interval";
64 private static final String COMPOSE_VAL_FILES_HINT = "compose-val-files";
65 private static final String INSERT_RAND_INT_HINT = "insert-rand-int";
66 private static final String LIST_VAL_FILE_HINT = "list-val-file";
67 private static final String LIST_HINT = "list";
68 private static final String DATETIME_BETWEEN_YEARS_HINT = "datetime-between-years";
69 private static final String DATE_BETWEEN_YEARS_HINT = "date-between-years";
70 private static final String DATETIME_ADD_RAND_HOURS_HINT = "datetime-add-rand-hours";
71 private static final String AUTO_HINT = "auto";
72
73 private static final String GEN_FIELDS_HINT = "gen-fields";
74
75 // data generator hints
76 private static final String DGEN_HINT = "dgen";
77
78 private static String getHint(Token t) {
79 if (t.specialToken == null) {
80 return null;
81 }
82 String s = t.specialToken.image;
83 int n = s.length();
84 if (n < 2) {
85 return null;
86 }
87 return s.substring(1).trim();
88 }
89
vinayakb5ee049d2013-04-06 21:21:29 +000090 public AQLParser(String s){
91 this(new StringReader(s));
92 super.setInput(s);
93 }
94
vinayakb38b7ca42012-03-05 05:44:15 +000095 public static void main(String args[]) throws ParseException, TokenMgrError, IOException, FileNotFoundException, AsterixException {
96 File file = new File(args[0]);
97 Reader fis = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
98 AQLParser parser = new AQLParser(fis);
vinayakb5ee049d2013-04-06 21:21:29 +000099 List<Statement> st = parser.Statement();
100 //st.accept(new AQLPrintVisitor(), 0);
vinayakb38b7ca42012-03-05 05:44:15 +0000101 }
102
103
104}
105
106PARSER_END(AQLParser)
107
108
vinayakb5ee049d2013-04-06 21:21:29 +0000109List<Statement> Statement() throws ParseException:
vinayakb38b7ca42012-03-05 05:44:15 +0000110{
vinayakb38b7ca42012-03-05 05:44:15 +0000111 scopeStack.push(RootScopeFactory.createRootScope(this));
112 List<Statement> decls = new ArrayList<Statement>();
vinayakb5ee049d2013-04-06 21:21:29 +0000113 Query query=null;
vinayakb38b7ca42012-03-05 05:44:15 +0000114}
115{
116 (
117 (
118 (
119 "use"
120 {
121 decls.add(DataverseDeclaration());
122 }
123 | "declare" "function" {
124 decls.add(FunctionDeclaration());
125 }
126 | "create" (
127 {
128 String hint = getHint(token);
129 boolean dgen = false;
130 if (hint != null && hint.startsWith(DGEN_HINT)) {
131 dgen = true;
132 }
133 }
134 "type"
135 {
136 decls.add(TypeDeclaration(dgen, hint));
137 }
138 | "nodegroup"
139 {
140 decls.add(NodegroupDeclaration());
141 }
142 | "external" <DATASET>
143 {
144 decls.add(DatasetDeclaration(DatasetType.EXTERNAL));
145 }
146 | "feed" <DATASET>
147 {
148 decls.add(DatasetDeclaration(DatasetType.FEED));
149 }
150 | <DATASET>
151 {
152 decls.add(DatasetDeclaration(DatasetType.INTERNAL));
153 }
154 | "index"
155 {
156 decls.add(CreateIndexStatement());
157 }
158 | "dataverse"
159 {
160 decls.add(CreateDataverseStatement());
161 }
162 | "function"
163 {
164 decls.add(FunctionCreation());
165 }
166 )
167 | "load" {
168 decls.add(LoadStatement());
169 }
170
171 | "drop"
172 (
173 <DATASET>
174 {
175 decls.add(DropStatement());
176 }
177 | "index"
178 {
179 decls.add(IndexDropStatement());
180 }
181 | "nodegroup"
182 {
183 decls.add(NodeGroupDropStatement());
184 }
185 | "type"
186 {
187 decls.add(TypeDropStatement());
188 }
189 | "dataverse"
190 {
191 decls.add(DataverseDropStatement());
192 }
vinayakb5ee049d2013-04-06 21:21:29 +0000193 | "function"
194 {
195 decls.add(FunctionDropStatement());
196 }
vinayakb38b7ca42012-03-05 05:44:15 +0000197 )
198 | "write" {
199 decls.add(WriteStatement());
200 }
201 | "set" {
202 decls.add(SetStatement());
203 }
204 | "insert" {
205 decls.add(InsertStatement());
206 }
207 | "delete" {
208 decls.add(DeleteStatement());
209 }
210 | "update" {
211 decls.add(UpdateStatement());
212 }
vinayakb5ee049d2013-04-06 21:21:29 +0000213 | "begin" "feed"
214 {
215 Pair<Identifier,Identifier> nameComponents = getDotSeparatedPair();
216 decls.add(new BeginFeedStatement(nameComponents.first, nameComponents.second, getVarCounter()));
217 } ";"
218
219 | "suspend" "feed"
220 {
221 decls.add(ControlFeedDeclaration(ControlFeedStatement.OperationType.SUSPEND));
222 } ";"
223 | "resume" "feed" {
224 decls.add(ControlFeedDeclaration(ControlFeedStatement.OperationType.RESUME));
vinayakb38b7ca42012-03-05 05:44:15 +0000225 } ";"
vinayakb5ee049d2013-04-06 21:21:29 +0000226 | "end" "feed" {
227 decls.add(ControlFeedDeclaration(ControlFeedStatement.OperationType.END));
vinayakb38b7ca42012-03-05 05:44:15 +0000228 } ";"
vinayakb5ee049d2013-04-06 21:21:29 +0000229 | "alter" "feed" {
230 decls.add(AlterFeedDeclaration());
231 } ";"
232
233 | (query = Query()) {
234 decls.add(query);
235 }
236 )*
237 // (query = Query())?
vinayakb38b7ca42012-03-05 05:44:15 +0000238 )
239
240 <EOF>
241 )
242 {
vinayakb5ee049d2013-04-06 21:21:29 +0000243 return decls;
vinayakb38b7ca42012-03-05 05:44:15 +0000244 }
245}
246
247InsertStatement InsertStatement() throws ParseException:
248{
vinayakb5ee049d2013-04-06 21:21:29 +0000249 Identifier dataverseName;
vinayakb38b7ca42012-03-05 05:44:15 +0000250 Identifier datasetName;
vinayakb5ee049d2013-04-06 21:21:29 +0000251 Pair<Identifier,Identifier> nameComponents = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000252 Query query;
253}
254{
vinayakb5ee049d2013-04-06 21:21:29 +0000255 "into" <DATASET>
256
257 {
258 nameComponents = getDotSeparatedPair();
259 dataverseName = nameComponents.first;
260 datasetName = nameComponents.second;
261 }
262
263 query = Query() (";")?
264 {return new InsertStatement(dataverseName, datasetName, query, getVarCounter());}
vinayakb38b7ca42012-03-05 05:44:15 +0000265}
266
267DeleteStatement DeleteStatement() throws ParseException:
268{
269 VariableExpr var = null;
vinayakb5ee049d2013-04-06 21:21:29 +0000270 Identifier dataverseName;
vinayakb38b7ca42012-03-05 05:44:15 +0000271 Identifier datasetName = null;
272 Expression condition = null;
273 Clause dieClause = null;
vinayakb5ee049d2013-04-06 21:21:29 +0000274 Pair<Identifier, Identifier> nameComponents;
vinayakb38b7ca42012-03-05 05:44:15 +0000275}
276{
277 var = Variable() { getCurrentScope().addNewVarSymbolToScope(var.getVar()); }
vinayakb5ee049d2013-04-06 21:21:29 +0000278 "from"
279 <DATASET>
280 {
281 nameComponents = getDotSeparatedPair();
282 }
283 ("where" condition = Expression())? (dieClause = DieClause())? (";")?
284 {return new DeleteStatement(var, nameComponents.first, nameComponents.second, condition, dieClause, getVarCounter()); }
vinayakb38b7ca42012-03-05 05:44:15 +0000285}
286
287UpdateStatement UpdateStatement() throws ParseException:
288{
289 VariableExpr vars;
290 Expression target;
291 Expression condition;
292 UpdateClause uc;
293 List<UpdateClause> ucs = new ArrayList<UpdateClause>();
294}
295{
296 vars = Variable() "in" target = Expression()
297 "where" condition = Expression()
298 <LEFTPAREN> (uc=UpdateClause() {ucs.add(uc); } ("," uc=UpdateClause() {ucs.add(uc); } )*) <RIGHTPAREN> ";"
299 {return new UpdateStatement(vars, target, condition, ucs);}
300}
301
302
303
304UpdateClause UpdateClause() throws ParseException:
305{
306 Expression target = null;
307 Expression value = null ;
308 InsertStatement is = null;
309 DeleteStatement ds = null;
310 UpdateStatement us = null;
311 Expression condition = null;
312 UpdateClause ifbranch = null;
313 UpdateClause elsebranch = null;
314}
315{
316 "set" target = Expression() ":=" value = Expression()
317 | "insert" is = InsertStatement()
318 | "delete" ds = DeleteStatement()
319 | "update" us = UpdateStatement()
320 | "if" <LEFTPAREN> condition = Expression() <RIGHTPAREN> "then" ifbranch = UpdateClause() [LOOKAHEAD(1) "else" elsebranch = UpdateClause()]
321 {return new UpdateClause(target, value, is, ds, us, condition, ifbranch, elsebranch);}
322}
323
324
325Statement SetStatement() throws ParseException:
326{
327 String pn = null;
328 Statement stmt = null;
329}
330{
331 <IDENTIFIER> { pn = token.image; }
332 <STRING_LITERAL>
333 { String pv = removeQuotesAndEscapes(token.image); }
334 ";"
335 {
336 return new SetStatement(pn, pv);
337 }
338}
339
340Statement WriteStatement() throws ParseException:
341{
342 Identifier nodeName = null;
343 String fileName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000344 Statement stmt = null;
345 Query query;
346 String writerClass = null;
vinayakb5ee049d2013-04-06 21:21:29 +0000347 Pair<Identifier,Identifier> nameComponents = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000348}
349{
350 (( "output" "to"
351 <IDENTIFIER> { nodeName = new Identifier(token.image); }
352 ":" <STRING_LITERAL> { fileName = removeQuotesAndEscapes(token.image); }
353 ( "using" <STRING_LITERAL> { writerClass = removeQuotesAndEscapes(token.image); } )?
354 {
355 stmt = new WriteStatement(nodeName, fileName, writerClass);
356 } )
357 |
358 ( "into"
vinayakb5ee049d2013-04-06 21:21:29 +0000359 <DATASET>
360
361 {
362 nameComponents = getDotSeparatedPair();
363 }
364
vinayakb38b7ca42012-03-05 05:44:15 +0000365 <LEFTPAREN> query = Query() <RIGHTPAREN>
366 {
vinayakb5ee049d2013-04-06 21:21:29 +0000367 stmt = new WriteFromQueryResultStatement(nameComponents.first, nameComponents.second, query, getVarCounter());
vinayakb38b7ca42012-03-05 05:44:15 +0000368 } ))
369
370 ";"
371 {
372 return stmt;
373 }
374}
375
376CreateIndexStatement CreateIndexStatement() throws ParseException:
377{
378 CreateIndexStatement cis = new CreateIndexStatement();
vinayakb5ee049d2013-04-06 21:21:29 +0000379 Pair<Identifier,Identifier> nameComponents = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000380}
381{
382 <IDENTIFIER> { cis.setIndexName(new Identifier(token.image)); }
383 (
384 "if not exists"
385 {
386 cis.setIfNotExists(true);
387 }
388 )?
389 "on"
vinayakb5ee049d2013-04-06 21:21:29 +0000390
391 {
392 nameComponents = getDotSeparatedPair();
393 cis.setDataverseName(nameComponents.first);
394 cis.setDatasetName(nameComponents.second);
395 }
396
vinayakb38b7ca42012-03-05 05:44:15 +0000397 <LEFTPAREN>
398 ( <IDENTIFIER> { cis.addFieldExpr(token.image); } )
399 ("," <IDENTIFIER> { cis.addFieldExpr(token.image); })*
400 <RIGHTPAREN>
401 ("type"
vinayakb5ee049d2013-04-06 21:21:29 +0000402 ("btree" { cis.setIndexType(IndexType.BTREE); }
403 | "rtree" { cis.setIndexType(IndexType.RTREE); }
404 | "keyword" { cis.setIndexType(IndexType.WORD_INVIX); }
405 | "fuzzy keyword" { cis.setIndexType(IndexType.FUZZY_WORD_INVIX); }
406 | "ngram"
407 <LEFTPAREN>
408 (<INTEGER_LITERAL>
409 {
410 cis.setIndexType(IndexType.NGRAM_INVIX);
411 cis.setGramLength(Integer.valueOf(token.image));
412 }
413 )
414 <RIGHTPAREN>
415 | "fuzzy ngram"
416 <LEFTPAREN>
417 (<INTEGER_LITERAL>
418 {
419 cis.setIndexType(IndexType.FUZZY_NGRAM_INVIX);
420 cis.setGramLength(Integer.valueOf(token.image));
421 }
422 )
423 <RIGHTPAREN>
424 )
vinayakb38b7ca42012-03-05 05:44:15 +0000425 ";"
426 | ";"
427 )
428 {
429 return cis;
430 }
431}
432
433DataverseDecl DataverseDeclaration() throws ParseException:
434{
435 Identifier dvName = null;
436}
437{
vinayakb5ee049d2013-04-06 21:21:29 +0000438 "dataverse" <IDENTIFIER> { defaultDataverse = token.image;}
vinayakb38b7ca42012-03-05 05:44:15 +0000439 ";"
440 {
vinayakb5ee049d2013-04-06 21:21:29 +0000441 return new DataverseDecl(new Identifier(defaultDataverse));
vinayakb38b7ca42012-03-05 05:44:15 +0000442 }
443}
444
445DropStatement DropStatement() throws ParseException :
446{
vinayakb5ee049d2013-04-06 21:21:29 +0000447 Identifier dataverseName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000448 Identifier datasetName = null;
449 boolean ifExists = false;
vinayakb5ee049d2013-04-06 21:21:29 +0000450 Pair<Identifier,Identifier> nameComponents=null;
vinayakb38b7ca42012-03-05 05:44:15 +0000451}
452{
vinayakb5ee049d2013-04-06 21:21:29 +0000453 {
454 nameComponents = getDotSeparatedPair();
455 dataverseName = nameComponents.first;
456 datasetName = nameComponents.second;
457 }
458
459
vinayakb38b7ca42012-03-05 05:44:15 +0000460 (
461 "if exists"
462 {
463 ifExists = true;
464 }
465 )? ";"
466 {
vinayakb5ee049d2013-04-06 21:21:29 +0000467 return new DropStatement(dataverseName, datasetName, ifExists);
vinayakb38b7ca42012-03-05 05:44:15 +0000468 }
469}
470
471IndexDropStatement IndexDropStatement() throws ParseException :
472{
vinayakb5ee049d2013-04-06 21:21:29 +0000473 Identifier dataverseName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000474 Identifier datasetName = null;
475 Identifier indexName = null;
476 boolean ifExists = false;
vinayakb5ee049d2013-04-06 21:21:29 +0000477 Triple<Identifier,Identifier,Identifier> nameComponents=null;
vinayakb38b7ca42012-03-05 05:44:15 +0000478}
479{
vinayakb5ee049d2013-04-06 21:21:29 +0000480
vinayakb38b7ca42012-03-05 05:44:15 +0000481 {
vinayakb5ee049d2013-04-06 21:21:29 +0000482 nameComponents = getDotSeparatedTriple();
483 dataverseName = nameComponents.first;
484 datasetName = nameComponents.second;
485 indexName = nameComponents.third;
486 }
487
vinayakb38b7ca42012-03-05 05:44:15 +0000488 (
489 "if exists"
490 {
491 ifExists = true;
492 }
493 )? ";"
494 {
vinayakb5ee049d2013-04-06 21:21:29 +0000495 return new IndexDropStatement(dataverseName, datasetName, indexName, ifExists);
vinayakb38b7ca42012-03-05 05:44:15 +0000496 }
497}
498
499NodeGroupDropStatement NodeGroupDropStatement() throws ParseException :
500{
501 Identifier groupName = null;
502 boolean ifExists = false;
503}
504{
505 < IDENTIFIER >
506 {
507 groupName = new Identifier(token.image);
508 }
509 (
510 "if exists"
511 {
512 ifExists = true;
513 }
514 )? ";"
515 {
516 return new NodeGroupDropStatement(groupName, ifExists);
517 }
518}
519
520TypeDropStatement TypeDropStatement() throws ParseException :
521{
vinayakb5ee049d2013-04-06 21:21:29 +0000522 Identifier dataverseName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000523 Identifier typeName = null;
524 boolean ifExists = false;
vinayakb5ee049d2013-04-06 21:21:29 +0000525 Pair<Identifier,Identifier> nameComponents;
vinayakb38b7ca42012-03-05 05:44:15 +0000526}
527{
vinayakb38b7ca42012-03-05 05:44:15 +0000528 {
vinayakb5ee049d2013-04-06 21:21:29 +0000529 nameComponents = getDotSeparatedPair();
530 dataverseName = nameComponents.first == null ? new Identifier(defaultDataverse) : nameComponents.first;
531 typeName = nameComponents.second;
vinayakb38b7ca42012-03-05 05:44:15 +0000532 }
533 (
534 "if exists"
535 {
536 ifExists = true;
537 }
538 )? ";"
539 {
vinayakb5ee049d2013-04-06 21:21:29 +0000540 return new TypeDropStatement(dataverseName, typeName, ifExists);
vinayakb38b7ca42012-03-05 05:44:15 +0000541 }
542}
543
544DataverseDropStatement DataverseDropStatement() throws ParseException :
545{
546 Identifier dataverseName = null;
547 boolean ifExists = false;
548}
549{
550 < IDENTIFIER >
551 {
552 dataverseName = new Identifier(token.image);
553 }
554 (
555 "if exists"
556 {
557 ifExists = true;
558 }
559 )? ";"
560 {
561 return new DataverseDropStatement(dataverseName, ifExists);
562 }
563}
564
565CreateDataverseStatement CreateDataverseStatement() throws ParseException :
566{
567 Identifier dvName = null;
568 boolean ifNotExists = false;
569 String format = null;
570}
571{
572 < IDENTIFIER >
573 {
574 dvName = new Identifier(token.image);
575 }
576 (
577 "if not exists"
578 {
579 ifNotExists = true;
580 }
581 )?
582 (
583 "with format" < STRING_LITERAL >
584 {
585 format = removeQuotesAndEscapes(token.image);
586 }
587 )?
588 ";"
589 {
590 return new CreateDataverseStatement(dvName, format, ifNotExists);
591 }
592}
593
vinayakb5ee049d2013-04-06 21:21:29 +0000594
595FunctionDropStatement FunctionDropStatement() throws ParseException :
vinayakb38b7ca42012-03-05 05:44:15 +0000596{
vinayakb5ee049d2013-04-06 21:21:29 +0000597 String dataverse;
598 String functionName;
599 int arity=0;
600 boolean ifExists = false;
601 Pair<Identifier, Identifier> nameComponents=null;
vinayakb38b7ca42012-03-05 05:44:15 +0000602}
603{
vinayakb5ee049d2013-04-06 21:21:29 +0000604 {
605 nameComponents = getDotSeparatedPair();
606 dataverse = nameComponents.first != null ? nameComponents.first.getValue() : defaultDataverse;
607 functionName = nameComponents.second.getValue();
608 }
609
610 "@"
611 <INTEGER_LITERAL>
612 {
613 Token t= getToken(0);
614 arity = new Integer(t.image);
615 if( arity < 0 && arity != FunctionIdentifier.VARARGS){
616 throw new ParseException(" invalid arity:" + arity);
617 }
618 }
619
620 (
621 "if exists"
vinayakb38b7ca42012-03-05 05:44:15 +0000622 {
vinayakb5ee049d2013-04-06 21:21:29 +0000623 ifExists = true;
vinayakb38b7ca42012-03-05 05:44:15 +0000624 }
vinayakb5ee049d2013-04-06 21:21:29 +0000625 )? ";"
626 {
627 return new FunctionDropStatement(new FunctionSignature(dataverse, functionName, arity), ifExists);
628 }
629}
vinayakb38b7ca42012-03-05 05:44:15 +0000630
vinayakb5ee049d2013-04-06 21:21:29 +0000631
632LoadFromFileStatement LoadStatement() throws ParseException:
633{
634 Identifier dataverseName = null;
635 Identifier datasetName = null;
636 boolean alreadySorted = false;
637 String adapterName;
638 Map<String,String> properties;
639 Pair<Identifier,Identifier> nameComponents = null;
640}
641{
642 <DATASET>
643 {
644 nameComponents = getDotSeparatedPair();
645 dataverseName = nameComponents.first;
646 datasetName = nameComponents.second;
647 }
648
649 "using"
650
651 {
652 adapterName = getAdapterName();
653 }
654
vinayakb38b7ca42012-03-05 05:44:15 +0000655 {
656 properties = getConfiguration();
657 }
658
659 ("pre-sorted"
660 { alreadySorted = true; }
661 )?
662
663 ";"
664 {
vinayakb5ee049d2013-04-06 21:21:29 +0000665 return new LoadFromFileStatement(dataverseName, datasetName, adapterName, properties, alreadySorted);
vinayakb38b7ca42012-03-05 05:44:15 +0000666 }
667}
668
669
vinayakb5ee049d2013-04-06 21:21:29 +0000670String getAdapterName() throws ParseException :
671{
672 String adapterName = null;
673}
674{
675 (
676 <IDENTIFIER> {
677 adapterName = (new Identifier(token.image)).getValue();;
678 }
679 |
680 <STRING_LITERAL>
681 {
682 adapterName = removeQuotesAndEscapes(token.image);
683 }
684 )
685 {
686 return adapterName;
687 }
688}
689
vinayakb38b7ca42012-03-05 05:44:15 +0000690
691DatasetDecl DatasetDeclaration(DatasetType datasetType) throws ParseException :
692{
693 DatasetDecl dd = null;
694 Identifier datasetName = null;
vinayakb5ee049d2013-04-06 21:21:29 +0000695 Identifier dataverseName = null;
696 Identifier itemDataverseName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000697 Identifier itemTypeName = null;
vinayakb5ee049d2013-04-06 21:21:29 +0000698 String nameComponentFirst = null;
699 String nameComponentSecond = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000700 boolean ifNotExists = false;
vinayakb5ee049d2013-04-06 21:21:29 +0000701 IDatasetDetailsDecl datasetDetails = null;
702 Pair<Identifier,Identifier> nameComponents = null;
703 Map<String,String> hints = new HashMap<String,String>();
vinayakb38b7ca42012-03-05 05:44:15 +0000704}
705{
vinayakb38b7ca42012-03-05 05:44:15 +0000706 {
vinayakb5ee049d2013-04-06 21:21:29 +0000707 nameComponents = getDotSeparatedPair();
708 dataverseName = nameComponents.first;
709 datasetName = nameComponents.second;
710 }
711
vinayakb38b7ca42012-03-05 05:44:15 +0000712 (
713 "if not exists"
714 {
715 ifNotExists = true;
716 }
717 )?
718 (
vinayakb5ee049d2013-04-06 21:21:29 +0000719 < LEFTPAREN > <IDENTIFIER>
vinayakb38b7ca42012-03-05 05:44:15 +0000720 {
721 itemTypeName = new Identifier(token.image);
722 }
723 < RIGHTPAREN >
vinayakb5ee049d2013-04-06 21:21:29 +0000724 )
vinayakb38b7ca42012-03-05 05:44:15 +0000725 {
726 if(datasetType == DatasetType.INTERNAL) {
vinayakb5ee049d2013-04-06 21:21:29 +0000727 datasetDetails = InternalDatasetDeclaration();
vinayakb38b7ca42012-03-05 05:44:15 +0000728 }
729 else if(datasetType == DatasetType.EXTERNAL) {
vinayakb5ee049d2013-04-06 21:21:29 +0000730 datasetDetails = ExternalDatasetDeclaration();
vinayakb38b7ca42012-03-05 05:44:15 +0000731 }
732 else if(datasetType == DatasetType.FEED) {
vinayakb5ee049d2013-04-06 21:21:29 +0000733 datasetDetails = FeedDatasetDeclaration();
vinayakb38b7ca42012-03-05 05:44:15 +0000734 }
vinayakb38b7ca42012-03-05 05:44:15 +0000735 }
vinayakb5ee049d2013-04-06 21:21:29 +0000736
737 (
738 "hints"
vinayakb38b7ca42012-03-05 05:44:15 +0000739 {
vinayakb5ee049d2013-04-06 21:21:29 +0000740 initProperties(hints);
741 }
742 )?
743 ";"
744
745 {
746 dd = new DatasetDecl(dataverseName, datasetName, itemTypeName, hints, datasetType, datasetDetails,ifNotExists);
747 return dd;
vinayakb38b7ca42012-03-05 05:44:15 +0000748 }
749}
750
751InternalDetailsDecl InternalDatasetDeclaration() throws ParseException :
752{
753 InternalDetailsDecl idd = null;
vinayakb5ee049d2013-04-06 21:21:29 +0000754 List<String> primaryKeyFields = new ArrayList<String>();
755 Identifier nodeGroupName=null;
vinayakb38b7ca42012-03-05 05:44:15 +0000756}
757{
vinayakb38b7ca42012-03-05 05:44:15 +0000758 (
vinayakb38b7ca42012-03-05 05:44:15 +0000759 {
vinayakb5ee049d2013-04-06 21:21:29 +0000760 primaryKeyFields = getPrimaryKeyFields();
vinayakb38b7ca42012-03-05 05:44:15 +0000761 }
vinayakb5ee049d2013-04-06 21:21:29 +0000762 )
763
vinayakb38b7ca42012-03-05 05:44:15 +0000764 (
765 "on" < IDENTIFIER >
766 {
vinayakb5ee049d2013-04-06 21:21:29 +0000767 nodeGroupName = new Identifier(token.image);
vinayakb38b7ca42012-03-05 05:44:15 +0000768 }
769 )?
vinayakb5ee049d2013-04-06 21:21:29 +0000770
vinayakb38b7ca42012-03-05 05:44:15 +0000771 {
vinayakb5ee049d2013-04-06 21:21:29 +0000772 idd = new InternalDetailsDecl(nodeGroupName, primaryKeyFields);
vinayakb38b7ca42012-03-05 05:44:15 +0000773 return idd;
774 }
775}
776
777ExternalDetailsDecl ExternalDatasetDeclaration() throws ParseException :
778{
779 ExternalDetailsDecl edd = null;
vinayakb5ee049d2013-04-06 21:21:29 +0000780 String adapterName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000781 Map < String, String > properties;
782}
783{
784 {
785 edd = new ExternalDetailsDecl();
786 }
787
788 "using"
vinayakb38b7ca42012-03-05 05:44:15 +0000789 {
vinayakb5ee049d2013-04-06 21:21:29 +0000790 adapterName = getAdapterName();
vinayakb38b7ca42012-03-05 05:44:15 +0000791 }
792
793 {
794 properties = getConfiguration();
795 }
796
797 {
798 edd = new ExternalDetailsDecl();
vinayakb5ee049d2013-04-06 21:21:29 +0000799 edd.setAdapter(adapterName);
vinayakb38b7ca42012-03-05 05:44:15 +0000800 edd.setProperties(properties);
801 }
vinayakb38b7ca42012-03-05 05:44:15 +0000802
803 {
804 return edd;
805 }
806}
807
808FeedDetailsDecl FeedDatasetDeclaration() throws ParseException :
809{
810 FeedDetailsDecl fdd = null;
vinayakb5ee049d2013-04-06 21:21:29 +0000811 String adapterName = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000812 Map < String, String > properties;
vinayakb5ee049d2013-04-06 21:21:29 +0000813 Pair<Identifier,Identifier> nameComponents;
814 List<String> primaryKeyFields = new ArrayList<String>();
815 Identifier nodeGroupName=null;
816 FunctionSignature appliedFunction=null;
817 String dataverse;
818 String functionName;
819 int arity;
vinayakb38b7ca42012-03-05 05:44:15 +0000820}
821{
vinayakb38b7ca42012-03-05 05:44:15 +0000822 "using"
vinayakb38b7ca42012-03-05 05:44:15 +0000823 {
vinayakb5ee049d2013-04-06 21:21:29 +0000824 adapterName = getAdapterName();
vinayakb38b7ca42012-03-05 05:44:15 +0000825 }
826
827 {
828 properties = getConfiguration();
829 }
830
831 ("apply" "function"
vinayakb38b7ca42012-03-05 05:44:15 +0000832 {
vinayakb5ee049d2013-04-06 21:21:29 +0000833 nameComponents = getDotSeparatedPair();
834 dataverse = nameComponents.first != null ? nameComponents.first.getValue() : defaultDataverse;
835 functionName = nameComponents.second.getValue();
vinayakb38b7ca42012-03-05 05:44:15 +0000836 }
vinayakb5ee049d2013-04-06 21:21:29 +0000837 ("@" <INTEGER_LITERAL>
838 {
839 arity = Integer.parseInt(token.image);
840 }
841 )
842
843 {
844 appliedFunction = new FunctionSignature(dataverse, functionName, arity);
845 }
vinayakb38b7ca42012-03-05 05:44:15 +0000846 )?
847
vinayakb38b7ca42012-03-05 05:44:15 +0000848 (
vinayakb38b7ca42012-03-05 05:44:15 +0000849 {
vinayakb5ee049d2013-04-06 21:21:29 +0000850 primaryKeyFields = getPrimaryKeyFields();
vinayakb38b7ca42012-03-05 05:44:15 +0000851 }
vinayakb5ee049d2013-04-06 21:21:29 +0000852 )
853
vinayakb38b7ca42012-03-05 05:44:15 +0000854 (
855 "on" < IDENTIFIER >
856 {
vinayakb5ee049d2013-04-06 21:21:29 +0000857 nodeGroupName = new Identifier(token.image);
vinayakb38b7ca42012-03-05 05:44:15 +0000858 }
859 )?
vinayakb5ee049d2013-04-06 21:21:29 +0000860
vinayakb38b7ca42012-03-05 05:44:15 +0000861 {
vinayakb5ee049d2013-04-06 21:21:29 +0000862 fdd = new FeedDetailsDecl(adapterName, properties, appliedFunction, nodeGroupName, primaryKeyFields);
vinayakb38b7ca42012-03-05 05:44:15 +0000863 return fdd;
864 }
865}
866
vinayakb5ee049d2013-04-06 21:21:29 +0000867List<String> getPrimaryKeyFields() throws ParseException :
vinayakb38b7ca42012-03-05 05:44:15 +0000868{
vinayakb5ee049d2013-04-06 21:21:29 +0000869 List<String> primaryKeyFields = new ArrayList<String>();
870}
871{
872
873 "primary" "key"
874 < IDENTIFIER >
875 {
876 primaryKeyFields.add(token.image);
877 }
878 (
879 "," < IDENTIFIER >
880 {
881 primaryKeyFields.add(token.image);
882 }
883 )*
884 {
885 return primaryKeyFields;
886 }
887
888}
889
890
891
892
893
894ControlFeedStatement ControlFeedDeclaration(ControlFeedStatement.OperationType operationType) throws ParseException :
895{
896 Pair<Identifier,Identifier> nameComponents = null;
897}
898{
899 {
900 nameComponents = getDotSeparatedPair();
901 return new ControlFeedStatement(operationType, nameComponents.first, nameComponents.second);
902 }
903}
904
905
906ControlFeedStatement AlterFeedDeclaration() throws ParseException :
907{
908 Pair<Identifier,Identifier> nameComponents = null;
vinayakb38b7ca42012-03-05 05:44:15 +0000909 Map < String, String > configuration = new HashMap < String, String > ();
910}
911{
vinayakb5ee049d2013-04-06 21:21:29 +0000912 {
913 nameComponents = getDotSeparatedPair();
914 }
915
vinayakb38b7ca42012-03-05 05:44:15 +0000916 "set"
917 {
918 configuration = getConfiguration();
919 }
vinayakb5ee049d2013-04-06 21:21:29 +0000920
vinayakb38b7ca42012-03-05 05:44:15 +0000921 {
vinayakb5ee049d2013-04-06 21:21:29 +0000922 return new ControlFeedStatement(ControlFeedStatement.OperationType.ALTER, nameComponents.first, nameComponents.second, configuration);
vinayakb38b7ca42012-03-05 05:44:15 +0000923 }
924}
925
926Map<String,String> getConfiguration() throws ParseException :
927{
vinayakb5ee049d2013-04-06 21:21:29 +0000928 Map<String,String> configuration = new LinkedHashMap<String,String>();
vinayakb38b7ca42012-03-05 05:44:15 +0000929 String key;
930 String value;
931}
932{
933
934<LEFTPAREN>
935 (
936 (
937 <LEFTPAREN>
938 (
939 <STRING_LITERAL>
940 {
941 key = removeQuotesAndEscapes(token.image);
942 }
943 "=" <STRING_LITERAL>
944 {
945 value = removeQuotesAndEscapes(token.image);
946 }
947 )
948 <RIGHTPAREN>
949 {
950 configuration.put(key, value);
951 }
952 )
953 (
954 "," <LEFTPAREN>
955 (
956 <STRING_LITERAL>
957 {
958 key = removeQuotesAndEscapes(token.image);
959 }
960 "=" <STRING_LITERAL>
961 {
962 value = removeQuotesAndEscapes(token.image);
963 }
964 )
965 <RIGHTPAREN>
966 {
967 configuration.put(key, value);
968 }
969 )*
970 )?
971 <RIGHTPAREN>
972 {
973 return configuration;
974 }
975}
976
vinayakb5ee049d2013-04-06 21:21:29 +0000977void initProperties(Map<String,String> properties) throws ParseException :
978{
979 String key;
980 String value;
981}
982{
983 (
984 <LEFTPAREN>
985 (
986 <IDENTIFIER>
987 {
988 key = (new Identifier(token.image)).getValue();
989 }
990 "="
991 (
992 (<STRING_LITERAL>
993 {
994 value = removeQuotesAndEscapes(token.image);
995 }
996 ) |
997 (<INTEGER_LITERAL>
998 {
999 try{
1000 value = "" + Long.valueOf(token.image);
1001 } catch (NumberFormatException nfe){
1002 throw new ParseException("inapproriate value: " + token.image);
1003 }
1004 }
1005 )
1006 )
1007 {
1008 properties.put(key.toUpperCase(), value);
1009 }
1010 (
1011 ","
1012 (
1013 <IDENTIFIER>
1014 {
1015 key = (new Identifier(token.image)).getValue();
1016 }
1017 "="
1018 (
1019 (<STRING_LITERAL>
1020 {
1021 value = removeQuotesAndEscapes(token.image);
1022 }
1023 ) |
1024 (<INTEGER_LITERAL>
1025 {
1026 try{
1027 value = "" + Long.valueOf(token.image);
1028 } catch (NumberFormatException nfe){
1029 throw new ParseException("inapproriate value: " + token.image);
1030 }
1031 }
1032 )
1033 )
1034 )
1035 {
1036 properties.put(key.toUpperCase(), value);
1037 }
1038
1039 )*
1040 )
1041 <RIGHTPAREN>
1042 )?
1043}
1044
1045
vinayakb38b7ca42012-03-05 05:44:15 +00001046
1047NodegroupDecl NodegroupDeclaration() throws ParseException :
1048{
1049 Identifier name = null;
1050 List < Identifier > ncNames = new ArrayList < Identifier > ();
1051 boolean ifNotExists = false;
1052}
1053{
1054 < IDENTIFIER >
1055 {
1056 name = new Identifier(token.image);
1057 }
1058 (
1059 "if not exists"
1060 {
1061 ifNotExists = true;
1062 }
1063 )?
1064 "on" < IDENTIFIER >
1065 {
1066 ncNames.add(new Identifier(token.image));
1067 }
1068 (
1069 "," < IDENTIFIER >
1070 {
1071 ncNames.add(new Identifier(token.image));
1072 }
1073 )*
1074 ";"
1075 {
1076 return new NodegroupDecl(name, ncNames, ifNotExists);
1077 }
1078}
1079
1080
1081TypeDecl TypeDeclaration(boolean dgen, String hint) throws ParseException:
1082{
vinayakb5ee049d2013-04-06 21:21:29 +00001083 Identifier dataverse;
vinayakb38b7ca42012-03-05 05:44:15 +00001084 Identifier ident;
1085 TypeExpression typeExpr;
1086 boolean ifNotExists = false;
vinayakb5ee049d2013-04-06 21:21:29 +00001087 Pair<Identifier,Identifier> nameComponents=null;
vinayakb38b7ca42012-03-05 05:44:15 +00001088}
1089{
vinayakb38b7ca42012-03-05 05:44:15 +00001090 {
vinayakb5ee049d2013-04-06 21:21:29 +00001091 nameComponents = getDotSeparatedPair();
1092 dataverse = nameComponents.first;
1093 ident = nameComponents.second;
vinayakb38b7ca42012-03-05 05:44:15 +00001094 }
vinayakb5ee049d2013-04-06 21:21:29 +00001095
vinayakb38b7ca42012-03-05 05:44:15 +00001096 (
1097 "if not exists"
1098 {
1099 ifNotExists = true;
1100 }
1101 )?
1102 "as"
1103 ( typeExpr = TypeExpr() )
vinayakb5ee049d2013-04-06 21:21:29 +00001104 (";")?
vinayakb38b7ca42012-03-05 05:44:15 +00001105 {
1106 long numValues = -1;
1107 String filename = null;
1108 if (dgen) {
1109 String splits[] = hint.split(" +");
1110 if (splits.length != 3) {
1111 throw new ParseException("Expecting /*+ dgen <filename> <numberOfItems> */");
1112 }
1113 filename = splits[1];
1114 numValues = Long.parseLong(splits[2]);
1115 }
1116 TypeDataGen tddg = new TypeDataGen(dgen, filename, numValues);
vinayakb5ee049d2013-04-06 21:21:29 +00001117 return new TypeDecl(dataverse, ident, typeExpr, tddg, ifNotExists);
vinayakb38b7ca42012-03-05 05:44:15 +00001118 }
1119}
1120
1121TypeExpression TypeExpr() throws ParseException:
1122{
1123 TypeExpression typeExpr = null;
1124}
1125{
1126 (
1127 typeExpr = RecordTypeDef()
1128 | typeExpr = TypeReference()
1129 | typeExpr = OrderedListTypeDef()
1130 | typeExpr = UnorderedListTypeDef()
1131 )
1132 {
1133 return typeExpr;
1134 }
1135}
1136
1137RecordTypeDefinition RecordTypeDef() throws ParseException:
1138{
1139 RecordTypeDefinition recType = new RecordTypeDefinition();
1140 RecordTypeDefinition.RecordKind recordKind = null;
1141}
1142{
1143 ( "closed" { recordKind = RecordTypeDefinition.RecordKind.CLOSED; }
1144 | "open" { recordKind = RecordTypeDefinition.RecordKind.OPEN; } )?
1145 "{"
1146 {
1147 String hint = getHint(token);
1148 if (hint != null) {
1149 String splits[] = hint.split(" +");
1150 if (splits[0].equals(GEN_FIELDS_HINT)) {
1151 if (splits.length != 5) {
1152 throw new ParseException("Expecting: /*+ gen-fields <type> <min> <max> <prefix>*/");
1153 }
1154 if (!splits[1].equals("int")) {
1155 throw new ParseException("The only supported type for gen-fields is int.");
1156 }
1157 UndeclaredFieldsDataGen ufdg = new UndeclaredFieldsDataGen(UndeclaredFieldsDataGen.Type.INT,
1158 Integer.parseInt(splits[2]), Integer.parseInt(splits[3]), splits[4]);
1159 recType.setUndeclaredFieldsDataGen(ufdg);
1160 }
1161 }
1162
1163 }
1164 (
1165 RecordField(recType)
1166 ( "," RecordField(recType) )*
1167 )?
1168 "}"
1169 {
1170 if (recordKind == null) {
1171 recordKind = RecordTypeDefinition.RecordKind.OPEN;
1172 }
1173 recType.setRecordKind(recordKind);
1174 return recType;
1175 }
1176}
1177
1178void RecordField(RecordTypeDefinition recType) throws ParseException:
1179{
1180 String fieldName;
1181 TypeExpression type = null;
1182 boolean nullable = false;
1183}
1184{
1185 <IDENTIFIER>
1186 {
1187 Token t = getToken(0);
1188 fieldName = t.toString();
1189 String hint = getHint(t);
1190 IRecordFieldDataGen rfdg = null;
1191 if (hint != null) {
1192 String splits[] = hint.split(" +");
1193 if (splits[0].equals(VAL_FILE_HINT)) {
1194 File[] valFiles = new File[splits.length - 1];
1195 for (int k=1; k<splits.length; k++) {
1196 valFiles[k-1] = new File(splits[k]);
1197 }
1198 rfdg = new FieldValFileDataGen(valFiles);
1199 } else if (splits[0].equals(VAL_FILE_SAME_INDEX_HINT)) {
1200 rfdg = new FieldValFileSameIndexDataGen(new File(splits[1]), splits[2]);
1201 } else if (splits[0].equals(LIST_VAL_FILE_HINT)) {
1202 rfdg = new ListValFileDataGen(new File(splits[1]), Integer.parseInt(splits[2]), Integer.parseInt(splits[3]));
1203 } else if (splits[0].equals(LIST_HINT)) {
1204 rfdg = new ListDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]));
1205 } else if (splits[0].equals(INTERVAL_HINT)) {
1206 FieldIntervalDataGen.ValueType vt;
1207 if (splits[1].equals("int")) {
1208 vt = FieldIntervalDataGen.ValueType.INT;
1209 } else if (splits[1].equals("long")) {
1210 vt = FieldIntervalDataGen.ValueType.LONG;
1211 } else if (splits[1].equals("float")) {
1212 vt = FieldIntervalDataGen.ValueType.FLOAT;
1213 } else if (splits[1].equals("double")) {
1214 vt = FieldIntervalDataGen.ValueType.DOUBLE;
1215 } else {
1216 throw new ParseException("Unknown type for interval data gen: " + splits[1]);
1217 }
1218 rfdg = new FieldIntervalDataGen(vt, splits[2], splits[3]);
1219 } else if (splits[0].equals(INSERT_RAND_INT_HINT)) {
1220 rfdg = new InsertRandIntDataGen(splits[1], splits[2]);
1221 } else if (splits[0].equals(DATE_BETWEEN_YEARS_HINT)) {
1222 rfdg = new DateBetweenYearsDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]));
1223 } else if (splits[0].equals(DATETIME_BETWEEN_YEARS_HINT)) {
1224 rfdg = new DatetimeBetweenYearsDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]));
1225 } else if (splits[0].equals(DATETIME_ADD_RAND_HOURS_HINT)) {
1226 rfdg = new DatetimeAddRandHoursDataGen(Integer.parseInt(splits[1]), Integer.parseInt(splits[2]), splits[3]);
1227 } else if (splits[0].equals(AUTO_HINT)) {
1228 rfdg = new AutoDataGen(splits[1]);
1229 }
1230 }
1231 }
1232 ":"
1233 ( type = TypeExpr() )
1234 ("?" { nullable = true; } )?
1235 {
1236 recType.addField(fieldName, type, nullable, rfdg);
1237 }
1238}
1239
1240TypeReferenceExpression TypeReference() throws ParseException:
1241{}
1242{
vinayakb5ee049d2013-04-06 21:21:29 +00001243 <IDENTIFIER>
1244 {
1245 Token t = getToken(0);
1246 Identifier id = new Identifier(t.toString());
1247 return new TypeReferenceExpression(id);
1248 }
vinayakb38b7ca42012-03-05 05:44:15 +00001249}
1250
1251OrderedListTypeDefinition OrderedListTypeDef() throws ParseException:
1252{
1253 TypeExpression type = null;
1254}
1255{
1256 "["
1257 ( type = TypeExpr() )
1258 "]"
1259 {
1260 return new OrderedListTypeDefinition(type);
1261 }
1262}
1263
1264
1265UnorderedListTypeDefinition UnorderedListTypeDef() throws ParseException:
1266{
1267 TypeExpression type = null;
1268}
1269{
1270 "{{"
1271 ( type = TypeExpr() )
1272 "}}"
1273 {
1274 return new UnorderedListTypeDefinition(type);
1275 }
1276}
1277
vinayakb5ee049d2013-04-06 21:21:29 +00001278Pair<Identifier,Identifier> getDotSeparatedPair() throws ParseException:
1279{
1280 Identifier first = null;
1281 Identifier second = null;
1282}
1283{
1284 < IDENTIFIER >
1285 {
1286 first = new Identifier(token.image);
1287 }
1288 ("." <IDENTIFIER>
1289 {
1290 second = new Identifier(token.image);
1291 }
1292 )?
1293
1294 {
1295 if(second == null){
1296 second = first;
1297 first = null;
1298 }
1299
1300 return new Pair<Identifier,Identifier>(first,second);
1301 }
1302}
1303
1304Triple<Identifier,Identifier,Identifier> getDotSeparatedTriple() throws ParseException:
1305{
1306 Identifier first = null;
1307 Identifier second = null;
1308 Identifier third = null;
1309}
1310{
1311 < IDENTIFIER >
1312 {
1313 first = new Identifier(token.image);
1314 }
1315 "." <IDENTIFIER>
1316 {
1317 second = new Identifier(token.image);
1318 }
1319 (
1320 "." <IDENTIFIER>
1321 {
1322 third = new Identifier(token.image);
1323 }
1324 )?
1325
1326 {
1327 if(third == null){
1328 third = second;
1329 second = first;
1330 first = null;
1331 }
1332
1333 return new Triple<Identifier,Identifier,Identifier>(first,second,third);
1334 }
1335}
1336
1337
1338
vinayakb38b7ca42012-03-05 05:44:15 +00001339
1340FunctionDecl FunctionDeclaration() throws ParseException:
1341{
vinayakb5ee049d2013-04-06 21:21:29 +00001342 FunctionDecl funcDecl;
1343 FunctionSignature signature;
ramangrover29a13f2422012-03-15 23:01:27 +00001344 String functionName;
vinayakb38b7ca42012-03-05 05:44:15 +00001345 int arity = 0;
1346 List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
1347 Expression funcBody;
1348 VarIdentifier var = null;
1349 createNewScope();
1350}
1351{
1352
1353 <IDENTIFIER>
1354 {
1355 Token t = getToken(0);
ramangrover29a13f2422012-03-15 23:01:27 +00001356 functionName = t.toString();
vinayakb38b7ca42012-03-05 05:44:15 +00001357 }
1358 <LEFTPAREN> (<VARIABLE>
1359 {
1360 var = new VarIdentifier();
1361 var.setValue(getToken(0).toString());
1362 paramList.add(var);
1363 getCurrentScope().addNewVarSymbolToScope(var);
1364 arity++;
1365 }
1366 ("," <VARIABLE>
1367 {
1368 var = new VarIdentifier();
1369 var.setValue(getToken(0).toString());
1370 paramList.add(var);
1371 getCurrentScope().addNewVarSymbolToScope(var);
1372 arity++;
1373 })*)? <RIGHTPAREN> "{" funcBody = Expression() "}"
1374
1375 {
vinayakb5ee049d2013-04-06 21:21:29 +00001376 signature = new FunctionSignature(defaultDataverse, functionName, arity);
1377 getCurrentScope().addFunctionDescriptor(signature, false);
1378 funcDecl = new FunctionDecl(signature, paramList, funcBody);
1379 return funcDecl;
vinayakb38b7ca42012-03-05 05:44:15 +00001380 }
1381}
1382
1383CreateFunctionStatement FunctionCreation() throws ParseException:
1384{
1385 CreateFunctionStatement cfs = null;
vinayakb5ee049d2013-04-06 21:21:29 +00001386 FunctionSignature signature;
1387 String dataverse;
ramangrover29a13f2422012-03-15 23:01:27 +00001388 String functionName;
vinayakb38b7ca42012-03-05 05:44:15 +00001389 boolean ifNotExists = false;
1390 List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
vinayakb5ee049d2013-04-06 21:21:29 +00001391 String functionBody;
vinayakb38b7ca42012-03-05 05:44:15 +00001392 VarIdentifier var = null;
1393 createNewScope();
vinayakb5ee049d2013-04-06 21:21:29 +00001394 Expression functionBodyExpr;
1395 Token beginPos;
1396 Token endPos;
1397 Pair<Identifier,Identifier> nameComponents=null;
vinayakb38b7ca42012-03-05 05:44:15 +00001398}
1399{
vinayakb5ee049d2013-04-06 21:21:29 +00001400 {
1401 nameComponents = getDotSeparatedPair();
1402 dataverse = nameComponents.first != null ? nameComponents.first.getValue() : defaultDataverse;
1403 functionName= nameComponents.second.getValue();
vinayakb38b7ca42012-03-05 05:44:15 +00001404 }
1405
1406 (
1407 "if not exists"
1408 {
1409 ifNotExists = true;
1410 }
1411 )?
1412
1413 <LEFTPAREN> (<VARIABLE>
1414 {
1415 var = new VarIdentifier();
1416 var.setValue(getToken(0).toString());
1417 paramList.add(var);
1418 getCurrentScope().addNewVarSymbolToScope(var);
vinayakb38b7ca42012-03-05 05:44:15 +00001419 }
1420 ("," <VARIABLE>
1421 {
1422 var = new VarIdentifier();
1423 var.setValue(getToken(0).toString());
1424 paramList.add(var);
1425 getCurrentScope().addNewVarSymbolToScope(var);
vinayakb5ee049d2013-04-06 21:21:29 +00001426 })*)? <RIGHTPAREN> "{"
vinayakb38b7ca42012-03-05 05:44:15 +00001427 {
vinayakb5ee049d2013-04-06 21:21:29 +00001428 beginPos = getToken(0);
1429 }
1430 functionBodyExpr = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00001431 "}"
vinayakb5ee049d2013-04-06 21:21:29 +00001432 {
1433 endPos = getToken(0);
1434 functionBody = extractFragment(beginPos.beginLine, beginPos.beginColumn, endPos.beginLine, endPos.beginColumn);
1435 }
vinayakb38b7ca42012-03-05 05:44:15 +00001436 {
vinayakb5ee049d2013-04-06 21:21:29 +00001437 signature = new FunctionSignature(dataverse, functionName, paramList.size());
1438 getCurrentScope().addFunctionDescriptor(signature, false);
1439 cfs = new CreateFunctionStatement(signature, paramList, functionBody, ifNotExists);
vinayakb38b7ca42012-03-05 05:44:15 +00001440 return cfs;
1441 }
1442}
1443
1444
1445
1446Query Query()throws ParseException:
1447{
1448 Query query = new Query();
1449 Expression expr;
1450}
1451{
1452 expr = Expression()
vinayakb5ee049d2013-04-06 21:21:29 +00001453 (";")?
vinayakb38b7ca42012-03-05 05:44:15 +00001454 {
1455 query.setBody(expr);
vinayakb5ee049d2013-04-06 21:21:29 +00001456 query.setVarCounter(getVarCounter());
vinayakb38b7ca42012-03-05 05:44:15 +00001457 return query;
1458 }
vinayakb5ee049d2013-04-06 21:21:29 +00001459
vinayakb38b7ca42012-03-05 05:44:15 +00001460}
1461
1462
1463
1464Expression Expression():
1465{
1466 Expression expr = null;
1467 Expression exprP = null;
1468}
1469{
1470(
1471
1472//OperatorExpr | IfThenElse | FLWOGRExpression | QuantifiedExpression
1473 expr = OperatorExpr()
1474 | expr = IfThenElse()
1475 | expr = FLWOGR()
1476 | expr = QuantifiedExpression()
vinayakb5ee049d2013-04-06 21:21:29 +00001477
vinayakb38b7ca42012-03-05 05:44:15 +00001478
1479)
1480 {
1481 return (exprP==null) ? expr : exprP;
1482 }
1483}
1484
1485
1486
1487Expression OperatorExpr()throws ParseException:
1488{
1489 OperatorExpr op = null;
1490 Expression operand = null;
1491}
1492{
1493 operand = AndExpr()
1494 (
1495
1496 "or"
1497 {
1498 if (op == null) {
1499 op = new OperatorExpr();
1500 op.addOperand(operand);
1501 op.setCurrentop(true);
1502 }
1503 Token t = getToken(0);
1504 op.addOperator(t.toString());
1505 }
1506
1507 operand = AndExpr()
1508 {
1509 op.addOperand(operand);
1510 }
1511
1512 )*
1513
1514 {
1515 return op==null? operand: op;
1516 }
1517}
1518
1519Expression AndExpr()throws ParseException:
1520{
1521 OperatorExpr op = null;
1522 Expression operand = null;
1523}
1524{
1525 operand = RelExpr()
1526 (
1527
1528 "and"
1529 {
1530 if (op == null) {
1531 op = new OperatorExpr();
1532 op.addOperand(operand);
1533 op.setCurrentop(true);
1534 }
1535 Token t = getToken(0);
1536 op.addOperator(t.toString());
1537 }
1538
1539 operand = RelExpr()
1540 {
1541 op.addOperand(operand);
1542 }
1543
1544 )*
1545
1546 {
1547 return op==null? operand: op;
1548 }
1549}
1550
1551
1552
1553Expression RelExpr()throws ParseException:
1554{
1555 OperatorExpr op = null;
1556 Expression operand = null;
1557 boolean broadcast = false;
vinayakb5ee049d2013-04-06 21:21:29 +00001558 IExpressionAnnotation annotation = null;
vinayakb38b7ca42012-03-05 05:44:15 +00001559}
1560{
1561 operand = AddExpr()
vinayakb5ee049d2013-04-06 21:21:29 +00001562 {
1563 if (operand instanceof VariableExpr) {
1564 String hint = getHint(token);
vinayakb38b7ca42012-03-05 05:44:15 +00001565 if (hint != null && hint.equals(BROADCAST_JOIN_HINT)) {
vinayakb5ee049d2013-04-06 21:21:29 +00001566 broadcast = true;
vinayakb38b7ca42012-03-05 05:44:15 +00001567 }
1568 }
1569 }
1570
1571 (
1572 LOOKAHEAD(2)( "<" | ">" | "<=" | ">=" | "=" | "!=" |"~=")
1573 {
vinayakb5ee049d2013-04-06 21:21:29 +00001574 String mhint = getHint(token);
1575 if (mhint != null && mhint.equals(INDEXED_NESTED_LOOP_JOIN_HINT)) {
1576 annotation = IndexedNLJoinExpressionAnnotation.INSTANCE;
1577 }
vinayakb38b7ca42012-03-05 05:44:15 +00001578 if (op == null) {
1579 op = new OperatorExpr();
1580 op.addOperand(operand, broadcast);
1581 op.setCurrentop(true);
1582 broadcast = false;
1583 }
1584 Token t = getToken(0);
1585 op.addOperator(t.toString());
1586 }
1587
1588 operand = AddExpr()
1589 {
vinayakb5ee049d2013-04-06 21:21:29 +00001590 broadcast = false;
1591 if (operand instanceof VariableExpr) {
1592 String hint = getHint(token);
vinayakb38b7ca42012-03-05 05:44:15 +00001593 if (hint != null && hint.equals(BROADCAST_JOIN_HINT)) {
1594 broadcast = true;
1595 }
vinayakb5ee049d2013-04-06 21:21:29 +00001596 }
vinayakb38b7ca42012-03-05 05:44:15 +00001597 op.addOperand(operand, broadcast);
1598 }
1599 )?
1600
1601 {
vinayakb5ee049d2013-04-06 21:21:29 +00001602 if (annotation != null) {
1603 op.addHint(annotation);
1604 }
vinayakb38b7ca42012-03-05 05:44:15 +00001605 return op==null? operand: op;
1606 }
1607}
1608
1609Expression AddExpr()throws ParseException:
1610{
1611 OperatorExpr op = null;
1612 Expression operand = null;
1613}
1614{
1615 operand = MultExpr()
1616
1617 ( ("+" | "-")
1618 {
1619 if (op == null) {
1620 op = new OperatorExpr();
1621 op.addOperand(operand);
1622 op.setCurrentop(true);
1623 }
1624 Token t = getToken(0);
1625 ((OperatorExpr)op).addOperator(t.toString());
1626 }
1627
1628 operand = MultExpr()
1629 {
1630 op.addOperand(operand);
1631 }
1632 )*
1633
1634 {
1635 return op==null? operand: op;
1636 }
1637}
1638
1639Expression MultExpr()throws ParseException:
1640{
1641 OperatorExpr op = null;
1642 Expression operand = null;
1643}
1644{
1645 operand = UnionExpr()
1646
1647 (( "*" | "/" | "%" | <CARET> | "idiv")
1648 {
1649 if (op == null) {
1650 op = new OperatorExpr();
1651 op.addOperand(operand);
1652 op.setCurrentop(true);
1653 }
1654 Token t = getToken(0);
1655 op.addOperator(t.toString());
1656 }
1657 operand = UnionExpr()
1658 {
1659 op.addOperand(operand);
1660 }
1661 )*
1662
1663 {
1664 return op==null?operand:op;
1665 }
1666}
1667
1668Expression UnionExpr() throws ParseException:
1669{
1670 UnionExpr union = null;
1671 Expression operand1 = null;
1672 Expression operand2 = null;
1673}
1674{
1675 operand1 = UnaryExpr()
1676 ("union"
1677 (operand2 = UnaryExpr()) {
1678 if (union == null) {
1679 union = new UnionExpr();
1680 union.addExpr(operand1);
1681 }
1682 union.addExpr(operand2);
1683 } )*
1684 {
1685 return (union == null)? operand1: union;
1686 }
1687}
1688
1689Expression UnaryExpr() throws ParseException:
1690{
1691 Expression uexpr = null;
1692 Expression expr = null;
1693}
1694{
1695 (( "+"|"-")
1696 {
1697 uexpr = new UnaryExpr();
1698 Token t = getToken(0);
1699 if("+".equals(t.toString()))
1700 ((UnaryExpr)uexpr).setSign(Sign.POSITIVE);
1701 else if("-".equals(t.toString()))
1702 ((UnaryExpr)uexpr).setSign(Sign.NEGATIVE);
1703 else
1704 throw new ParseException();
1705 }
1706 )?
1707
1708 expr = ValueExpr()
1709 {
1710 if(uexpr!=null){
1711 ((UnaryExpr)uexpr).setExpr(expr);
1712 return uexpr;
1713 }
1714 else{
1715 return expr;
1716 }
1717 }
1718}
1719
1720Expression ValueExpr() throws ParseException:
1721{
1722 Expression expr;
1723}
1724{
1725 expr = FieldOrIndexAccessor()
1726 {
1727 return expr;
1728 }
1729}
1730
1731
1732Expression FieldOrIndexAccessor()throws ParseException:
1733{
1734 Expression expr = null;
1735 Identifier ident = null;
1736 AbstractAccessor fa = null;
1737 int index;
1738
1739}
1740{
1741 ( expr = PrimaryExpr()
1742
1743 )
1744
1745
1746 (
1747 (
1748 ident = Field()
1749 {
1750 if(fa == null)
1751 fa = new FieldAccessor(expr, ident);
1752 else
1753 fa = new FieldAccessor(fa, ident);
1754 }
1755 )
1756 | (
1757 index = Index()
1758 {
1759 if(fa == null)
1760 fa = new IndexAccessor(expr, index);
1761 else
1762 fa = new IndexAccessor(fa, index);
1763 }
1764 )
1765 )*
1766
1767
1768 {
1769 return fa==null?expr:fa;
1770 }
1771}
1772
1773Identifier Field() throws ParseException:
1774{
1775 Identifier ident = null;
1776
1777}
1778{
1779 "." < IDENTIFIER >
1780 {
1781
1782 ident = new Identifier();
1783 ident.setValue(getToken(0).toString());
1784
1785 return ident;
1786 }
1787}
1788
1789int Index() throws ParseException:
1790{
1791 Expression expr = null;
1792 int idx = -2;
1793}
1794{
1795 "[" ( expr = Expression()
1796 {
1797 if(expr.getKind() == Expression.Kind.LITERAL_EXPRESSION)
1798 {
vinayakb5ee049d2013-04-06 21:21:29 +00001799 Literal lit = ((LiteralExpr)expr).getValue();
1800 if(lit.getLiteralType() == Literal.Type.INTEGER ||
1801 lit.getLiteralType() == Literal.Type.LONG) {
vinayakb38b7ca42012-03-05 05:44:15 +00001802 idx = Integer.valueOf(lit.getStringValue());
vinayakb5ee049d2013-04-06 21:21:29 +00001803 }
vinayakb38b7ca42012-03-05 05:44:15 +00001804 else {
1805 throw new ParseException("Index should be an INTEGER");
1806 }
1807 }
1808
1809 }
1810
1811 | "?"
1812 {
1813 idx = IndexAccessor.ANY;
1814 // ANY
1815 }
1816
1817 )
1818
1819 "]"
1820 {
1821 return idx;
1822 }
1823}
1824
1825
1826Expression PrimaryExpr()throws ParseException:
1827{
1828 Expression expr = null;
1829}
1830{
vinayakb5ee049d2013-04-06 21:21:29 +00001831 //Literal | VariableRef | ListConstructor | RecordConstructor | FunctionCallExpr | DatasetAccessExpression | ParenthesizedExpression
vinayakb38b7ca42012-03-05 05:44:15 +00001832 (
1833 expr =Literal()
1834 | expr = FunctionCallExpr()
vinayakb5ee049d2013-04-06 21:21:29 +00001835 | expr = DatasetAccessExpression()
vinayakb38b7ca42012-03-05 05:44:15 +00001836 | expr =VariableRef()
1837
1838 {
1839 if(((VariableExpr)expr).getIsNewVar() == true)
1840 throw new ParseException("can't find variable " + ((VariableExpr)expr).getVar());
1841 }
1842 | expr = ListConstructor()
1843 | expr = RecordConstructor()
1844 | expr = ParenthesizedExpression()
1845 )
1846 {
1847 return expr;
1848 }
1849}
1850
1851Expression Literal() throws ParseException:
1852{
1853
1854 LiteralExpr lit = new LiteralExpr();
1855 Token t;
1856}
1857{
1858(
1859 <STRING_LITERAL>
1860 {
1861 t= getToken(0);
1862 lit.setValue( new StringLiteral(removeQuotesAndEscapes(t.image)));
1863 }
1864
1865 | <INTEGER_LITERAL>
1866 {
1867 t= getToken(0);
vinayakb5ee049d2013-04-06 21:21:29 +00001868 try {
1869 lit.setValue(new IntegerLiteral(new Integer(t.image)));
1870 } catch(NumberFormatException ex) {
1871 lit.setValue(new LongIntegerLiteral(new Long(t.image)));
1872 }
vinayakb38b7ca42012-03-05 05:44:15 +00001873 }
1874 | < FLOAT_LITERAL >
1875 {
1876 t= getToken(0);
1877 lit.setValue(new FloatLiteral(new Float(t.image)));
1878 }
1879 | < DOUBLE_LITERAL >
1880 {
1881 t= getToken(0);
1882 lit.setValue(new DoubleLiteral(new Double(t.image)));
1883 }
1884 | <NULL>
1885 {
1886 t= getToken(0);
1887 lit.setValue(NullLiteral.INSTANCE);
1888 }
1889 | <TRUE>
1890 {
1891 t= getToken(0);
1892 lit.setValue(TrueLiteral.INSTANCE);
1893 }
1894 | <FALSE>
1895 {
1896 t= getToken(0);
1897 lit.setValue(FalseLiteral.INSTANCE);
1898 }
1899)
1900 {
1901 return lit;
1902 }
1903}
1904
1905
1906VariableExpr VariableRef() throws ParseException:
1907{
1908 VariableExpr varExp = new VariableExpr();
1909 VarIdentifier var = new VarIdentifier();
1910 Token t;
1911}
1912{
1913 <VARIABLE>
1914 {
1915 t = getToken(0);//get current token
1916 String varName = t.toString();
1917 Identifier ident = lookupSymbol(varName);
1918 if (isInForbiddenScopes(varName)) {
1919 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.");
1920 }
1921 if(ident != null) { // exist such ident
1922 varExp.setIsNewVar(false);
1923 varExp.setVar((VarIdentifier)ident);
1924 } else {
1925 varExp.setVar(var);
1926 }
1927 var.setValue(t.toString());
1928 return varExp;
1929 }
1930}
1931
1932
1933VariableExpr Variable() throws ParseException:
1934{
1935 VariableExpr varExp = new VariableExpr();
1936 VarIdentifier var = new VarIdentifier();
1937 Token t;
1938}
1939{
1940 <VARIABLE>
1941 {
1942 t = getToken(0);//get current token
1943 Identifier ident = lookupSymbol(t.toString());
1944 if(ident != null) { // exist such ident
1945 varExp.setIsNewVar(false);
1946 }
1947 varExp.setVar(var);
1948 var.setValue(t.toString());
1949 return varExp;
1950 }
1951}
1952
1953Expression ListConstructor() throws ParseException:
1954{
1955 Expression expr = null;
1956}
1957{
1958 (
1959 expr = OrderedListConstructor() | expr = UnorderedListConstructor()
1960 )
1961
1962 {
1963 return expr;
1964 }
1965}
1966
1967
1968ListConstructor OrderedListConstructor() throws ParseException:
1969{
1970 ListConstructor expr = new ListConstructor();
1971 Expression tmp = null;
1972 List<Expression> exprList = new ArrayList<Expression>();
1973 expr.setType(ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR);
1974}
1975{
1976
1977 "["
1978 ( tmp = Expression()
1979 {
1980 exprList.add(tmp);
1981 }
1982
1983 ("," tmp = Expression() { exprList.add(tmp); })*
1984 )?
1985
1986 "]"
1987
1988 {
1989 expr.setExprList(exprList);
1990 return expr;
1991 }
1992}
1993
1994ListConstructor UnorderedListConstructor() throws ParseException:
1995{
1996 ListConstructor expr = new ListConstructor();
1997 Expression tmp = null;
1998 List<Expression> exprList = new ArrayList<Expression>();
1999 expr.setType(ListConstructor.Type.UNORDERED_LIST_CONSTRUCTOR);
2000}
2001{
2002
2003 "{{" ( tmp = Expression()
2004 {
2005 exprList.add(tmp);
2006 }
2007 ("," tmp = Expression() { exprList.add(tmp); })*)? "}}"
2008 {
2009 expr.setExprList(exprList);
2010 return expr;
2011 }
2012}
2013
2014RecordConstructor RecordConstructor() throws ParseException:
2015{
2016 RecordConstructor expr = new RecordConstructor();
2017 FieldBinding tmp = null;
2018 List<FieldBinding> fbList = new ArrayList<FieldBinding>();
2019}
2020{
2021 "{" (tmp = FieldBinding()
2022 {
2023 fbList.add(tmp);
2024 }
2025 ("," tmp = FieldBinding() { fbList.add(tmp); })*)? "}"
2026 {
2027 expr.setFbList(fbList);
2028 return expr;
2029 }
2030}
2031
2032FieldBinding FieldBinding() throws ParseException:
2033{
2034 FieldBinding fb = new FieldBinding();
2035 Expression left, right;
2036}
2037{
2038 left = Expression() ":" right = Expression()
2039 {
2040 fb.setLeftExpr(left);
2041 fb.setRightExpr(right);
2042 return fb;
2043 }
2044}
2045
vinayakb5ee049d2013-04-06 21:21:29 +00002046
vinayakb38b7ca42012-03-05 05:44:15 +00002047Expression FunctionCallExpr() throws ParseException:
2048{
vinayakb5ee049d2013-04-06 21:21:29 +00002049 CallExpr callExpr;
2050 List<Expression> argList = new ArrayList<Expression>();
vinayakb38b7ca42012-03-05 05:44:15 +00002051 Expression tmp;
2052 int arity = 0;
vinayakb5ee049d2013-04-06 21:21:29 +00002053 String funcName;
2054 String dataverse;
2055 String hint=null;
2056 String id1=null;
2057 String id2=null;
vinayakb38b7ca42012-03-05 05:44:15 +00002058}
vinayakb5ee049d2013-04-06 21:21:29 +00002059{
2060
2061 <IDENTIFIER> { dataverse = defaultDataverse; funcName = token.image;} ("." <IDENTIFIER> { dataverse = funcName; funcName = token.image;})?
vinayakb38b7ca42012-03-05 05:44:15 +00002062 {
vinayakb5ee049d2013-04-06 21:21:29 +00002063 hint = getHint(token);
vinayakb38b7ca42012-03-05 05:44:15 +00002064 }
2065 <LEFTPAREN> (tmp = Expression()
2066 {
2067 argList.add(tmp);
2068 arity ++;
2069 } ("," tmp = Expression() { argList.add(tmp); arity++; })*)? <RIGHTPAREN>
2070
2071 {
vinayakb5ee049d2013-04-06 21:21:29 +00002072 FunctionSignature signature = lookupFunctionSignature(dataverse, funcName.toString(), arity);
2073 if(signature == null)
2074 {
2075 signature = new FunctionSignature(dataverse, funcName.toString(), arity);
2076 }
2077 callExpr = new CallExpr(signature,argList);
2078 if (hint != null && hint.startsWith(INDEXED_NESTED_LOOP_JOIN_HINT)) {
2079 callExpr.addHint(IndexedNLJoinExpressionAnnotation.INSTANCE);
2080 }
2081 return callExpr;
vinayakb38b7ca42012-03-05 05:44:15 +00002082 }
2083}
2084
vinayakb5ee049d2013-04-06 21:21:29 +00002085Expression DatasetAccessExpression() throws ParseException:
2086{
2087 CallExpr callExpr;
2088 List<Expression> argList = new ArrayList<Expression>();
2089 String funcName;
2090 String dataverse;
2091 LiteralExpr ds;
2092 LiteralExpr dvds;
2093 Expression nameArg;
2094 int arity = 0;
2095}
2096{
2097 <DATASET> {dataverse = MetadataConstants.METADATA_DATAVERSE_NAME; funcName = getToken(0).toString();}
2098 (
2099 (<IDENTIFIER> {ds = new LiteralExpr(); ds.setValue( new StringLiteral(token.image) ); argList.add(ds); arity ++;} ("." <IDENTIFIER> { dvds = new LiteralExpr(); dvds.setValue(new StringLiteral(ds.getValue()+"."+token.image)); argList.remove(0); argList.add(dvds);})? ) |
2100 (<LEFTPAREN> nameArg = Expression() {argList.add(nameArg); arity ++;} ("," nameArg = Expression() { argList.add(nameArg); arity++; })* <RIGHTPAREN>)
2101 )
2102
2103 {
2104 FunctionSignature signature = lookupFunctionSignature(dataverse, funcName.toString(), arity);
2105 if(signature == null)
2106 {
2107 signature = new FunctionSignature(dataverse, funcName.toString(), arity);
2108 }
2109 callExpr = new CallExpr(signature,argList);
2110 return callExpr;
2111 }
2112}
vinayakb38b7ca42012-03-05 05:44:15 +00002113
2114Expression ParenthesizedExpression() throws ParseException:
2115{
2116 Expression expr;
2117}
2118{
2119 <LEFTPAREN> expr = Expression() <RIGHTPAREN>
2120 {
2121 return expr;
2122 }
2123}
2124
2125Expression IfThenElse() throws ParseException:
2126{
2127 Expression condExpr;
2128 Expression thenExpr;
2129 Expression elseExpr;
2130 IfExpr ifExpr = new IfExpr();
2131}
2132{
2133 "if" <LEFTPAREN> condExpr = Expression() <RIGHTPAREN> "then" thenExpr = Expression() "else" elseExpr = Expression()
2134
2135 {
2136 ifExpr.setCondExpr(condExpr);
2137 ifExpr.setThenExpr(thenExpr);
2138 ifExpr.setElseExpr(elseExpr);
2139 return ifExpr;
2140 }
2141}
2142
2143Expression FLWOGR() throws ParseException:
2144{
2145 FLWOGRExpression flworg = new FLWOGRExpression();
2146 List<Clause> clauseList = new ArrayList<Clause>();
2147 Expression returnExpr;
2148 Clause tmp;
2149 createNewScope();
2150}
2151{
2152 (tmp = ForClause() {clauseList.add(tmp);} | tmp = LetClause() {clauseList.add(tmp);})
2153 (tmp = Clause() {clauseList.add(tmp);})* "return" returnExpr = Expression()
2154
2155 {
2156 flworg.setClauseList(clauseList);
2157 flworg.setReturnExpr(returnExpr);
2158 removeCurrentScope();
2159 return flworg;
2160 }
2161}
2162
2163Clause Clause()throws ParseException :
2164{
2165 Clause clause;
2166}
2167{
2168 (
2169 clause = ForClause()
2170 | clause = LetClause()
2171 | clause = WhereClause()
2172 | clause = OrderbyClause()
2173 | clause = GroupClause()
2174 | clause = LimitClause()
2175 | clause = DistinctClause()
2176 | clause = DieClause()
2177 )
2178 {
2179 return clause;
2180 }
2181}
2182
2183Clause ForClause()throws ParseException :
2184{
2185 ForClause fc = new ForClause();
2186 VariableExpr varExp;
2187 VariableExpr varPos = null;
2188 Expression inExp;
2189 extendCurrentScope();
2190}
2191{
2192 "for" varExp = Variable()
2193 {
2194 getCurrentScope().addNewVarSymbolToScope(varExp.getVar());
2195 }
2196 ("at" varPos = Variable()
2197 {
2198 getCurrentScope().addNewVarSymbolToScope(varPos.getVar());
2199 }
2200 )?
2201 "in" ( inExp = Expression() )
2202 {
2203 fc.setVarExpr(varExp);
2204 fc.setInExpr(inExp);
2205 if (varPos != null) {
2206 fc.setPosExpr(varPos);
2207 }
2208 return fc;
2209 }
2210}
2211
2212Clause LetClause() throws ParseException:
2213{
2214 LetClause lc = new LetClause();
2215 VariableExpr varExp;
2216 Expression beExp;
2217 extendCurrentScope();
2218}
2219{
vinayakb5ee049d2013-04-06 21:21:29 +00002220 "let" varExp = Variable() ":=" beExp = Expression()
vinayakb38b7ca42012-03-05 05:44:15 +00002221 {
2222 getCurrentScope().addNewVarSymbolToScope(varExp.getVar());
vinayakb38b7ca42012-03-05 05:44:15 +00002223 lc.setVarExpr(varExp);
2224 lc.setBeExpr(beExp);
2225 return lc;
2226 }
2227}
2228
2229Clause WhereClause()throws ParseException :
2230{
2231 WhereClause wc = new WhereClause();
2232 Expression whereExpr;
2233}
2234{
2235 "where" whereExpr = Expression()
2236 {
2237 wc.setWhereExpr(whereExpr);
2238 return wc;
2239 }
2240}
2241
2242Clause OrderbyClause()throws ParseException :
2243{
2244 OrderbyClause oc = new OrderbyClause();
2245 Expression orderbyExpr;
2246 List<Expression> orderbyList = new ArrayList<Expression>();
2247 List<OrderbyClause.OrderModifier> modifierList = new ArrayList<OrderbyClause.OrderModifier >();
2248 int numOfOrderby = 0;
2249}
2250{
2251 (
2252 "order"
2253 {
2254 String hint = getHint(token);
2255 if (hint != null && hint.startsWith(INMEMORY_HINT)) {
2256 String splits[] = hint.split(" +");
2257 int numFrames = Integer.parseInt(splits[1]);
2258 int numTuples = Integer.parseInt(splits[2]);
2259 oc.setNumFrames(numFrames);
2260 oc.setNumTuples(numTuples);
2261 }
2262 }
2263 "by" orderbyExpr = Expression()
2264 {
2265 orderbyList.add(orderbyExpr);
2266 OrderbyClause.OrderModifier modif = OrderbyClause.OrderModifier.ASC;
2267 }
2268 ( ("asc" { modif = OrderbyClause.OrderModifier.ASC; })
2269 | ("desc" { modif = OrderbyClause.OrderModifier.DESC; }))?
2270 {
2271 modifierList.add(modif);
2272 }
2273
2274 ("," orderbyExpr = Expression()
2275 {
2276 orderbyList.add(orderbyExpr);
2277 modif = OrderbyClause.OrderModifier.ASC;
2278 }
2279 ( ("asc" { modif = OrderbyClause.OrderModifier.ASC; })
2280 | ("desc" { modif = OrderbyClause.OrderModifier.DESC; }))?
2281 {
2282 modifierList.add(modif);
2283 }
2284 )*
2285)
2286 {
2287 oc.setModifierList(modifierList);
2288 oc.setOrderbyList(orderbyList);
2289 return oc;
2290 }
2291}
2292Clause GroupClause()throws ParseException :
2293{
2294 GroupbyClause gbc = new GroupbyClause();
2295 // GbyVariableExpressionPair pair = new GbyVariableExpressionPair();
2296 List<GbyVariableExpressionPair> vePairList = new ArrayList<GbyVariableExpressionPair>();
2297 List<GbyVariableExpressionPair> decorPairList = new ArrayList<GbyVariableExpressionPair>();
2298 List<VariableExpr> withVarList= new ArrayList<VariableExpr>();
2299 VariableExpr var = null;
2300 VariableExpr withVar = null;
2301 Expression expr = null;
2302 VariableExpr decorVar = null;
2303 Expression decorExpr = null;
2304}
2305{
2306 {
2307 Scope newScope = extendCurrentScopeNoPush(true);
2308 // extendCurrentScope(true);
2309 }
2310 "group"
2311 {
2312 String hint = getHint(token);
2313 if (hint != null && hint.equals(HASH_GROUP_BY_HINT)) {
2314 gbc.setHashGroupByHint(true);
2315 }
2316 }
2317 "by" (LOOKAHEAD(2) var = Variable()
2318 {
2319 newScope.addNewVarSymbolToScope(var.getVar());
2320 } ":=")?
2321 expr = Expression()
2322 {
2323 GbyVariableExpressionPair pair1 = new GbyVariableExpressionPair(var, expr);
2324 vePairList.add(pair1);
2325 }
2326 ("," ( LOOKAHEAD(2) var = Variable()
2327 {
2328 newScope.addNewVarSymbolToScope(var.getVar());
2329 } ":=")?
2330 expr = Expression()
2331 {
2332 GbyVariableExpressionPair pair2 = new GbyVariableExpressionPair(var, expr);
2333 vePairList.add(pair2);
2334 }
2335 )*
2336 ("decor" decorVar = Variable() ":=" decorExpr = Expression()
2337 {
2338 newScope.addNewVarSymbolToScope(decorVar.getVar());
2339 GbyVariableExpressionPair pair3 = new GbyVariableExpressionPair(decorVar, decorExpr);
2340 decorPairList.add(pair3);
2341 }
2342 ("," "decor" decorVar = Variable() ":=" decorExpr = Expression()
2343 {
2344 newScope.addNewVarSymbolToScope(decorVar.getVar());
2345 GbyVariableExpressionPair pair4 = new GbyVariableExpressionPair(decorVar, decorExpr);
2346 decorPairList.add(pair4);
2347 }
2348 )*
2349 )?
2350 "with" withVar = VariableRef()
2351 {
2352 if(withVar.getIsNewVar()==true)
2353 throw new ParseException("can't find variable " + withVar.getVar());
2354 withVarList.add(withVar);
2355 newScope.addNewVarSymbolToScope(withVar.getVar());
2356 }
2357 ("," withVar = VariableRef()
2358 {
2359 if(withVar.getIsNewVar()==true)
2360 throw new ParseException("can't find variable " + withVar.getVar());
2361 withVarList.add(withVar);
2362 newScope.addNewVarSymbolToScope(withVar.getVar());
2363 })*
2364 {
2365 gbc.setGbyPairList(vePairList);
2366 gbc.setDecorPairList(decorPairList);
2367 gbc.setWithVarList(withVarList);
2368 replaceCurrentScope(newScope);
2369 return gbc;
2370 }
2371}
2372
2373
2374LimitClause LimitClause() throws ParseException:
2375{
2376 LimitClause lc = new LimitClause();
2377 Expression expr;
2378 pushForbiddenScope(getCurrentScope());
2379}
2380{
2381 "limit" expr = Expression() { lc.setLimitExpr(expr); }
2382 ("offset" expr = Expression() { lc.setOffset(expr); })?
2383
2384 {
2385 popForbiddenScope();
2386 return lc;
2387 }
2388}
2389
2390DistinctClause DistinctClause() throws ParseException:
2391{
2392 List<Expression> exprs = new ArrayList<Expression>();
2393 Expression expr;
2394}
2395{
2396 "distinct" "by" expr = Expression()
2397 {
2398 exprs.add(expr);
2399 }
2400 ("," expr = Expression()
2401 {
2402 exprs.add(expr);
2403 }
2404 )*
2405 {
2406 return new DistinctClause(exprs);
2407 }
2408}
2409
2410DieClause DieClause() throws ParseException:
2411{
2412 DieClause lc = new DieClause();
2413 Expression expr;
2414 pushForbiddenScope(getCurrentScope());
2415}
2416{
2417 "die" "after" expr = Expression() { lc.setDieExpr(expr); }
2418 {
2419 popForbiddenScope();
2420 return lc;
2421 }
2422}
2423
2424
2425QuantifiedExpression QuantifiedExpression()throws ParseException:
2426{
2427 QuantifiedExpression qc = new QuantifiedExpression();
2428 List<QuantifiedPair> quantifiedList = new ArrayList<QuantifiedPair>();
2429 Expression satisfiesExpr;
2430 VariableExpr var;
2431 Expression inExpr;
2432 QuantifiedPair pair;
2433}
2434{
2435 {
2436 createNewScope();
2437 }
2438
2439 ( ("some" { qc.setQuantifier(QuantifiedExpression.Quantifier.SOME); })
2440 | ("every" { qc.setQuantifier(QuantifiedExpression.Quantifier.EVERY); }))
2441 var = Variable() "in" inExpr = Expression()
2442 {
2443 pair = new QuantifiedPair(var, inExpr);
2444 getCurrentScope().addNewVarSymbolToScope(var.getVar());
2445 quantifiedList.add(pair);
2446 }
2447 (
2448 "," var = Variable() "in" inExpr = Expression()
2449 {
2450 pair = new QuantifiedPair(var, inExpr);
2451 getCurrentScope().addNewVarSymbolToScope(var.getVar());
2452 quantifiedList.add(pair);
2453 }
2454 )*
2455 "satisfies" satisfiesExpr = Expression()
2456 {
2457 qc.setSatisfiesExpr(satisfiesExpr);
2458 qc.setQuantifiedList(quantifiedList);
2459 removeCurrentScope();
2460 return qc;
2461 }
2462}
2463
2464TOKEN_MGR_DECLS:
2465{
2466 public int commentDepth = 0;
2467}
2468
2469<DEFAULT>
2470TOKEN :
2471{
2472 <CARET : "^" >
2473}
2474
2475<DEFAULT>
2476TOKEN :
2477{
2478 <DATASET : "dataset" >
2479}
2480
2481<DEFAULT>
2482TOKEN :
2483{
2484 <LEFTPAREN : "(" >
2485}
2486
2487<DEFAULT>
2488TOKEN :
2489{
2490 <RIGHTPAREN : ")" >
2491}
2492
2493
2494<DEFAULT>
2495TOKEN :
2496{
2497 <INTEGER_LITERAL : (<DIGIT>)+ >
2498}
2499
2500
2501<DEFAULT>
2502TOKEN :
2503{
2504 <NULL : "null">
2505}
2506
2507<DEFAULT>
2508TOKEN :
2509{
2510 <TRUE : "true">
2511}
2512
2513<DEFAULT>
2514TOKEN :
2515{
2516 <FALSE : "false">
2517}
2518
2519<DEFAULT>
2520TOKEN :
2521{
2522 <#DIGIT : ["0" - "9"]>
2523}
2524
2525
2526TOKEN:
2527{
2528 < DOUBLE_LITERAL: <INTEGER>
2529 | <INTEGER> ( "." <INTEGER> )?
2530 | "." <INTEGER>
2531 >
2532 |
2533 < FLOAT_LITERAL: <INTEGER> ( "f" | "F" )
2534 | <INTEGER> ( "." <INTEGER> ( "f" | "F" ) )?
2535 | "." <INTEGER> ( "f" | "F" )
2536 >
2537 |
2538 <INTEGER : (<DIGIT>)+ >
2539}
2540
2541<DEFAULT>
2542TOKEN :
2543{
2544 <#LETTER : ["A" - "Z", "a" - "z"]>
2545}
2546
2547<DEFAULT>
2548TOKEN :
2549{
2550 <SPECIALCHARS : ["$", "_", "-"] >
2551}
2552
2553<DEFAULT>
2554TOKEN :
2555{
2556 <STRING_LITERAL : ("\"" (<EscapeQuot> | ~["\""])* "\"") | ("\'"(<EscapeApos> | ~["\'"])* "\'")>
2557 |
2558 < #EscapeQuot: "\\\"" >
2559 |
2560 < #EscapeApos: "\\\'" >
2561}
2562
2563<DEFAULT>
2564TOKEN :
2565{
2566 <IDENTIFIER : (<LETTER>)+ (<LETTER> | <DIGIT> | <SPECIALCHARS>)*>
2567}
2568
vinayakb5ee049d2013-04-06 21:21:29 +00002569
vinayakb38b7ca42012-03-05 05:44:15 +00002570<DEFAULT>
2571TOKEN :
2572{
2573 <VARIABLE : "$" <IDENTIFIER> >
2574}
2575
2576SKIP:
2577{
2578 " "
2579| "\t"
2580| "\r"
2581| "\n"
2582}
2583
2584SKIP:
2585{
2586 <"//" (~["\n"])* "\n">
2587}
2588
2589SKIP:
2590{
2591 <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n")?>
2592}
2593
2594
2595SKIP:
2596{
2597 <"/*"> {commentDepth=1;}: INSIDE_COMMENT
2598}
2599
2600<INSIDE_COMMENT>
2601SPECIAL_TOKEN:
2602{
2603 <"+"(" ")*(~["*"])*>
2604}
2605
2606<INSIDE_COMMENT>
2607SKIP:
2608{
2609 <"/*"> {commentDepth++;}
2610}
2611
2612<INSIDE_COMMENT>
2613SKIP:
2614{
2615 <"*/"> {commentDepth--; if (commentDepth == 0) SwitchTo(DEFAULT);}
2616| <~[]>
2617}