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

History | View | Annotate | Download (27.5 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 org.gvsig.fmap.dal.DataManager;
48
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CREATE_TABLE;
49
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CREATE_TABLE_STRUCTURE;
50
import static org.gvsig.fmap.dal.DataManager.FUNCTION_FOREIGN_VALUE;
51
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_COUNT_FROM_SELECTION;
52
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_FROM_SELECTION;
53

    
54
/**
55
 *
56
 * @author jjdelcerro
57
 */
58
public class DataAccessGrammarFactory extends AbstractGrammarFactory {
59

    
60
    private Grammar grammar;
61

    
62
    private static class ExistsStatementBuilder extends DefaultStatement.StatementBuilderBase {
63

    
64
        private final String listID;
65
        private final String existsID;
66

    
67
        public ExistsStatementBuilder(String listID, String existsID) {
68
            super(ExistsFunction.NAME, new ArgsBuilderFromNames(listID, existsID));
69
            this.listID = listID;
70
            this.existsID = existsID;
71
        }
72

    
73
        @Override
74
        public Code build(StatementContext context) {
75

    
76
            CodeBuilder codeBuilder = context.getCodeBuilder();
77
            Callable code = (Callable) super.build(context);
78
            BaseCodes args = (BaseCodes) code.parameters();
79
            if (args.size() < 2) {
80
                String exists_id = "EXISTS" + UUID.randomUUID().toString().replaceAll("-", "");
81
                args.add(codeBuilder.constant(exists_id));
82
            } else if (args.get(1) == null) {
83
                String exists_id = "EXISTS" + UUID.randomUUID().toString().replaceAll("-", "");
84
                args.set(1, codeBuilder.constant(exists_id));
85
            }
86
            code = codeBuilder.function(ExistsFunction.NAME, args);
87
            return code;
88
        }
89

    
90
    }
91

    
92
    private static class SelectArgsBuilder implements ArgsBuilder {
93

    
94
        public SelectArgsBuilder() {
95
        }
96

    
97
        @Override
98
        public String toString() {
99
            return "select_args()";
100
        }
101

    
102
        @Override
103
        public Codes build(StatementContext context) {
104
            context.trace(this.toString() + ".build");
105

    
106
            CodeBuilder codeBuilder = context.getCodeBuilder();
107
            BaseCodes args = (BaseCodes) codeBuilder.args();
108
            return build(context, args);
109
        }
110

    
111
        public Codes build(StatementContext context, BaseCodes args) {
112
            int n;
113
            BaseCodes argsX;
114

    
115
            CodeBuilder codeBuilder = context.getCodeBuilder();
116

    
117
            Code columns = context.getCode("COLUMNS");
118
            args.add(columns);
119

    
120
            Code table = context.getCode("TABLE");
121
            args.add(table);
122

    
123
            Code where = context.getCode("WHERE");
124
            if (where == null) {
125
                args.add(codeBuilder.constant(null));
126
            } else {
127
                args.add(where);
128
            }
129

    
130
            n = 1;
131
            argsX = (BaseCodes) codeBuilder.args();
132
            while (true) {
133
                String argNameX = "ORDER" + String.valueOf(n);
134
                Code code = context.getCode(argNameX);
135
                if (code == null) {
136
                    break;
137
                }
138
                argsX.add(code);
139
                n++;
140
            }
141
            args.add(codeBuilder.tuple(argsX));
142

    
143
            n = 1;
144
            argsX = (BaseCodes) codeBuilder.args();
145
            while (true) {
146
                String argNameX = "ORDER_MODE" + String.valueOf(n);
147
                Code code = context.getCode(argNameX);
148
                if (code == null) {
149
                    break;
150
                }
151
                argsX.add(code);
152
                n++;
153
            }
154
            args.add(codeBuilder.tuple(argsX));
155

    
156
            Code limit = context.getCode("LIMIT");
157
            if (limit == null) {
158
                args.add(codeBuilder.constant(null));
159
            } else {
160
                args.add(limit);
161
            }
162
            return args;
163

    
164
        }
165

    
166
    }
167

    
168
    private static class InsertIntoArgsBuilder
169
            extends SelectArgsBuilder
170
            implements ArgsBuilder {
171

    
172
        public InsertIntoArgsBuilder() {
173
        }
174

    
175
        @Override
176
        public String toString() {
177
            return "insert_into_args()";
178
        }
179

    
180
        @Override
181
        public Codes build(StatementContext context) {
182
            context.trace(this.toString() + ".build");
183

    
184
            CodeBuilder codeBuilder = context.getCodeBuilder();
185
            BaseCodes args = (BaseCodes) codeBuilder.args();
186

    
187
            Code table = context.getCode("TARGETTABLE");
188
            args.add(codeBuilder.identifier((String) ((Code.Constant) table).value()));
189

    
190
            return build(context, args);
191
        }
192

    
193
    }
194

    
195
    private static class SelectCountArgsBuilder implements ArgsBuilder {
196

    
197
        public SelectCountArgsBuilder() {
198
        }
199

    
200
        @Override
201
        public String toString() {
202
            return "select_count_args()";
203
        }
204

    
205
        @Override
206
        public Codes build(StatementContext context) {
207
            context.trace(this.toString() + ".build");
208
            CodeBuilder codeBuilder = context.getCodeBuilder();
209
            BaseCodes args = (BaseCodes) codeBuilder.args();
210

    
211
            Code table = context.getCode("table");
212
            Code where = context.getCode("where");
213

    
214
            args.add(table);
215

    
216
            if (where == null) {
217
                args.add(codeBuilder.constant(null));
218
            } else {
219
                args.add(where);
220
            }
221
            return args;
222
        }
223

    
224
    }
225
    private static class SelectAggregateArgsBuilder implements ArgsBuilder {
226

    
227
        public SelectAggregateArgsBuilder() {
228
        }
229

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

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

    
241
            Code table = context.getCode("table");
242
            Code where = context.getCode("where");
243
            Code aggregateFunction = context.getCode("AGGREGATE_FUNCTION");
244
            Code aggregateColumn = context.getCode("AGGREGATE_COLUMN");
245

    
246
            args.add(table);
247

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

    
258
    }
259

    
260
    public DataAccessGrammarFactory() {
261
        super(DALFunctions.GRAMMAR_NAME, true);
262
    }
263

    
264
    @Override
265
    public Grammar create(Object... parameters) {
266
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
267
        if (this.grammar == null) {
268
            Grammar theGrammar = manager.createGrammar(this.getName());
269

    
270
            theGrammar.addStatement(createCreateInMemoryTableStatement(theGrammar));
271
            theGrammar.addStatement(createCreateTableStatement(theGrammar));
272
            theGrammar.addStatement(createCreateTableStructureStatement(theGrammar));
273
            theGrammar.addStatement(createExistsStatement(theGrammar));
274
            theGrammar.addStatement(createForeingValueStatement(theGrammar));
275
            theGrammar.addStatement(createInsertIntoTableSelectStatement(theGrammar));
276
            theGrammar.addStatement(createSelectCountStatement(theGrammar));
277
            theGrammar.addStatement(createSelectAggregateStatement(theGrammar));
278
            theGrammar.addStatement(createSelectStatement(theGrammar));
279
//            theGrammar.addStatement(createUpdateStatement(theGrammar));
280
            theGrammar.addStatement(createSelectCountFromSelectionStatement(theGrammar));
281
            theGrammar.addStatement(createSelectFromSelectionStatement(theGrammar));
282

    
283
            this.grammar = theGrammar;
284
        }
285

    
286
        return grammar;
287
    }
288

    
289
    private Statement createExistsStatement(Grammar theGrammar) {
290
//    
291
//      EXISTS( SELECT...)
292
//
293
        Statement stmt;
294

    
295
        theGrammar.addReservedWord("EXISTS");
296

    
297
        stmt = theGrammar.createStatement("EXISTS");
298
        stmt.addRule(stmt.require_any_token("EXISTS"));
299
        stmt.addRule(stmt.require_any_token("("));
300
        stmt.addRule(stmt.require_expression().capture_as("LIST"));
301
        stmt.addRule(stmt.optional_any_token(",")
302
                .addRuleOnTrue(stmt.require_expression().capture_as("ID"))
303
        );
304
        stmt.addRule(stmt.require_any_token(")"));
305
        stmt.builder(new ExistsStatementBuilder("LIST", "ID"));
306

    
307
        return stmt;
308
    }
309

    
310
    private Statement createForeingValueStatement(Grammar theGrammar) {
311
        Statement stmt;
312
//      
313
//      FOREING VALUE FROM table_name.column_name  
314
//        
315
        theGrammar.addReservedWord("FROM");
316

    
317
        stmt = theGrammar.createStatement(FUNCTION_FOREIGN_VALUE);
318
        stmt.addRule(stmt.require_any_token("FOREING","FOREIGN"));
319
        stmt.addRule(stmt.require_any_token("VALUE"));
320
        stmt.addRule(stmt.require_any_token("FROM"));
321
        stmt.addRule(stmt.require_identifiers_as_string(".").capture_as("IDENTIFIERS"));
322
        stmt.code(
323
                FUNCTION_FOREIGN_VALUE,
324
                stmt.args_names("IDENTIFIERS")
325
        );
326

    
327
        return stmt;
328
    }
329

    
330
    private Statement createCreateInMemoryTableStatement(Grammar theGrammar) {
331
        Statement stmt;
332
//
333
//      CREATE IN MEMORY TABLE target_table_name FROM source_table_name
334
//        
335
        theGrammar.addReservedWord("FROM");
336

    
337
        stmt = theGrammar.createStatement("CREATE_IN_MEMORY_TABLE");
338
        stmt.addRule(stmt.require_any_token("CREATE"));
339
        stmt.addRule(stmt.require_any_token("IN"));
340
        stmt.addRule(stmt.require_any_token("MEMORY"));
341
        stmt.addRule(stmt.require_any_token("TABLE"));
342
        stmt.addRule(stmt.require_identifier().capture_as("NEWTABLE"));
343
        stmt.addRule(stmt.require_any_token("FROM"));
344
        stmt.addRule(stmt.require_identifier().capture_as("SOURCETABLE"));
345
        stmt.code(
346
                FUNCTION_FOREING_VALUE,
347
                stmt.args_names("NEWTABLE", "SOURCETABLE")
348
        );
349

    
350
        return stmt;
351
    }
352

    
353
    private Statement createSelectStatement(Grammar theGrammar) {
354
        Statement stmt;
355
//
356
//      SELECT * | (column1, column2,...) 
357
//          FROM table_name
358
//          WHERE expression
359
//          ORDER BY expression1 ASC|DESC, expression2 ASC|DESC ...
360
//          LIMIT expression
361
//        
362
        theGrammar.addReservedWord("SELECT");
363
        theGrammar.addReservedWord("FROM");
364
        theGrammar.addReservedWord("WHERE");
365
        theGrammar.addReservedWord("ORDER");
366
        theGrammar.addReservedWord("BY");
367
        theGrammar.addReservedWord("DESC");
368
        theGrammar.addReservedWord("ASC");
369
        theGrammar.addReservedWord("LIMIT");
370

    
371
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
372
        CodeBuilder codeBuilder = manager.createCodeBuilder();
373

    
374
        stmt = theGrammar.createStatement("SELECT");
375
        stmt.addRule(stmt.require_any_token("SELECT"));
376
        stmt.addRule(stmt.optional_any_token("*","1")
377
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
378
                .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
379
        );
380
        stmt.addRule(stmt.require_any_token("FROM"));
381
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
382
        stmt.addRule(stmt.optional_any_token("WHERE")
383
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
384
        );
385

    
386
        stmt.addRule(stmt.optional_any_token("ORDER")
387
                .addRuleOnTrue(stmt.require_any_token("BY"))
388
                .addRuleOnTrue(stmt.repeat()
389
                        .addRule(stmt.require_expression().capture_as("ORDER#"))
390
                        .addRule(stmt.switch_token()
391
                                .addCase("ASC", stmt.set_expression("ORDER_MODE#", true))
392
                                .addCase("DESC", stmt.set_expression("ORDER_MODE#", false))
393
                                .addDefault(stmt.set_expression("ORDER_MODE#", true))
394
                        )
395
                        .addRule(stmt.optional_any_token(",")
396
                                .addRuleOnFalse(stmt.break_loop())
397
                        )
398
                )
399
        );
400
        stmt.addRule(stmt.optional_any_token("LIMIT")
401
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
402
        );
403
        stmt.addRule(stmt.optional_any_token(";"));
404
        stmt.code(
405
                FUNCTION_SELECT,
406
                new SelectArgsBuilder()
407
        );
408

    
409
        return stmt;
410
    }
411

    
412
    private Statement createSelectFromSelectionStatement(Grammar theGrammar) {
413
        Statement stmt;
414
//
415
//      SELECT * | (column1, column2,...) 
416
//          FROM SELECTION OF table_name
417
//          WHERE expression
418
//        
419
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
420
        CodeBuilder codeBuilder = manager.createCodeBuilder();
421

    
422
        stmt = theGrammar.createStatement("SELECTFROMSELECTION");
423
        stmt.addRule(stmt.require_any_token("SELECT"));
424
        stmt.addRule(stmt.optional_any_token("*","1")
425
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
426
                .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
427
        );
428
        stmt.addRule(stmt.require_any_token("FROM"));
429
        stmt.addRule(stmt.require_any_token("SELECTION"));
430
        stmt.addRule(stmt.optional_any_token("IF")
431
                .addRuleOnTrue(stmt.require_tokens("NOT", "EMPTY").capture_as("IF_NOT_EMPTY"))
432
        );
433
        stmt.addRule(stmt.optional_any_token("OF"));
434
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
435
        stmt.addRule(stmt.optional_any_token("WHERE")
436
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
437
        );
438
        stmt.addRule(stmt.optional_any_token("LIMIT")
439
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
440
        );
441
        stmt.addRule(stmt.optional_any_token(";"));
442
        stmt.code(
443
                FUNCTION_SELECT_FROM_SELECTION,
444
                stmt.args_names("COLUMNS", "TABLE", "WHERE", "LIMIT","IF_NOT_EMPTY")
445
        );
446

    
447
        return stmt;
448
    }
449

    
450
    private Statement createInsertIntoTableSelectStatement(Grammar theGrammar) {
451
        Statement stmt;
452
//
453
//      INSERT INTO target_table_name 
454
//          SELECT
455
//              FROM table_name
456
//              WHERE expression
457
//              ORDER BY expression1 ASC|DESC, expression2 ASC|DESC ...
458
//              LIMIT expression
459
//        
460
//        
461
        theGrammar.addReservedWord("INSERT");
462
        theGrammar.addReservedWord("INTO");
463
        theGrammar.addReservedWord("SELECT");
464
        theGrammar.addReservedWord("FROM");
465
        theGrammar.addReservedWord("WHERE");
466
        theGrammar.addReservedWord("ORDER");
467
        theGrammar.addReservedWord("BY");
468
        theGrammar.addReservedWord("LIMIT");
469

    
470
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
471
        CodeBuilder codeBuilder = manager.createCodeBuilder();
472

    
473
        stmt = theGrammar.createStatement("INSERT_INTO_SELECT");
474
        stmt.addRule(stmt.require_any_token("INSERT"));
475
        stmt.addRule(stmt.require_any_token("INTO"));
476
        stmt.addRule(stmt.require_identifier().capture_as("TARGETTABLE"));
477
        stmt.addRule(stmt.require_any_token("SELECT"));
478
        stmt.addRule(stmt.optional_any_token("*")
479
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
480
                .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
481
        );
482
        stmt.addRule(stmt.require_any_token("FROM"));
483
        stmt.addRule(stmt.require_identifier().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.addRule(stmt.optional_any_token(";"));
506
        stmt.code(
507
                DataManager.FUNCTION_INSERT_INTO_TABLE,
508
                new InsertIntoArgsBuilder()
509
        );
510

    
511
        return stmt;
512
    }
513

    
514
    private Statement createSelectCountStatement(Grammar theGrammar) {
515
        Statement stmt;
516
//
517
//      SELECT COUNT(*) FROM table_name WHERE expression
518
//        
519
        theGrammar.addReservedWord("SELECT");
520
        theGrammar.addReservedWord("FROM");
521
        theGrammar.addReservedWord("WHERE");
522

    
523
        stmt = theGrammar.createStatement("SELECT_COUNT");
524
        stmt.addRule(stmt.require_any_token("SELECT"));
525
        stmt.addRule(stmt.require_any_token("COUNT"));
526
        stmt.addRule(stmt.require_any_token("("));
527
        stmt.addRule(stmt.require_any_token("*"));
528
        stmt.addRule(stmt.require_any_token(")"));
529
        stmt.addRule(stmt.require_any_token("FROM"));
530
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
531
        stmt.addRule(stmt.optional_any_token("WHERE")
532
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
533
        );
534
        stmt.addRule(stmt.optional_any_token(";"));
535
        stmt.code(
536
                FUNCTION_SELECT_COUNT,
537
                new SelectCountArgsBuilder()
538
        );
539
        return stmt;
540
    }
541

    
542
    private Statement createSelectAggregateStatement(Grammar theGrammar) {
543
        Statement stmt;
544
//
545
//      SELECT COUNT(*) FROM table_name WHERE expression
546
//        
547
        theGrammar.addReservedWord("SELECT");
548
        theGrammar.addReservedWord("FROM");
549
        theGrammar.addReservedWord("WHERE");
550

    
551
        stmt = theGrammar.createStatement("SELECT_COUNT");
552
        stmt.addRule(stmt.require_any_token("SELECT"));
553
        stmt.addRule(stmt.require_any_token("COUNT","SUM", "MIN","MAX", "AVG").capture_as("AGGREGATE_FUNCTION"));
554
        stmt.addRule(stmt.require_any_token("("));
555
        stmt.addRule(stmt.require_identifier().capture_as("AGGREGATE_COLUMN"));
556
        stmt.addRule(stmt.require_any_token(")"));
557
        stmt.addRule(stmt.require_any_token("FROM"));
558
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
559
        stmt.addRule(stmt.optional_any_token("WHERE")
560
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
561
        );
562
        stmt.addRule(stmt.optional_any_token(";"));
563
        stmt.code(
564
                FUNCTION_SELECT_AGGREGATE,
565
                new SelectAggregateArgsBuilder()
566
        );
567
        return stmt;
568
    }
569

    
570
    private Statement createSelectCountFromSelectionStatement(Grammar theGrammar) {
571
        Statement stmt;
572
//
573
//      SELECT COUNT(*) FROM SELECTION IF NOT IS EMPTY OF table_name WHERE expression
574
//        
575
        stmt = theGrammar.createStatement("SELECT_COUNT_FROM_SELECTION");
576
        stmt.addRule(stmt.require_any_token("SELECT"));
577
        stmt.addRule(stmt.require_any_token("COUNT"));
578
        stmt.addRule(stmt.require_any_token("("));
579
        stmt.addRule(stmt.require_any_token("*"));
580
        stmt.addRule(stmt.require_any_token(")"));
581
        stmt.addRule(stmt.require_any_token("FROM"));
582
        stmt.addRule(stmt.require_any_token("SELECTION"));
583
        stmt.addRule(stmt.optional_any_token("IF")
584
                .addRuleOnTrue(stmt.require_tokens("NOT", "EMPTY").capture_as("IF_NOT_EMPTY"))
585
        );
586
        stmt.addRule(stmt.require_any_token("OF"));
587
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
588
        stmt.addRule(stmt.optional_any_token("WHERE")
589
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
590
        );
591
        stmt.addRule(stmt.require_any_token(";"));
592
        stmt.code(
593
                FUNCTION_SELECT_COUNT_FROM_SELECTION,
594
                stmt.args_names("TABLE", "WHERE", "IF_NOT_EMPTY")
595
        );
596
        return stmt;
597
    }
598

    
599
    private Statement createCreateTableStatement(Grammar theGrammar) {
600
        Statement stmt;
601
//
602
//      CREATE TABLE 
603
//              ...json_definition...
604
//          IN
605
//             ...target_table_parameters_as_json
606
//        
607
        theGrammar.addReservedWord("CREATE");
608

    
609
        stmt = theGrammar.createStatement("CREATE_TABLE");
610
        stmt.addRule(stmt.require_any_token("CREATE"));
611
        stmt.addRule(stmt.require_any_token("TABLE"));
612
        stmt.addRule(stmt.require_expression().capture_as("STRUCTURE"));
613
        stmt.addRule(stmt.require_any_token("IN"));
614
        stmt.addRule(stmt.require_expression().capture_as("LOCATION"));
615
        stmt.code(
616
                FUNCTION_CREATE_TABLE,
617
                stmt.args_names("STRUCTURE", "LOCATION")
618
        );
619
        return stmt;
620
    }
621

    
622
    private Statement createCreateTableStructureStatement(Grammar theGrammar) {
623
        Statement stmt;
624
//
625
//      CREATE TABLE STRUCTURE
626
//              ...json_definition...
627
//        
628

    
629
        theGrammar.addReservedWord("CREATE");
630

    
631
        stmt = theGrammar.createStatement("CREATE_TABLE_STRUCTURE");
632
        stmt.addRule(stmt.require_any_token("CREATE"));
633
        stmt.addRule(stmt.require_any_token("TABLE"));
634
        stmt.addRule(stmt.require_any_token("STRUCTURE"));
635
        stmt.addRule(stmt.require_expression().capture_as("STRUCTURE"));
636
        stmt.code(
637
                FUNCTION_CREATE_TABLE_STRUCTURE,
638
                stmt.args_names("STRUCTURE")
639
        );
640

    
641
        return stmt;
642
    }
643

    
644
    private Statement createInsertIntoTableStatement(Grammar theGrammar) {
645
        // TODO: terminar de implementar
646
        Statement stmt;
647
//
648
//      INSERT INTO table_name 
649
//              ( column_name1, column_name2,... )
650
//          VALUES
651
//              ( expression1, expression2, ...) | expression_list
652
//
653
        theGrammar.addReservedWord("INSERT");
654
        theGrammar.addReservedWord("INTO");
655
//        theGrammar.addReservedWord("VALUES");
656

    
657
        stmt = theGrammar.createStatement("INSERT_INTO");
658
        stmt.addRule(stmt.require_any_token("INSERT"));
659
        stmt.addRule(stmt.require_any_token("INTO"));
660
        stmt.addRule(stmt.require_identifier().capture_as("TARGETTABLE"));
661
        stmt.addRule(stmt.require_any_token("("));
662
        stmt.addRule(stmt.require_identifiers(",").capture_as("COLUMNS"));
663
        stmt.addRule(stmt.require_any_token(")"));
664
        stmt.addRule(stmt.require_any_token("VALUES"));
665
        stmt.addRule(stmt.optional_any_token("(")
666
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("VALUES"))
667
                .addRuleOnTrue(stmt.require_any_token(")"))
668
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUES"))
669
        );
670
        stmt.addRule(stmt.optional_any_token(";"));
671
//        stmt.code(
672
//                DataManager.FUNCTION_INSERT_INTO,
673
//                stmt.args_names("TARGETTABLE","COLUMNS", "VALUES")
674
//        );
675

    
676
        return stmt;
677
    }
678

    
679
    private Statement createUpdateStatement(Grammar theGrammar) {
680
        Statement stmt;
681
//        
682
//      UPDATE table_name
683
//        SET column1 = expression1, column2 = expression2, ...
684
//        WHERE condition; 
685
//
686
        theGrammar.addReservedWord("UPDATE");
687
        theGrammar.addReservedWord("WHERE");
688

    
689
        stmt = theGrammar.createStatement("UPDATE");
690
        stmt.addRule(stmt.require_any_token("UPDATE"));
691
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
692
        stmt.addRule(stmt.require_any_token("SET"));
693
        stmt.addRule(stmt.repeat_until_any_tokens("WHERE")
694
                .addRule(stmt.require_identifier().capture_as("#COLUMNS"))
695
                .addRule(stmt.require_any_token("="))
696
                .addRule(stmt.require_expression().capture_as("#VALUES"))
697
        );
698
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
699
        stmt.addRule(stmt.optional_any_token(";"));
700
        stmt.code(
701
                DataManager.FUNCTION_UPDATE,
702
                stmt.args_names("TABLE","CONDITION","#COLUMNS", "#VALUES")
703
        );
704

    
705
        return stmt;
706
    }
707

    
708
    private Statement createDeleteFromTableStatement(Grammar theGrammar) {
709
        // TODO: terminar de implementar
710
        Statement stmt;
711
//
712
//      DELETE FROM table_name WHERE condition;
713
//
714
        theGrammar.addReservedWord("DELETE");
715
        theGrammar.addReservedWord("WHERE");
716

    
717
        stmt = theGrammar.createStatement("DELETE");
718
        stmt.addRule(stmt.require_any_token("DELETE"));
719
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
720
        stmt.addRule(stmt.require_any_token("WHERE"));
721
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
722
        stmt.addRule(stmt.optional_any_token(";"));
723
//        stmt.code(
724
//                DataManager.FUNCTION_DELETE,
725
//                stmt.args_names("TABLE","CONDITION")
726
//        );
727

    
728
        return stmt;
729
    }
730
    
731
    public static final void selfRegister() {
732
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
733
        manager.registerGrammar(new DataAccessGrammarFactory());
734
    }
735
}