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 @ 47141

History | View | Annotate | Download (31.9 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 static org.gvsig.expressionevaluator.impl.function.dataaccess.SelectAggregateFunction.FUNCTION_SELECT_AGGREGATE;
47
import static org.gvsig.expressionevaluator.impl.function.dataaccess.SelectFunction.MODE_FROM_SELECTION;
48
import static org.gvsig.expressionevaluator.impl.function.dataaccess.SelectFunction.MODE_FROM_SELECTION_IF_NOT_EMPTY;
49
import static org.gvsig.expressionevaluator.impl.function.dataaccess.SelectFunction.MODE_FROM_STORE;
50
import org.gvsig.fmap.dal.DataManager;
51
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CREATE_TABLE;
52
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CREATE_TABLE_STRUCTURE;
53
import static org.gvsig.fmap.dal.DataManager.FUNCTION_FOREIGN_VALUE;
54
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_COUNT_FROM_SELECTION;
55
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_FROM_SELECTION;
56

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

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

    
69
    private static class ExistsStatementBuilder extends DefaultStatement.StatementBuilderBase {
70

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

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

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

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

    
97
    }
98

    
99
    private static class SelectArgsBuilder implements ArgsBuilder {
100

    
101
        public SelectArgsBuilder() {
102
        }
103

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

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

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

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

    
122
            CodeBuilder codeBuilder = context.getCodeBuilder();
123

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

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

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

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

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

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

    
197
    }
198

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

    
203
        public InsertIntoArgsBuilder() {
204
        }
205

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

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

    
215
            CodeBuilder codeBuilder = context.getCodeBuilder();
216
            BaseCodes args = (BaseCodes) codeBuilder.args();
217

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

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

    
224
    }
225

    
226
    private static class SelectCountArgsBuilder implements ArgsBuilder {
227

    
228
        public SelectCountArgsBuilder() {
229
        }
230

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

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

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

    
245
            args.add(table);
246

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

    
255
    }
256
    private static class SelectAggregateArgsBuilder implements ArgsBuilder {
257

    
258
        public SelectAggregateArgsBuilder() {
259
        }
260

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

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

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

    
277
            args.add(table);
278

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

    
289
    }
290

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

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

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

    
315
            this.grammar = theGrammar;
316
        }
317

    
318
        return grammar;
319
    }
320

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

    
327
        theGrammar.addReservedWord("EXISTS");
328

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

    
339
        return stmt;
340
    }
341

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

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

    
359
        return stmt;
360
    }
361

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

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

    
382
        return stmt;
383
    }
384

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

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

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

    
427
        stmt.addRule(stmt.optional_any_token("ORDER")
428
                .addRuleOnTrue(stmt.require_any_token("BY"))
429
                .addRuleOnTrue(stmt.repeat()
430
                        .addRule(stmt.require_expression().capture_as("ORDER#"))
431
                        .addRule(stmt.switch_token()
432
                                .addCase("ASC", stmt.set_expression("ORDER_MODE#", true))
433
                                .addCase("DESC", stmt.set_expression("ORDER_MODE#", false))
434
                                .addDefault(stmt.set_expression("ORDER_MODE#", true))
435
                        )
436
                        .addRule(stmt.optional_any_token(",")
437
                                .addRuleOnFalse(stmt.break_loop())
438
                        )
439
                )
440
        );
441
        stmt.addRule(stmt.optional_any_token("LIMIT")
442
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
443
        );
444
        stmt.addRule(stmt.if_compatibility_contains(
445
                COMPATIBILITY_SELECT_ID,
446
                COMPATIBILITY_SELECT_OPTIONAL_SEMICOLON_AT_END
447
            )
448
            .addRuleOnTrue(stmt.optional_any_token(";"))
449
        );
450
        stmt.code(
451
                FUNCTION_SELECT,
452
                new SelectArgsBuilder()
453
        );
454

    
455
        return stmt;
456
    }
457

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

    
476
        stmt = theGrammar.createStatement("SELECT");
477
        stmt.addRule(stmt.require_any_token("SELECT"));
478
        stmt.addRule(stmt.require_any_token("*"));
479
        stmt.addRule(stmt.require_any_token("INTO"));
480
        stmt.addRule(stmt.require_identifier().capture_as("INTOVAR"));
481
        stmt.addRule(stmt.require_any_token("FROM"));
482
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
483
        stmt.addRule(stmt.optional_any_token("WHERE")
484
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
485
        );
486

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

    
509
        return stmt;
510
    }
511

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

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

    
547
        return stmt;
548
    }
549

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

    
570
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
571
        CodeBuilder codeBuilder = manager.createCodeBuilder();
572

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

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

    
611
        return stmt;
612
    }
613

    
614
    private Statement createSelectCountStatement(Grammar theGrammar) {
615
        Statement stmt;
616
//
617
//      SELECT COUNT(*) FROM table_name WHERE expression
618
//        
619
        theGrammar.addReservedWord("SELECT");
620
        theGrammar.addReservedWord("FROM");
621
        theGrammar.addReservedWord("WHERE");
622

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

    
642
    private Statement createSelectAggregateStatement(Grammar theGrammar) {
643
        Statement stmt;
644
//
645
//      SELECT COUNT(*) FROM table_name WHERE expression
646
//        
647
        theGrammar.addReservedWord("SELECT");
648
        theGrammar.addReservedWord("FROM");
649
        theGrammar.addReservedWord("WHERE");
650

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

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

    
699
    private Statement createCreateTableStatement(Grammar theGrammar) {
700
        Statement stmt;
701
//
702
//      CREATE TABLE 
703
//              ...json_definition...
704
//          IN
705
//             ...target_table_parameters_as_json
706
//        
707
        theGrammar.addReservedWord("CREATE");
708

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

    
722
    private Statement createCreateTableStructureStatement(Grammar theGrammar) {
723
        Statement stmt;
724
//
725
//      CREATE TABLE STRUCTURE
726
//              ...json_definition...
727
//        
728

    
729
        theGrammar.addReservedWord("CREATE");
730

    
731
        stmt = theGrammar.createStatement("CREATE_TABLE_STRUCTURE");
732
        stmt.addRule(stmt.require_any_token("CREATE"));
733
        stmt.addRule(stmt.require_any_token("TABLE"));
734
        stmt.addRule(stmt.require_any_token("STRUCTURE"));
735
        stmt.addRule(stmt.require_expression().capture_as("STRUCTURE"));
736
        stmt.code(
737
                FUNCTION_CREATE_TABLE_STRUCTURE,
738
                stmt.args_names("STRUCTURE")
739
        );
740

    
741
        return stmt;
742
    }
743

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

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

    
776
        return stmt;
777
    }
778

    
779
    private Statement createUpdateStatement(Grammar theGrammar) {
780
        Statement stmt;
781
//        
782
//      UPDATE table_name
783
//        SET column1 = expression1, column2 = expression2, ...
784
//        WHERE condition; 
785
//
786
        theGrammar.addReservedWord("UPDATE");
787
        theGrammar.addReservedWord("WHERE");
788

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

    
805
        return stmt;
806
    }
807

    
808
    private Statement createDeleteFromTableStatement(Grammar theGrammar) {
809
        // TODO: terminar de implementar
810
        Statement stmt;
811
//
812
//      DELETE FROM table_name WHERE condition;
813
//
814
        theGrammar.addReservedWord("DELETE");
815
        theGrammar.addReservedWord("WHERE");
816

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

    
828
        return stmt;
829
    }
830
    
831
    public static final void selfRegister() {
832
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
833
        manager.registerGrammar(new DataAccessGrammarFactory());
834
    }
835
}