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

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 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(",")
438
                                .addRuleOnFalse(stmt.break_loop())
439
                        )
440
                )
441
        );
442
        stmt.addRule(stmt.optional_any_token("LIMIT")
443
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
444
        );
445
        stmt.addRule(stmt.if_compatibility_contains(
446
                COMPATIBILITY_SELECT_ID,
447
                COMPATIBILITY_SELECT_OPTIONAL_SEMICOLON_AT_END
448
            )
449
            .addRuleOnTrue(stmt.optional_any_token(";"))
450
        );
451
        stmt.code(
452
                FUNCTION_SELECT,
453
                new SelectArgsBuilder()
454
        );
455

    
456
        return stmt;
457
    }
458

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

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

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

    
510
        return stmt;
511
    }
512

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

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

    
548
        return stmt;
549
    }
550

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

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

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

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

    
612
        return stmt;
613
    }
614

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

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

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

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

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

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

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

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

    
730
        theGrammar.addReservedWord("CREATE");
731

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

    
742
        return stmt;
743
    }
744

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

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

    
777
        return stmt;
778
    }
779

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

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

    
806
        return stmt;
807
    }
808

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

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

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