Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / expressionevaluator / impl / grammars / DataAccessGrammarFactory.java @ 47730

History | View | Annotate | Download (32.1 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2020 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.expressionevaluator.impl.grammars;
25

    
26
import java.util.UUID;
27
import org.gvsig.expressionevaluator.Code;
28
import org.gvsig.expressionevaluator.CodeBuilder;
29
import org.gvsig.expressionevaluator.Codes;
30
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
31
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
32
import org.gvsig.expressionevaluator.Grammar;
33
import org.gvsig.expressionevaluator.Statement;
34
import org.gvsig.expressionevaluator.Statement.ArgsBuilder;
35
import org.gvsig.expressionevaluator.Statement.StatementContext;
36
import org.gvsig.expressionevaluator.impl.DALFunctions;
37
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseCodes;
38
import org.gvsig.expressionevaluator.impl.DefaultStatement;
39
import org.gvsig.expressionevaluator.impl.DefaultStatement.ArgsBuilderFromNames;
40
import org.gvsig.expressionevaluator.impl.function.dataaccess.ExistsFunction;
41
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory;
42
import static org.gvsig.fmap.dal.DataManager.FUNCTION_FOREING_VALUE;
43
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT;
44
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_COUNT;
45
import org.gvsig.expressionevaluator.Code.Callable;
46
import org.gvsig.expressionevaluator.MutableCodes;
47
import static org.gvsig.expressionevaluator.impl.function.dataaccess.SelectAggregateFunction.FUNCTION_SELECT_AGGREGATE;
48
import static org.gvsig.expressionevaluator.impl.function.dataaccess.SelectFunction.MODE_FROM_SELECTION;
49
import static org.gvsig.expressionevaluator.impl.function.dataaccess.SelectFunction.MODE_FROM_SELECTION_IF_NOT_EMPTY;
50
import static org.gvsig.expressionevaluator.impl.function.dataaccess.SelectFunction.MODE_FROM_STORE;
51
import org.gvsig.fmap.dal.DataManager;
52
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CREATE_TABLE;
53
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CREATE_TABLE_STRUCTURE;
54
import static org.gvsig.fmap.dal.DataManager.FUNCTION_FOREIGN_VALUE;
55
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_COUNT_FROM_SELECTION;
56
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_FROM_SELECTION;
57

    
58
/**
59
 *
60
 * @author jjdelcerro
61
 */
62
public class DataAccessGrammarFactory extends AbstractGrammarFactory {
63

    
64
    //?Ojo!, esto est? copiado de DefaultExpression por cuestiones de dependencias. Si lo tocamos hay que tocarlo en los dos lados
65
    public static final String COMPATIBILITY_SELECT_ID = "SELECT";
66
    public static final String COMPATIBILITY_SELECT_OPTIONAL_SEMICOLON_AT_END = "OPTIONAL_SEMICOLON_AT_END";
67
    
68
    private Grammar grammar;
69

    
70
    private static class ExistsStatementBuilder extends DefaultStatement.StatementBuilderBase {
71

    
72
        private final String listID;
73
        private final String existsID;
74

    
75
        public ExistsStatementBuilder(String listID, String existsID) {
76
            super(ExistsFunction.NAME, new ArgsBuilderFromNames(listID, existsID));
77
            this.listID = listID;
78
            this.existsID = existsID;
79
        }
80

    
81
        @Override
82
        public Code build(StatementContext context) {
83

    
84
            CodeBuilder codeBuilder = context.getCodeBuilder();
85
            Callable code = (Callable) super.build(context);
86
            BaseCodes args = (BaseCodes) code.parameters();
87
            if (args.size() < 2) {
88
                String exists_id = "EXISTS" + UUID.randomUUID().toString().replaceAll("-", "");
89
                args.add(codeBuilder.constant(exists_id));
90
            } else if (args.get(1) == null) {
91
                String exists_id = "EXISTS" + UUID.randomUUID().toString().replaceAll("-", "");
92
                args.set(1, codeBuilder.constant(exists_id));
93
            }
94
            code = codeBuilder.function(ExistsFunction.NAME, args);
95
            return code;
96
        }
97

    
98
    }
99

    
100
    private static class SelectArgsBuilder implements ArgsBuilder {
101

    
102
        public SelectArgsBuilder() {
103
        }
104

    
105
        @Override
106
        public String toString() {
107
            return "select_args()";
108
        }
109

    
110
        @Override
111
        public Codes build(StatementContext context) {
112
            context.trace(this.toString() + ".build");
113

    
114
            CodeBuilder codeBuilder = context.getCodeBuilder();
115
            MutableCodes args = codeBuilder.args();
116
            return build(context, args);
117
        }
118

    
119
        public Codes build(StatementContext context, MutableCodes args) {
120
            int n;
121
            MutableCodes argsX;
122

    
123
            CodeBuilder codeBuilder = context.getCodeBuilder();
124

    
125
            Code columns = context.getCode("COLUMNS");
126
            args.add(columns);
127

    
128
            Code table = context.getCode("TABLE");
129
            args.add(table);
130

    
131
            Code where = context.getCode("WHERE");
132
            if (where == null) {
133
                args.add(codeBuilder.constant(null));
134
            } else {
135
                args.add(where);
136
            }
137

    
138
            n = 1;
139
            argsX = codeBuilder.args();
140
            while (true) {
141
                String argNameX = "ORDER" + String.valueOf(n);
142
                Code code = context.getCode(argNameX);
143
                if (code == null) {
144
                    break;
145
                }
146
                argsX.add(code);
147
                n++;
148
            }
149
            args.add(codeBuilder.tuple(argsX));
150

    
151
            n = 1;
152
            argsX = codeBuilder.args();
153
            while (true) {
154
                String argNameX = "ORDER_MODE" + String.valueOf(n);
155
                Code code = context.getCode(argNameX);
156
                if (code == null) {
157
                    break;
158
                }
159
                argsX.add(code);
160
                n++;
161
            }
162
            args.add(codeBuilder.tuple(argsX));
163

    
164
            Code limit = context.getCode("LIMIT");
165
            if (limit == null) {
166
                args.add(codeBuilder.constant(null));
167
            } else {
168
                args.add(limit);
169
            }
170
            
171
            Code intovar = context.getCode("INTOVAR");
172
            if (intovar != null) {
173
                args.add(intovar);
174
            }
175
            
176
            
177
            int mode = MODE_FROM_STORE;
178
            Code selection = context.getCode("SELECTION");
179
            Code if_not_empty = context.getCode("IF_NOT_EMPTY");
180
            if (selection != null) {
181
                if( if_not_empty == null ) {
182
                    mode = MODE_FROM_SELECTION;
183
                } else {
184
                    mode = MODE_FROM_SELECTION_IF_NOT_EMPTY;
185
                }
186
            }
187
            
188
            if( mode != MODE_FROM_STORE ) {
189
                if( intovar == null ) {
190
                    args.add(intovar);
191
                }
192
                args.add(codeBuilder.constant(mode));
193
            }
194
            
195
            return args;            
196
        }
197

    
198
    }
199

    
200
    private static class InsertIntoArgsBuilder
201
            extends SelectArgsBuilder
202
            implements ArgsBuilder {
203

    
204
        public InsertIntoArgsBuilder() {
205
        }
206

    
207
        @Override
208
        public String toString() {
209
            return "insert_into_args()";
210
        }
211

    
212
        @Override
213
        public Codes build(StatementContext context) {
214
            context.trace(this.toString() + ".build");
215

    
216
            CodeBuilder codeBuilder = context.getCodeBuilder();
217
            MutableCodes args = codeBuilder.args();
218

    
219
            Code table = context.getCode("TARGETTABLE");
220
            args.add(codeBuilder.identifier((String) ((Code.Constant) table).value()));
221

    
222
            return build(context, args);
223
        }
224

    
225
    }
226

    
227
    private static class SelectCountArgsBuilder implements ArgsBuilder {
228

    
229
        public SelectCountArgsBuilder() {
230
        }
231

    
232
        @Override
233
        public String toString() {
234
            return "select_count_args()";
235
        }
236

    
237
        @Override
238
        public Codes build(StatementContext context) {
239
            context.trace(this.toString() + ".build");
240
            CodeBuilder codeBuilder = context.getCodeBuilder();
241
            MutableCodes args = codeBuilder.args();
242

    
243
            Code table = context.getCode("table");
244
            Code where = context.getCode("where");
245

    
246
            args.add(table);
247

    
248
            if (where == null) {
249
                args.add(codeBuilder.constant(null));
250
            } else {
251
                args.add(where);
252
            }
253
            return args;
254
        }
255

    
256
    }
257
    private static class SelectAggregateArgsBuilder implements ArgsBuilder {
258

    
259
        public SelectAggregateArgsBuilder() {
260
        }
261

    
262
        @Override
263
        public String toString() {
264
            return "select_aggregate_args()";
265
        }
266

    
267
        @Override
268
        public Codes build(StatementContext context) {
269
            context.trace(this.toString() + ".build");
270
            CodeBuilder codeBuilder = context.getCodeBuilder();
271
            MutableCodes args = codeBuilder.args();
272

    
273
            Code table = context.getCode("table");
274
            Code where = context.getCode("where");
275
            Code aggregateFunction = context.getCode("AGGREGATE_FUNCTION");
276
            Code aggregateColumn = context.getCode("AGGREGATE_COLUMN");
277

    
278
            args.add(table);
279

    
280
            if (where == null) {
281
                args.add(codeBuilder.constant(null));
282
            } else {
283
                args.add(where);
284
            }
285
            args.add(aggregateFunction);
286
            args.add(aggregateColumn);
287
            return args;
288
        }
289

    
290
    }
291

    
292
    public DataAccessGrammarFactory() {
293
        super(DALFunctions.GRAMMAR_NAME, true);
294
    }
295

    
296
    @Override
297
    public Grammar create(Object... parameters) {
298
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
299
        if (this.grammar == null) {
300
            Grammar theGrammar = manager.createGrammar(this.getName());
301

    
302
            theGrammar.addStatement(createCreateInMemoryTableStatement(theGrammar));
303
            theGrammar.addStatement(createCreateTableStatement(theGrammar));
304
            theGrammar.addStatement(createCreateTableStructureStatement(theGrammar));
305
            theGrammar.addStatement(createExistsStatement(theGrammar));
306
            theGrammar.addStatement(createForeingValueStatement(theGrammar));
307
            theGrammar.addStatement(createInsertIntoTableSelectStatement(theGrammar));
308
            theGrammar.addStatement(createSelectCountStatement(theGrammar));
309
            theGrammar.addStatement(createSelectAggregateStatement(theGrammar));
310
            theGrammar.addStatement(createSelectStatement(theGrammar));
311
//            theGrammar.addStatement(createSelectIntoStatement(theGrammar));
312
//            theGrammar.addStatement(createUpdateStatement(theGrammar));
313
            theGrammar.addStatement(createSelectCountFromSelectionStatement(theGrammar));
314
//            theGrammar.addStatement(createSelectFromSelectionStatement(theGrammar));
315

    
316
            this.grammar = theGrammar;
317
        }
318

    
319
        return grammar;
320
    }
321

    
322
    private Statement createExistsStatement(Grammar theGrammar) {
323
//    
324
//      EXISTS( SELECT...)
325
//
326
        Statement stmt;
327

    
328
        theGrammar.addReservedWord("EXISTS");
329

    
330
        stmt = theGrammar.createStatement("EXISTS");
331
        stmt.addRule(stmt.require_any_token("EXISTS"));
332
        stmt.addRule(stmt.require_any_token("("));
333
        stmt.addRule(stmt.require_expression().capture_as("LIST"));
334
        stmt.addRule(stmt.optional_any_token(",")
335
                .addRuleOnTrue(stmt.require_expression().capture_as("ID"))
336
        );
337
        stmt.addRule(stmt.require_any_token(")"));
338
        stmt.builder(new ExistsStatementBuilder("LIST", "ID"));
339

    
340
        return stmt;
341
    }
342

    
343
    private Statement createForeingValueStatement(Grammar theGrammar) {
344
        Statement stmt;
345
//      
346
//      FOREING VALUE FROM table_name.column_name  
347
//        
348
        theGrammar.addReservedWord("FROM");
349

    
350
        stmt = theGrammar.createStatement(FUNCTION_FOREIGN_VALUE);
351
        stmt.addRule(stmt.require_any_token("FOREING","FOREIGN"));
352
        stmt.addRule(stmt.require_any_token("VALUE"));
353
        stmt.addRule(stmt.require_any_token("FROM"));
354
        stmt.addRule(stmt.require_identifiers_as_string(".").capture_as("IDENTIFIERS"));
355
        stmt.code(
356
                FUNCTION_FOREIGN_VALUE,
357
                stmt.args_names("IDENTIFIERS")
358
        );
359

    
360
        return stmt;
361
    }
362

    
363
    private Statement createCreateInMemoryTableStatement(Grammar theGrammar) {
364
        Statement stmt;
365
//
366
//      CREATE IN MEMORY TABLE target_table_name FROM source_table_name
367
//        
368
        theGrammar.addReservedWord("FROM");
369

    
370
        stmt = theGrammar.createStatement("CREATE_IN_MEMORY_TABLE");
371
        stmt.addRule(stmt.require_any_token("CREATE"));
372
        stmt.addRule(stmt.require_any_token("IN"));
373
        stmt.addRule(stmt.require_any_token("MEMORY"));
374
        stmt.addRule(stmt.require_any_token("TABLE"));
375
        stmt.addRule(stmt.require_identifier().capture_as("NEWTABLE"));
376
        stmt.addRule(stmt.require_any_token("FROM"));
377
        stmt.addRule(stmt.require_identifier().capture_as("SOURCETABLE"));
378
        stmt.code(
379
                FUNCTION_FOREING_VALUE,
380
                stmt.args_names("NEWTABLE", "SOURCETABLE")
381
        );
382

    
383
        return stmt;
384
    }
385

    
386
    private Statement createSelectStatement(Grammar theGrammar) {
387
        Statement stmt;
388
//
389
//      SELECT * | (column1, column2,...) 
390
//          FROM table_name
391
//          WHERE expression
392
//          ORDER BY expression1 ASC|DESC, expression2 ASC|DESC ...
393
//          LIMIT expression
394
//        
395
        theGrammar.addReservedWord("SELECT");
396
        theGrammar.addReservedWord("FROM");
397
        theGrammar.addReservedWord("WHERE");
398
        theGrammar.addReservedWord("ORDER");
399
        theGrammar.addReservedWord("BY");
400
        theGrammar.addReservedWord("DESC");
401
        theGrammar.addReservedWord("ASC");
402
        theGrammar.addReservedWord("LIMIT");
403

    
404
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
405
        CodeBuilder codeBuilder = manager.createCodeBuilder();
406

    
407
        stmt = theGrammar.createStatement("SELECT");
408
        stmt.addRule(stmt.require_any_token("SELECT"));
409
        stmt.addRule(stmt.optional_any_token("*","1")
410
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
411
                .addRuleOnTrue(stmt.optional_any_token("INTO")
412
                    .addRuleOnTrue(stmt.require_identifier().capture_as("INTOVAR"))
413
                )                
414
                .addRuleOnFalse(stmt.require_expressions(",").capture_as("COLUMNS"))
415
        );
416
        stmt.addRule(stmt.require_any_token("FROM"));
417
        stmt.addRule(stmt.optional_any_token("SELECTION").capture_as("SELECTION")
418
                .addRuleOnTrue(stmt.optional_any_token("IF")
419
                    .addRuleOnTrue(stmt.require_tokens("NOT", "EMPTY").capture_as("IF_NOT_EMPTY"))
420
                )
421
                .addRuleOnTrue(stmt.optional_any_token("OF"))
422
        );
423
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
424
        stmt.addRule(stmt.optional_any_token("WHERE")
425
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
426
        );
427

    
428
        stmt.addRule(stmt.optional_any_token("ORDER")
429
                .addRuleOnTrue(stmt.require_any_token("BY"))
430
                .addRuleOnTrue(stmt.repeat()
431
                        .addRule(stmt.require_expression().capture_as("ORDER#"))
432
                        .addRule(stmt.switch_token()
433
                                .addCase("ASC", stmt.set_expression("ORDER_MODE#", true))
434
                                .addCase("DESC", stmt.set_expression("ORDER_MODE#", false))
435
                                .addDefault(stmt.set_expression("ORDER_MODE#", true))
436
                        )
437
                        .addRule(stmt.optional_any_token("NULLS") //FIXME: add to SelectArgsBuilder to process this parameter
438
                                .addRuleOnTrue(stmt.require_any_token("LAST","FIRST").capture_as("NULLS_MODE#"))
439
                        )
440
                        .addRule(stmt.optional_any_token(",")
441
                                .addRuleOnFalse(stmt.break_loop())
442
                        )
443
                )
444
        );
445
        stmt.addRule(stmt.optional_any_token("LIMIT")
446
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
447
        );
448
        stmt.addRule(stmt.if_compatibility_contains(
449
                COMPATIBILITY_SELECT_ID,
450
                COMPATIBILITY_SELECT_OPTIONAL_SEMICOLON_AT_END
451
            )
452
            .addRuleOnTrue(stmt.optional_any_token(";"))
453
        );
454
        stmt.code(
455
                FUNCTION_SELECT,
456
                new SelectArgsBuilder()
457
        );
458

    
459
        return stmt;
460
    }
461

    
462
    private Statement createSelectIntoStatement(Grammar theGrammar) {
463
        Statement stmt;
464
//
465
//      SELECT * INTO varname
466
//          FROM table_name
467
//          WHERE expression
468
//          ORDER BY expression1 ASC|DESC, expression2 ASC|DESC ...
469
//          LIMIT expression
470
//        
471
        theGrammar.addReservedWord("SELECT");
472
        theGrammar.addReservedWord("FROM");
473
        theGrammar.addReservedWord("WHERE");
474
        theGrammar.addReservedWord("ORDER");
475
        theGrammar.addReservedWord("BY");
476
        theGrammar.addReservedWord("DESC");
477
        theGrammar.addReservedWord("ASC");
478
        theGrammar.addReservedWord("LIMIT");
479

    
480
        stmt = theGrammar.createStatement("SELECT");
481
        stmt.addRule(stmt.require_any_token("SELECT"));
482
        stmt.addRule(stmt.require_any_token("*"));
483
        stmt.addRule(stmt.require_any_token("INTO"));
484
        stmt.addRule(stmt.require_identifier().capture_as("INTOVAR"));
485
        stmt.addRule(stmt.require_any_token("FROM"));
486
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
487
        stmt.addRule(stmt.optional_any_token("WHERE")
488
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
489
        );
490

    
491
        stmt.addRule(stmt.optional_any_token("ORDER")
492
                .addRuleOnTrue(stmt.require_any_token("BY"))
493
                .addRuleOnTrue(stmt.repeat()
494
                        .addRule(stmt.require_expression().capture_as("ORDER#"))
495
                        .addRule(stmt.switch_token()
496
                                .addCase("ASC", stmt.set_expression("ORDER_MODE#", true))
497
                                .addCase("DESC", stmt.set_expression("ORDER_MODE#", false))
498
                                .addDefault(stmt.set_expression("ORDER_MODE#", true))
499
                        )
500
                        .addRule(stmt.optional_any_token(",")
501
                                .addRuleOnFalse(stmt.break_loop())
502
                        )
503
                )
504
        );
505
        stmt.addRule(stmt.optional_any_token("LIMIT")
506
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
507
        );
508
        stmt.code(
509
                FUNCTION_SELECT,
510
                new SelectArgsBuilder()
511
        );
512

    
513
        return stmt;
514
    }
515

    
516
    private Statement createSelectFromSelectionStatement(Grammar theGrammar) {
517
        Statement stmt;
518
//
519
//      SELECT * | (column1, column2,...) 
520
//          FROM SELECTION OF table_name
521
//          WHERE expression
522
//        
523
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
524
        CodeBuilder codeBuilder = manager.createCodeBuilder();
525

    
526
        stmt = theGrammar.createStatement("SELECTFROMSELECTION");
527
        stmt.addRule(stmt.require_any_token("SELECT"));
528
        stmt.addRule(stmt.optional_any_token("*","1")
529
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
530
                .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
531
        );
532
        stmt.addRule(stmt.require_any_token("FROM"));
533
        stmt.addRule(stmt.require_any_token("SELECTION"));
534
        stmt.addRule(stmt.optional_any_token("IF")
535
                .addRuleOnTrue(stmt.require_tokens("NOT", "EMPTY").capture_as("IF_NOT_EMPTY"))
536
        );
537
        stmt.addRule(stmt.optional_any_token("OF"));
538
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
539
        stmt.addRule(stmt.optional_any_token("WHERE")
540
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
541
        );
542
        stmt.addRule(stmt.optional_any_token("LIMIT")
543
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
544
        );
545
        stmt.addRule(stmt.optional_any_token(";"));
546
        stmt.code(
547
                FUNCTION_SELECT_FROM_SELECTION,
548
                stmt.args_names("COLUMNS", "TABLE", "WHERE", "LIMIT","IF_NOT_EMPTY")
549
        );
550

    
551
        return stmt;
552
    }
553

    
554
    private Statement createInsertIntoTableSelectStatement(Grammar theGrammar) {
555
        Statement stmt;
556
//
557
//      INSERT INTO target_table_name 
558
//          SELECT
559
//              FROM table_name
560
//              WHERE expression
561
//              ORDER BY expression1 ASC|DESC, expression2 ASC|DESC ...
562
//              LIMIT expression
563
//        
564
//        
565
        theGrammar.addReservedWord("INSERT");
566
        theGrammar.addReservedWord("INTO");
567
        theGrammar.addReservedWord("SELECT");
568
        theGrammar.addReservedWord("FROM");
569
        theGrammar.addReservedWord("WHERE");
570
        theGrammar.addReservedWord("ORDER");
571
        theGrammar.addReservedWord("BY");
572
        theGrammar.addReservedWord("LIMIT");
573

    
574
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
575
        CodeBuilder codeBuilder = manager.createCodeBuilder();
576

    
577
        stmt = theGrammar.createStatement("INSERT_INTO_SELECT");
578
        stmt.addRule(stmt.require_any_token("INSERT"));
579
        stmt.addRule(stmt.require_any_token("INTO"));
580
        stmt.addRule(stmt.require_identifier().capture_as("TARGETTABLE"));
581
        stmt.addRule(stmt.require_any_token("SELECT"));
582
        stmt.addRule(stmt.optional_any_token("*")
583
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
584
                .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
585
        );
586
        stmt.addRule(stmt.require_any_token("FROM"));
587
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
588
        stmt.addRule(stmt.optional_any_token("WHERE")
589
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
590
        );
591

    
592
        stmt.addRule(stmt.optional_any_token("ORDER")
593
                .addRuleOnTrue(stmt.require_any_token("BY"))
594
                .addRuleOnTrue(stmt.repeat()
595
                        .addRule(stmt.require_expression().capture_as("ORDER#"))
596
                        .addRule(stmt.switch_token()
597
                                .addCase("ASC", stmt.set_expression("ORDER_MODE#", true))
598
                                .addCase("DESC", stmt.set_expression("ORDER_MODE#", false))
599
                                .addDefault(stmt.set_expression("ORDER_MODE#", true))
600
                        )
601
                        .addRule(stmt.optional_any_token(",")
602
                                .addRuleOnFalse(stmt.break_loop())
603
                        )
604
                )
605
        );
606
        stmt.addRule(stmt.optional_any_token("LIMIT")
607
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
608
        );
609
        stmt.addRule(stmt.optional_any_token(";"));
610
        stmt.code(
611
                DataManager.FUNCTION_INSERT_INTO_TABLE,
612
                new InsertIntoArgsBuilder()
613
        );
614

    
615
        return stmt;
616
    }
617

    
618
    private Statement createSelectCountStatement(Grammar theGrammar) {
619
        Statement stmt;
620
//
621
//      SELECT COUNT(*) FROM table_name WHERE expression
622
//        
623
        theGrammar.addReservedWord("SELECT");
624
        theGrammar.addReservedWord("FROM");
625
        theGrammar.addReservedWord("WHERE");
626

    
627
        stmt = theGrammar.createStatement("SELECT_COUNT");
628
        stmt.addRule(stmt.require_any_token("SELECT"));
629
        stmt.addRule(stmt.require_any_token("COUNT"));
630
        stmt.addRule(stmt.require_any_token("("));
631
        stmt.addRule(stmt.require_any_token("*"));
632
        stmt.addRule(stmt.require_any_token(")"));
633
        stmt.addRule(stmt.require_any_token("FROM"));
634
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
635
        stmt.addRule(stmt.optional_any_token("WHERE")
636
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
637
        );
638
        stmt.addRule(stmt.optional_any_token(";"));
639
        stmt.code(
640
                FUNCTION_SELECT_COUNT,
641
                new SelectCountArgsBuilder()
642
        );
643
        return stmt;
644
    }
645

    
646
    private Statement createSelectAggregateStatement(Grammar theGrammar) {
647
        Statement stmt;
648
//
649
//      SELECT COUNT(*) FROM table_name WHERE expression
650
//        
651
        theGrammar.addReservedWord("SELECT");
652
        theGrammar.addReservedWord("FROM");
653
        theGrammar.addReservedWord("WHERE");
654

    
655
        stmt = theGrammar.createStatement("SELECT_COUNT");
656
        stmt.addRule(stmt.require_any_token("SELECT"));
657
        stmt.addRule(stmt.require_any_token("COUNT","SUM", "MIN","MAX", "AVG").capture_as("AGGREGATE_FUNCTION"));
658
        stmt.addRule(stmt.require_any_token("("));
659
        stmt.addRule(stmt.require_identifier().capture_as("AGGREGATE_COLUMN"));
660
        stmt.addRule(stmt.require_any_token(")"));
661
        stmt.addRule(stmt.require_any_token("FROM"));
662
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
663
        stmt.addRule(stmt.optional_any_token("WHERE")
664
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
665
        );
666
        stmt.addRule(stmt.optional_any_token(";"));
667
        stmt.code(
668
                FUNCTION_SELECT_AGGREGATE,
669
                new SelectAggregateArgsBuilder()
670
        );
671
        return stmt;
672
    }
673

    
674
    private Statement createSelectCountFromSelectionStatement(Grammar theGrammar) {
675
        Statement stmt;
676
//
677
//      SELECT COUNT(*) FROM SELECTION IF NOT IS EMPTY OF table_name WHERE expression
678
//        
679
        stmt = theGrammar.createStatement("SELECT_COUNT_FROM_SELECTION");
680
        stmt.addRule(stmt.require_any_token("SELECT"));
681
        stmt.addRule(stmt.require_any_token("COUNT"));
682
        stmt.addRule(stmt.require_any_token("("));
683
        stmt.addRule(stmt.require_any_token("*"));
684
        stmt.addRule(stmt.require_any_token(")"));
685
        stmt.addRule(stmt.require_any_token("FROM"));
686
        stmt.addRule(stmt.require_any_token("SELECTION"));
687
        stmt.addRule(stmt.optional_any_token("IF")
688
                .addRuleOnTrue(stmt.require_tokens("NOT", "EMPTY").capture_as("IF_NOT_EMPTY"))
689
        );
690
        stmt.addRule(stmt.require_any_token("OF"));
691
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
692
        stmt.addRule(stmt.optional_any_token("WHERE")
693
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
694
        );
695
        stmt.addRule(stmt.require_any_token(";"));
696
        stmt.code(
697
                FUNCTION_SELECT_COUNT_FROM_SELECTION,
698
                stmt.args_names("TABLE", "WHERE", "IF_NOT_EMPTY")
699
        );
700
        return stmt;
701
    }
702

    
703
    private Statement createCreateTableStatement(Grammar theGrammar) {
704
        Statement stmt;
705
//
706
//      CREATE TABLE 
707
//              ...json_definition...
708
//          IN
709
//             ...target_table_parameters_as_json
710
//        
711
        theGrammar.addReservedWord("CREATE");
712

    
713
        stmt = theGrammar.createStatement("CREATE_TABLE");
714
        stmt.addRule(stmt.require_any_token("CREATE"));
715
        stmt.addRule(stmt.require_any_token("TABLE"));
716
        stmt.addRule(stmt.require_expression().capture_as("STRUCTURE"));
717
        stmt.addRule(stmt.require_any_token("IN"));
718
        stmt.addRule(stmt.require_expression().capture_as("LOCATION"));
719
        stmt.code(
720
                FUNCTION_CREATE_TABLE,
721
                stmt.args_names("STRUCTURE", "LOCATION")
722
        );
723
        return stmt;
724
    }
725

    
726
    private Statement createCreateTableStructureStatement(Grammar theGrammar) {
727
        Statement stmt;
728
//
729
//      CREATE TABLE STRUCTURE
730
//              ...json_definition...
731
//        
732

    
733
        theGrammar.addReservedWord("CREATE");
734

    
735
        stmt = theGrammar.createStatement("CREATE_TABLE_STRUCTURE");
736
        stmt.addRule(stmt.require_any_token("CREATE"));
737
        stmt.addRule(stmt.require_any_token("TABLE"));
738
        stmt.addRule(stmt.require_any_token("STRUCTURE"));
739
        stmt.addRule(stmt.require_expression().capture_as("STRUCTURE"));
740
        stmt.code(
741
                FUNCTION_CREATE_TABLE_STRUCTURE,
742
                stmt.args_names("STRUCTURE")
743
        );
744

    
745
        return stmt;
746
    }
747

    
748
    private Statement createInsertIntoTableStatement(Grammar theGrammar) {
749
        // TODO: terminar de implementar
750
        Statement stmt;
751
//
752
//      INSERT INTO table_name 
753
//              ( column_name1, column_name2,... )
754
//          VALUES
755
//              ( expression1, expression2, ...) | expression_list
756
//
757
        theGrammar.addReservedWord("INSERT");
758
        theGrammar.addReservedWord("INTO");
759
//        theGrammar.addReservedWord("VALUES");
760

    
761
        stmt = theGrammar.createStatement("INSERT_INTO");
762
        stmt.addRule(stmt.require_any_token("INSERT"));
763
        stmt.addRule(stmt.require_any_token("INTO"));
764
        stmt.addRule(stmt.require_identifier().capture_as("TARGETTABLE"));
765
        stmt.addRule(stmt.require_any_token("("));
766
        stmt.addRule(stmt.require_identifiers(",").capture_as("COLUMNS"));
767
        stmt.addRule(stmt.require_any_token(")"));
768
        stmt.addRule(stmt.require_any_token("VALUES"));
769
        stmt.addRule(stmt.optional_any_token("(")
770
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("VALUES"))
771
                .addRuleOnTrue(stmt.require_any_token(")"))
772
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUES"))
773
        );
774
        stmt.addRule(stmt.optional_any_token(";"));
775
//        stmt.code(
776
//                DataManager.FUNCTION_INSERT_INTO,
777
//                stmt.args_names("TARGETTABLE","COLUMNS", "VALUES")
778
//        );
779

    
780
        return stmt;
781
    }
782

    
783
    private Statement createUpdateStatement(Grammar theGrammar) {
784
        Statement stmt;
785
//        
786
//      UPDATE table_name
787
//        SET column1 = expression1, column2 = expression2, ...
788
//        WHERE condition; 
789
//
790
        theGrammar.addReservedWord("UPDATE");
791
        theGrammar.addReservedWord("WHERE");
792

    
793
        stmt = theGrammar.createStatement("UPDATE");
794
        stmt.addRule(stmt.require_any_token("UPDATE"));
795
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
796
        stmt.addRule(stmt.require_any_token("SET"));
797
        stmt.addRule(stmt.repeat_until_any_tokens("WHERE")
798
                .addRule(stmt.require_identifier().capture_as("#COLUMNS"))
799
                .addRule(stmt.require_any_token("="))
800
                .addRule(stmt.require_expression().capture_as("#VALUES"))
801
        );
802
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
803
        stmt.addRule(stmt.optional_any_token(";"));
804
        stmt.code(
805
                DataManager.FUNCTION_UPDATE,
806
                stmt.args_names("TABLE","CONDITION","#COLUMNS", "#VALUES")
807
        );
808

    
809
        return stmt;
810
    }
811

    
812
    private Statement createDeleteFromTableStatement(Grammar theGrammar) {
813
        // TODO: terminar de implementar
814
        Statement stmt;
815
//
816
//      DELETE FROM table_name WHERE condition;
817
//
818
        theGrammar.addReservedWord("DELETE");
819
        theGrammar.addReservedWord("WHERE");
820

    
821
        stmt = theGrammar.createStatement("DELETE");
822
        stmt.addRule(stmt.require_any_token("DELETE"));
823
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
824
        stmt.addRule(stmt.require_any_token("WHERE"));
825
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
826
        stmt.addRule(stmt.optional_any_token(";"));
827
//        stmt.code(
828
//                DataManager.FUNCTION_DELETE,
829
//                stmt.args_names("TABLE","CONDITION")
830
//        );
831

    
832
        return stmt;
833
    }
834
    
835
    public static final void selfRegister() {
836
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
837
        manager.registerGrammar(new DataAccessGrammarFactory());
838
    }
839
}