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

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

    
52
/**
53
 *
54
 * @author jjdelcerro
55
 */
56
public class DataAccessGrammarFactory extends AbstractGrammarFactory {
57

    
58
    private Grammar grammar;
59

    
60
    private static class ExistsStatementBuilder extends DefaultStatement.StatementBuilderBase {
61

    
62
        private final String listID;
63
        private final String existsID;
64

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

    
71
        @Override
72
        public Code build(StatementContext context) {
73

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

    
88
    }
89

    
90
    private static class SelectArgsBuilder implements ArgsBuilder {
91

    
92
        public SelectArgsBuilder() {
93
        }
94

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

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

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

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

    
113
            CodeBuilder codeBuilder = context.getCodeBuilder();
114

    
115
            Code columns = context.getCode("COLUMNS");
116
            args.add(columns);
117

    
118
            Code table = context.getCode("TABLE");
119
            args.add(table);
120

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

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

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

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

    
162
        }
163

    
164
    }
165

    
166
    private static class InsertIntoArgsBuilder
167
            extends SelectArgsBuilder
168
            implements ArgsBuilder {
169

    
170
        public InsertIntoArgsBuilder() {
171
        }
172

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

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

    
182
            CodeBuilder codeBuilder = context.getCodeBuilder();
183
            BaseCodes args = (BaseCodes) codeBuilder.args();
184

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

    
188
            return build(context, args);
189
        }
190

    
191
    }
192

    
193
    private static class SelectCountArgsBuilder implements ArgsBuilder {
194

    
195
        public SelectCountArgsBuilder() {
196
        }
197

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

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

    
209
            Code table = context.getCode("table");
210
            Code where = context.getCode("where");
211

    
212
            args.add(table);
213

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

    
222
    }
223

    
224
    public DataAccessGrammarFactory() {
225
        super(DALFunctions.GRAMMAR_NAME, true);
226
    }
227

    
228
    @Override
229
    public Grammar create(Object... parameters) {
230
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
231
        if (this.grammar == null) {
232
            Grammar theGrammar = manager.createGrammar(this.getName());
233

    
234
            theGrammar.addStatement(createCreateInMemoryTableStatement(theGrammar));
235
            theGrammar.addStatement(createCreateTableStatement(theGrammar));
236
            theGrammar.addStatement(createCreateTableStructureStatement(theGrammar));
237
            theGrammar.addStatement(createExistsStatement(theGrammar));
238
            theGrammar.addStatement(createForeingValueStatement(theGrammar));
239
            theGrammar.addStatement(createInsertIntoTableSelectStatement(theGrammar));
240
            theGrammar.addStatement(createSelectCountStatement(theGrammar));
241
            theGrammar.addStatement(createSelectStatement(theGrammar));
242
//            theGrammar.addStatement(createUpdateStatement(theGrammar));
243
            theGrammar.addStatement(createSelectCountFromSelectionStatement(theGrammar));
244
            theGrammar.addStatement(createSelectFromSelectionStatement(theGrammar));
245

    
246
            this.grammar = theGrammar;
247
        }
248

    
249
        return grammar;
250
    }
251

    
252
    private Statement createExistsStatement(Grammar theGrammar) {
253
//    
254
//      EXISTS( SELECT...)
255
//
256
        Statement stmt;
257

    
258
        theGrammar.addReservedWord("EXISTS");
259

    
260
        stmt = theGrammar.createStatement("EXISTS");
261
        stmt.addRule(stmt.require_any_token("EXISTS"));
262
        stmt.addRule(stmt.require_any_token("("));
263
        stmt.addRule(stmt.require_expression().capture_as("LIST"));
264
        stmt.addRule(stmt.optional_any_token(",")
265
                .addRuleOnTrue(stmt.require_expression().capture_as("ID"))
266
        );
267
        stmt.addRule(stmt.require_any_token(")"));
268
        stmt.builder(new ExistsStatementBuilder("LIST", "ID"));
269

    
270
        return stmt;
271
    }
272

    
273
    private Statement createForeingValueStatement(Grammar theGrammar) {
274
        Statement stmt;
275
//      
276
//      FOREING VALUE FROM table_name.column_name  
277
//        
278
        theGrammar.addReservedWord("FROM");
279

    
280
        stmt = theGrammar.createStatement("FOREING_VALUE");
281
        stmt.addRule(stmt.require_any_token("FOREING"));
282
        stmt.addRule(stmt.require_any_token("VALUE"));
283
        stmt.addRule(stmt.require_any_token("FROM"));
284
        stmt.addRule(stmt.require_identifiers(".").capture_as("IDENTIFIERS"));
285
        stmt.code(
286
                FUNCTION_FOREING_VALUE,
287
                stmt.args_names("IDENTIFIERS")
288
        );
289

    
290
        return stmt;
291
    }
292

    
293
    private Statement createCreateInMemoryTableStatement(Grammar theGrammar) {
294
        Statement stmt;
295
//
296
//      CREATE IN MEMORY TABLE target_table_name FROM source_table_name
297
//        
298
        theGrammar.addReservedWord("FROM");
299

    
300
        stmt = theGrammar.createStatement("CREATE_IN_MEMORY_TABLE");
301
        stmt.addRule(stmt.require_any_token("CREATE"));
302
        stmt.addRule(stmt.require_any_token("IN"));
303
        stmt.addRule(stmt.require_any_token("MEMORY"));
304
        stmt.addRule(stmt.require_any_token("TABLE"));
305
        stmt.addRule(stmt.require_identifier().capture_as("NEWTABLE"));
306
        stmt.addRule(stmt.require_any_token("FROM"));
307
        stmt.addRule(stmt.require_identifier().capture_as("SOURCETABLE"));
308
        stmt.code(
309
                FUNCTION_FOREING_VALUE,
310
                stmt.args_names("NEWTABLE", "SOURCETABLE")
311
        );
312

    
313
        return stmt;
314
    }
315

    
316
    private Statement createSelectStatement(Grammar theGrammar) {
317
        Statement stmt;
318
//
319
//      SELECT * | (column1, column2,...) 
320
//          FROM table_name
321
//          WHERE expression
322
//          ORDER BY expression1 ASC|DESC, expression2 ASC|DESC ...
323
//          LIMIT expression
324
//        
325
        theGrammar.addReservedWord("SELECT");
326
        theGrammar.addReservedWord("FROM");
327
        theGrammar.addReservedWord("WHERE");
328
        theGrammar.addReservedWord("ORDER");
329
        theGrammar.addReservedWord("BY");
330
        theGrammar.addReservedWord("DESC");
331
        theGrammar.addReservedWord("ASC");
332
        theGrammar.addReservedWord("LIMIT");
333

    
334
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
335
        CodeBuilder codeBuilder = manager.createCodeBuilder();
336

    
337
        stmt = theGrammar.createStatement("SELECT");
338
        stmt.addRule(stmt.require_any_token("SELECT"));
339
        stmt.addRule(stmt.optional_any_token("*")
340
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
341
                .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
342
        );
343
        stmt.addRule(stmt.require_any_token("FROM"));
344
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
345
        stmt.addRule(stmt.optional_any_token("WHERE")
346
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
347
        );
348

    
349
        stmt.addRule(stmt.optional_any_token("ORDER")
350
                .addRuleOnTrue(stmt.require_any_token("BY"))
351
                .addRuleOnTrue(stmt.repeat()
352
                        .addRule(stmt.require_expression().capture_as("ORDER#"))
353
                        .addRule(stmt.switch_token()
354
                                .addCase("ASC", stmt.set_expression("ORDER_MODE#", true))
355
                                .addCase("DESC", stmt.set_expression("ORDER_MODE#", false))
356
                                .addDefault(stmt.set_expression("ORDER_MODE#", true))
357
                        )
358
                        .addRule(stmt.optional_any_token(",")
359
                                .addRuleOnFalse(stmt.break_loop())
360
                        )
361
                )
362
        );
363
        stmt.addRule(stmt.optional_any_token("LIMIT")
364
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
365
        );
366
        stmt.addRule(stmt.optional_any_token(";"));
367
        stmt.code(
368
                FUNCTION_SELECT,
369
                new SelectArgsBuilder()
370
        );
371

    
372
        return stmt;
373
    }
374

    
375
    private Statement createSelectFromSelectionStatement(Grammar theGrammar) {
376
        Statement stmt;
377
//
378
//      SELECT * | (column1, column2,...) 
379
//          FROM SELECTION OF table_name
380
//          WHERE expression
381
//        
382
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
383
        CodeBuilder codeBuilder = manager.createCodeBuilder();
384

    
385
        stmt = theGrammar.createStatement("SELECTFROMSELECTION");
386
        stmt.addRule(stmt.require_any_token("SELECT"));
387
        stmt.addRule(stmt.optional_any_token("*")
388
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
389
                .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
390
        );
391
        stmt.addRule(stmt.require_any_token("FROM"));
392
        stmt.addRule(stmt.require_any_token("SELECTION"));
393
        stmt.addRule(stmt.optional_any_token("IF")
394
                .addRuleOnTrue(stmt.require_tokens("NOT", "EMPTY").capture_as("IF_NOT_EMPTY"))
395
        );
396
        stmt.addRule(stmt.optional_any_token("OF"));
397
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
398
        stmt.addRule(stmt.optional_any_token("WHERE")
399
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
400
        );
401
        stmt.addRule(stmt.optional_any_token("LIMIT")
402
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
403
        );
404
        stmt.addRule(stmt.optional_any_token(";"));
405
        stmt.code(
406
                FUNCTION_SELECT_FROM_SELECTION,
407
                stmt.args_names("COLUMNS", "TABLE", "WHERE", "LIMIT","IF_NOT_EMPTY")
408
        );
409

    
410
        return stmt;
411
    }
412

    
413
    private Statement createInsertIntoTableSelectStatement(Grammar theGrammar) {
414
        Statement stmt;
415
//
416
//      INSERT INTO target_table_name 
417
//          SELECT
418
//              FROM table_name
419
//              WHERE expression
420
//              ORDER BY expression1 ASC|DESC, expression2 ASC|DESC ...
421
//              LIMIT expression
422
//        
423
//        
424
        theGrammar.addReservedWord("INSERT");
425
        theGrammar.addReservedWord("INTO");
426
        theGrammar.addReservedWord("SELECT");
427
        theGrammar.addReservedWord("FROM");
428
        theGrammar.addReservedWord("WHERE");
429
        theGrammar.addReservedWord("ORDER");
430
        theGrammar.addReservedWord("BY");
431
        theGrammar.addReservedWord("LIMIT");
432

    
433
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
434
        CodeBuilder codeBuilder = manager.createCodeBuilder();
435

    
436
        stmt = theGrammar.createStatement("INSERT_INTO_SELECT");
437
        stmt.addRule(stmt.require_any_token("INSERT"));
438
        stmt.addRule(stmt.require_any_token("INTO"));
439
        stmt.addRule(stmt.require_identifier().capture_as("TARGETTABLE"));
440
        stmt.addRule(stmt.require_any_token("SELECT"));
441
        stmt.addRule(stmt.optional_any_token("*")
442
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
443
                .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
444
        );
445
        stmt.addRule(stmt.require_any_token("FROM"));
446
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
447
        stmt.addRule(stmt.optional_any_token("WHERE")
448
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
449
        );
450

    
451
        stmt.addRule(stmt.optional_any_token("ORDER")
452
                .addRuleOnTrue(stmt.require_any_token("BY"))
453
                .addRuleOnTrue(stmt.repeat()
454
                        .addRule(stmt.require_expression().capture_as("ORDER#"))
455
                        .addRule(stmt.switch_token()
456
                                .addCase("ASC", stmt.set_expression("ORDER_MODE#", true))
457
                                .addCase("DESC", stmt.set_expression("ORDER_MODE#", false))
458
                                .addDefault(stmt.set_expression("ORDER_MODE#", true))
459
                        )
460
                        .addRule(stmt.optional_any_token(",")
461
                                .addRuleOnFalse(stmt.break_loop())
462
                        )
463
                )
464
        );
465
        stmt.addRule(stmt.optional_any_token("LIMIT")
466
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
467
        );
468
        stmt.addRule(stmt.optional_any_token(";"));
469
        stmt.code(
470
                DataManager.FUNCTION_INSERT_INTO_TABLE,
471
                new InsertIntoArgsBuilder()
472
        );
473

    
474
        return stmt;
475
    }
476

    
477
    private Statement createSelectCountStatement(Grammar theGrammar) {
478
        Statement stmt;
479
//
480
//      SELECT COUNT(*) FROM table_name WHERE expression
481
//        
482
        theGrammar.addReservedWord("SELECT");
483
        theGrammar.addReservedWord("FROM");
484
        theGrammar.addReservedWord("WHERE");
485

    
486
        stmt = theGrammar.createStatement("SELECT_COUNT");
487
        stmt.addRule(stmt.require_any_token("SELECT"));
488
        stmt.addRule(stmt.require_any_token("COUNT"));
489
        stmt.addRule(stmt.require_any_token("("));
490
        stmt.addRule(stmt.require_any_token("*"));
491
        stmt.addRule(stmt.require_any_token(")"));
492
        stmt.addRule(stmt.require_any_token("FROM"));
493
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
494
        stmt.addRule(stmt.optional_any_token("WHERE")
495
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
496
        );
497
        stmt.addRule(stmt.require_any_token(";"));
498
        stmt.code(
499
                FUNCTION_SELECT_COUNT,
500
                new SelectCountArgsBuilder()
501
        );
502
        return stmt;
503
    }
504

    
505
    private Statement createSelectCountFromSelectionStatement(Grammar theGrammar) {
506
        Statement stmt;
507
//
508
//      SELECT COUNT(*) FROM SELECTION IF NOT IS EMPTY OF table_name WHERE expression
509
//        
510
        stmt = theGrammar.createStatement("SELECT_COUNT_FROM_SELECTION");
511
        stmt.addRule(stmt.require_any_token("SELECT"));
512
        stmt.addRule(stmt.require_any_token("COUNT"));
513
        stmt.addRule(stmt.require_any_token("("));
514
        stmt.addRule(stmt.require_any_token("*"));
515
        stmt.addRule(stmt.require_any_token(")"));
516
        stmt.addRule(stmt.require_any_token("FROM"));
517
        stmt.addRule(stmt.require_any_token("SELECTION"));
518
        stmt.addRule(stmt.optional_any_token("IF")
519
                .addRuleOnTrue(stmt.require_tokens("NOT", "EMPTY").capture_as("IF_NOT_EMPTY"))
520
        );
521
        stmt.addRule(stmt.require_any_token("OF"));
522
        stmt.addRule(stmt.require_expression().capture_as("TABLE"));
523
        stmt.addRule(stmt.optional_any_token("WHERE")
524
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
525
        );
526
        stmt.addRule(stmt.require_any_token(";"));
527
        stmt.code(
528
                FUNCTION_SELECT_COUNT_FROM_SELECTION,
529
                stmt.args_names("TABLE", "WHERE", "IF_NOT_EMPTY")
530
        );
531
        return stmt;
532
    }
533

    
534
    private Statement createCreateTableStatement(Grammar theGrammar) {
535
        Statement stmt;
536
//
537
//      CREATE TABLE 
538
//              ...json_definition...
539
//          IN
540
//             ...target_table_parameters_as_json
541
//        
542
        theGrammar.addReservedWord("CREATE");
543

    
544
        stmt = theGrammar.createStatement("CREATE_TABLE");
545
        stmt.addRule(stmt.require_any_token("CREATE"));
546
        stmt.addRule(stmt.require_any_token("TABLE"));
547
        stmt.addRule(stmt.require_expression().capture_as("STRUCTURE"));
548
        stmt.addRule(stmt.require_any_token("IN"));
549
        stmt.addRule(stmt.require_expression().capture_as("LOCATION"));
550
        stmt.code(
551
                FUNCTION_CREATE_TABLE,
552
                stmt.args_names("STRUCTURE", "LOCATION")
553
        );
554
        return stmt;
555
    }
556

    
557
    private Statement createCreateTableStructureStatement(Grammar theGrammar) {
558
        Statement stmt;
559
//
560
//      CREATE TABLE STRUCTURE
561
//              ...json_definition...
562
//        
563

    
564
        theGrammar.addReservedWord("CREATE");
565

    
566
        stmt = theGrammar.createStatement("CREATE_TABLE_STRUCTURE");
567
        stmt.addRule(stmt.require_any_token("CREATE"));
568
        stmt.addRule(stmt.require_any_token("TABLE"));
569
        stmt.addRule(stmt.require_any_token("STRUCTURE"));
570
        stmt.addRule(stmt.require_expression().capture_as("STRUCTURE"));
571
        stmt.code(
572
                FUNCTION_CREATE_TABLE_STRUCTURE,
573
                stmt.args_names("STRUCTURE")
574
        );
575

    
576
        return stmt;
577
    }
578

    
579
    private Statement createInsertIntoTableStatement(Grammar theGrammar) {
580
        // TODO: terminar de implementar
581
        Statement stmt;
582
//
583
//      INSERT INTO table_name 
584
//              ( column_name1, column_name2,... )
585
//          VALUES
586
//              ( expression1, expression2, ...) | expression_list
587
//
588
        theGrammar.addReservedWord("INSERT");
589
        theGrammar.addReservedWord("INTO");
590
//        theGrammar.addReservedWord("VALUES");
591

    
592
        stmt = theGrammar.createStatement("INSERT_INTO");
593
        stmt.addRule(stmt.require_any_token("INSERT"));
594
        stmt.addRule(stmt.require_any_token("INTO"));
595
        stmt.addRule(stmt.require_identifier().capture_as("TARGETTABLE"));
596
        stmt.addRule(stmt.require_any_token("("));
597
        stmt.addRule(stmt.require_identifiers(",").capture_as("COLUMNS"));
598
        stmt.addRule(stmt.require_any_token(")"));
599
        stmt.addRule(stmt.require_any_token("VALUES"));
600
        stmt.addRule(stmt.optional_any_token("(")
601
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("VALUES"))
602
                .addRuleOnTrue(stmt.require_any_token(")"))
603
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUES"))
604
        );
605
        stmt.addRule(stmt.optional_any_token(";"));
606
//        stmt.code(
607
//                DataManager.FUNCTION_INSERT_INTO,
608
//                stmt.args_names("TARGETTABLE","COLUMNS", "VALUES")
609
//        );
610

    
611
        return stmt;
612
    }
613

    
614
    private Statement createUpdateStatement(Grammar theGrammar) {
615
        Statement stmt;
616
//        
617
//      UPDATE table_name
618
//        SET column1 = expression1, column2 = expression2, ...
619
//        WHERE condition; 
620
//
621
        theGrammar.addReservedWord("UPDATE");
622
        theGrammar.addReservedWord("WHERE");
623

    
624
        stmt = theGrammar.createStatement("UPDATE");
625
        stmt.addRule(stmt.require_any_token("UPDATE"));
626
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
627
        stmt.addRule(stmt.require_any_token("SET"));
628
        stmt.addRule(stmt.repeat_until_any_tokens("WHERE")
629
                .addRule(stmt.require_identifier().capture_as("#COLUMNS"))
630
                .addRule(stmt.require_any_token("="))
631
                .addRule(stmt.require_expression().capture_as("#VALUES"))
632
        );
633
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
634
        stmt.addRule(stmt.optional_any_token(";"));
635
        stmt.code(
636
                DataManager.FUNCTION_UPDATE,
637
                stmt.args_names("TABLE","CONDITION","#COLUMNS", "#VALUES")
638
        );
639

    
640
        return stmt;
641
    }
642

    
643
    private Statement createDeleteFromTableStatement(Grammar theGrammar) {
644
        // TODO: terminar de implementar
645
        Statement stmt;
646
//
647
//      DELETE FROM table_name WHERE condition;
648
//
649
        theGrammar.addReservedWord("DELETE");
650
        theGrammar.addReservedWord("WHERE");
651

    
652
        stmt = theGrammar.createStatement("DELETE");
653
        stmt.addRule(stmt.require_any_token("DELETE"));
654
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
655
        stmt.addRule(stmt.require_any_token("WHERE"));
656
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
657
        stmt.addRule(stmt.optional_any_token(";"));
658
//        stmt.code(
659
//                DataManager.FUNCTION_DELETE,
660
//                stmt.args_names("TABLE","CONDITION")
661
//        );
662

    
663
        return stmt;
664
    }
665
    
666
    public static final void selfRegister() {
667
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
668
        manager.registerGrammar(new DataAccessGrammarFactory());
669
    }
670
}