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

History | View | Annotate | Download (21.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.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

    
50
/**
51
 *
52
 * @author jjdelcerro
53
 */
54
public class DataAccessGrammarFactory extends AbstractGrammarFactory {
55

    
56
    private Grammar grammar;
57

    
58
    private static class ExistsStatementBuilder extends DefaultStatement.StatementBuilderBase {
59

    
60
        private final String listID;
61
        private final String existsID;
62

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

    
69
        @Override
70
        public Code build(StatementContext context) {
71

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

    
86
    }
87

    
88
    private static class SelectArgsBuilder implements ArgsBuilder {
89

    
90
        public SelectArgsBuilder() {
91
        }
92

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

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

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

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

    
111
            CodeBuilder codeBuilder = context.getCodeBuilder();
112

    
113
            Code columns = context.getCode("COLUMNS");
114
            args.add(columns);
115

    
116
            Code table = context.getCode("TABLE");
117
            args.add(codeBuilder.identifier((String) ((Code.Constant) table).value()));
118

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

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

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

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

    
160
        }
161

    
162
    }
163

    
164
    private static class InsertIntoArgsBuilder
165
            extends SelectArgsBuilder
166
            implements ArgsBuilder {
167

    
168
        public InsertIntoArgsBuilder() {
169
        }
170

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

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

    
180
            CodeBuilder codeBuilder = context.getCodeBuilder();
181
            BaseCodes args = (BaseCodes) codeBuilder.args();
182

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

    
186
            return build(context, args);
187
        }
188

    
189
    }
190

    
191
    private static class SelectCountArgsBuilder implements ArgsBuilder {
192

    
193
        public SelectCountArgsBuilder() {
194
        }
195

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

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

    
207
            Code table = context.getCode("table");
208
            Code where = context.getCode("where");
209

    
210
            args.add(codeBuilder.identifier((String) ((Code.Constant) table).value()));
211

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

    
220
    }
221

    
222
    public DataAccessGrammarFactory() {
223
        super(DALFunctions.GRAMMAR_NAME, true);
224
    }
225

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

    
232
            theGrammar.addStatement(createCreateInMemoryTableStatement(theGrammar));
233
            theGrammar.addStatement(createCreateTableStatement(theGrammar));
234
            theGrammar.addStatement(createCreateTableStructureStatement(theGrammar));
235
            theGrammar.addStatement(createExistsStatement(theGrammar));
236
            theGrammar.addStatement(createForeingValueStatement(theGrammar));
237
            theGrammar.addStatement(createInsertIntoTableSelectStatement(theGrammar));
238
            theGrammar.addStatement(createSelectCountStatement(theGrammar));
239
            theGrammar.addStatement(createSelectStatement(theGrammar));
240
//            theGrammar.addStatement(createUpdateStatement(theGrammar));
241

    
242
            this.grammar = theGrammar;
243
        }
244

    
245
        return grammar;
246
    }
247

    
248
    private Statement createExistsStatement(Grammar theGrammar) {
249
//    
250
//      EXISTS( SELECT...)
251
//
252
        Statement stmt;
253

    
254
        theGrammar.addReservedWord("EXISTS");
255

    
256
        stmt = theGrammar.createStatement("EXISTS");
257
        stmt.addRule(stmt.require_any_token("EXISTS"));
258
        stmt.addRule(stmt.require_any_token("("));
259
        stmt.addRule(stmt.require_expression().capture_as("LIST"));
260
        stmt.addRule(stmt.optional_any_token(",")
261
                .addRuleOnTrue(stmt.require_expression().capture_as("ID"))
262
        );
263
        stmt.addRule(stmt.require_any_token(")"));
264
        stmt.builder(new ExistsStatementBuilder("LIST", "ID"));
265

    
266
        return stmt;
267
    }
268

    
269
    private Statement createForeingValueStatement(Grammar theGrammar) {
270
        Statement stmt;
271
//      
272
//      FOREING VALUE FROM table_name.column_name  
273
//        
274
        theGrammar.addReservedWord("FROM");
275

    
276
        stmt = theGrammar.createStatement("FOREING_VALUE");
277
        stmt.addRule(stmt.require_any_token("FOREING"));
278
        stmt.addRule(stmt.require_any_token("VALUE"));
279
        stmt.addRule(stmt.require_any_token("FROM"));
280
        stmt.addRule(stmt.require_identifiers(".").capture_as("IDENTIFIERS"));
281
        stmt.code(
282
                FUNCTION_FOREING_VALUE,
283
                stmt.args_names("IDENTIFIERS")
284
        );
285

    
286
        return stmt;
287
    }
288

    
289
    private Statement createCreateInMemoryTableStatement(Grammar theGrammar) {
290
        Statement stmt;
291
//
292
//      CREATE IN MEMORY TABLE target_table_name FROM source_table_name
293
//        
294
        theGrammar.addReservedWord("FROM");
295

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

    
309
        return stmt;
310
    }
311

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

    
330
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
331
        CodeBuilder codeBuilder = manager.createCodeBuilder();
332

    
333
        stmt = theGrammar.createStatement("SELECT");
334
        stmt.addRule(stmt.require_any_token("SELECT"));
335
        stmt.addRule(stmt.optional_any_token("*")
336
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
337
                .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
338
        );
339
        stmt.addRule(stmt.require_any_token("FROM"));
340
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
341
        stmt.addRule(stmt.optional_any_token("WHERE")
342
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
343
        );
344

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

    
368
        return stmt;
369
    }
370

    
371
    private Statement createInsertIntoTableSelectStatement(Grammar theGrammar) {
372
        Statement stmt;
373
//
374
//      INSERT INTO target_table_name 
375
//          SELECT
376
//              FROM table_name
377
//              WHERE expression
378
//              ORDER BY expression1 ASC|DESC, expression2 ASC|DESC ...
379
//              LIMIT expression
380
//        
381
//        
382
        theGrammar.addReservedWord("INSERT");
383
        theGrammar.addReservedWord("INTO");
384
        theGrammar.addReservedWord("SELECT");
385
        theGrammar.addReservedWord("FROM");
386
        theGrammar.addReservedWord("WHERE");
387
        theGrammar.addReservedWord("ORDER");
388
        theGrammar.addReservedWord("BY");
389
        theGrammar.addReservedWord("LIMIT");
390

    
391
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
392
        CodeBuilder codeBuilder = manager.createCodeBuilder();
393

    
394
        stmt = theGrammar.createStatement("INSERT_INTO_SELECT");
395
        stmt.addRule(stmt.require_any_token("INSERT"));
396
        stmt.addRule(stmt.require_any_token("INTO"));
397
        stmt.addRule(stmt.require_identifier().capture_as("TARGETTABLE"));
398
        stmt.addRule(stmt.require_any_token("SELECT"));
399
        stmt.addRule(stmt.optional_any_token("*")
400
                .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
401
                .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
402
        );
403
        stmt.addRule(stmt.require_any_token("FROM"));
404
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
405
        stmt.addRule(stmt.optional_any_token("WHERE")
406
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
407
        );
408

    
409
        stmt.addRule(stmt.optional_any_token("ORDER")
410
                .addRuleOnTrue(stmt.require_any_token("BY"))
411
                .addRuleOnTrue(stmt.repeat()
412
                        .addRule(stmt.require_expression().capture_as("ORDER#"))
413
                        .addRule(stmt.switch_token()
414
                                .addCase("ASC", stmt.set_expression("ORDER_MODE#", true))
415
                                .addCase("DESC", stmt.set_expression("ORDER_MODE#", false))
416
                                .addDefault(stmt.set_expression("ORDER_MODE#", true))
417
                        )
418
                        .addRule(stmt.optional_any_token(",")
419
                                .addRuleOnFalse(stmt.break_loop())
420
                        )
421
                )
422
        );
423
        stmt.addRule(stmt.optional_any_token("LIMIT")
424
                .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
425
        );
426
        stmt.addRule(stmt.optional_any_token(";"));
427
        stmt.code(
428
                DataManager.FUNCTION_INSERT_INTO_TABLE,
429
                new InsertIntoArgsBuilder()
430
        );
431

    
432
        return stmt;
433
    }
434

    
435
    private Statement createSelectCountStatement(Grammar theGrammar) {
436
        Statement stmt;
437
//
438
//      SELECT COUNT(*) FROM table_name WHERE expression
439
//        
440
        theGrammar.addReservedWord("SELECT");
441
        theGrammar.addReservedWord("FROM");
442
        theGrammar.addReservedWord("WHERE");
443

    
444
        stmt = theGrammar.createStatement("SELECT_COUNT");
445
        stmt.addRule(stmt.require_any_token("SELECT"));
446
        stmt.addRule(stmt.require_any_token("COUNT"));
447
        stmt.addRule(stmt.require_any_token("("));
448
        stmt.addRule(stmt.require_any_token("*"));
449
        stmt.addRule(stmt.require_any_token(")"));
450
        stmt.addRule(stmt.require_any_token("FROM"));
451
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
452
        stmt.addRule(stmt.optional_any_token("WHERE")
453
                .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
454
        );
455
        stmt.addRule(stmt.require_any_token(";"));
456
        stmt.code(
457
                FUNCTION_SELECT_COUNT,
458
                new SelectCountArgsBuilder()
459
        );
460
        return stmt;
461
    }
462

    
463
    private Statement createCreateTableStatement(Grammar theGrammar) {
464
        Statement stmt;
465
//
466
//      CREATE TABLE 
467
//              ...json_definition...
468
//          IN
469
//             ...target_table_parameters_as_json
470
//        
471
        theGrammar.addReservedWord("CREATE");
472

    
473
        stmt = theGrammar.createStatement("CREATE_TABLE");
474
        stmt.addRule(stmt.require_any_token("CREATE"));
475
        stmt.addRule(stmt.require_any_token("TABLE"));
476
        stmt.addRule(stmt.require_expression().capture_as("STRUCTURE"));
477
        stmt.addRule(stmt.require_any_token("IN"));
478
        stmt.addRule(stmt.require_expression().capture_as("LOCATION"));
479
        stmt.code(
480
                FUNCTION_CREATE_TABLE,
481
                stmt.args_names("STRUCTURE", "LOCATION")
482
        );
483
        return stmt;
484
    }
485

    
486
    private Statement createCreateTableStructureStatement(Grammar theGrammar) {
487
        Statement stmt;
488
//
489
//      CREATE TABLE STRUCTURE
490
//              ...json_definition...
491
//        
492

    
493
        theGrammar.addReservedWord("CREATE");
494

    
495
        stmt = theGrammar.createStatement("CREATE_TABLE_STRUCTURE");
496
        stmt.addRule(stmt.require_any_token("CREATE"));
497
        stmt.addRule(stmt.require_any_token("TABLE"));
498
        stmt.addRule(stmt.require_any_token("STRUCTURE"));
499
        stmt.addRule(stmt.require_expression().capture_as("STRUCTURE"));
500
        stmt.code(
501
                FUNCTION_CREATE_TABLE_STRUCTURE,
502
                stmt.args_names("STRUCTURE")
503
        );
504

    
505
        return stmt;
506
    }
507

    
508
    private Statement createInsertIntoTableStatement(Grammar theGrammar) {
509
        // TODO: terminar de implementar
510
        Statement stmt;
511
//
512
//      INSERT INTO table_name 
513
//              ( column_name1, column_name2,... )
514
//          VALUES
515
//              ( expression1, expression2, ...) | expression_list
516
//
517
        theGrammar.addReservedWord("INSERT");
518
        theGrammar.addReservedWord("INTO");
519
//        theGrammar.addReservedWord("VALUES");
520

    
521
        stmt = theGrammar.createStatement("INSERT_INTO");
522
        stmt.addRule(stmt.require_any_token("INSERT"));
523
        stmt.addRule(stmt.require_any_token("INTO"));
524
        stmt.addRule(stmt.require_identifier().capture_as("TARGETTABLE"));
525
        stmt.addRule(stmt.require_any_token("("));
526
        stmt.addRule(stmt.require_identifiers(",").capture_as("COLUMNS"));
527
        stmt.addRule(stmt.require_any_token(")"));
528
        stmt.addRule(stmt.require_any_token("VALUES"));
529
        stmt.addRule(stmt.optional_any_token("(")
530
                .addRuleOnTrue(stmt.require_expressions(",").capture_as("VALUES"))
531
                .addRuleOnTrue(stmt.require_any_token(")"))
532
                .addRuleOnFalse(stmt.require_expression().capture_as("VALUES"))
533
        );
534
        stmt.addRule(stmt.optional_any_token(";"));
535
//        stmt.code(
536
//                DataManager.FUNCTION_INSERT_INTO,
537
//                stmt.args_names("TARGETTABLE","COLUMNS", "VALUES")
538
//        );
539

    
540
        return stmt;
541
    }
542

    
543
    private Statement createUpdateStatement(Grammar theGrammar) {
544
        Statement stmt;
545
//        
546
//      UPDATE table_name
547
//        SET column1 = expression1, column2 = expression2, ...
548
//        WHERE condition; 
549
//
550
        theGrammar.addReservedWord("UPDATE");
551
        theGrammar.addReservedWord("WHERE");
552

    
553
        stmt = theGrammar.createStatement("UPDATE");
554
        stmt.addRule(stmt.require_any_token("UPDATE"));
555
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
556
        stmt.addRule(stmt.require_any_token("SET"));
557
        stmt.addRule(stmt.repeat_until_any_tokens("WHERE")
558
                .addRule(stmt.require_identifier().capture_as("#COLUMNS"))
559
                .addRule(stmt.require_any_token("="))
560
                .addRule(stmt.require_expression().capture_as("#VALUES"))
561
        );
562
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
563
        stmt.addRule(stmt.optional_any_token(";"));
564
        stmt.code(
565
                DataManager.FUNCTION_UPDATE,
566
                stmt.args_names("TABLE","CONDITION","#COLUMNS", "#VALUES")
567
        );
568

    
569
        return stmt;
570
    }
571

    
572
    private Statement createDeleteFromTableStatement(Grammar theGrammar) {
573
        // TODO: terminar de implementar
574
        Statement stmt;
575
//
576
//      DELETE FROM table_name WHERE condition;
577
//
578
        theGrammar.addReservedWord("DELETE");
579
        theGrammar.addReservedWord("WHERE");
580

    
581
        stmt = theGrammar.createStatement("DELETE");
582
        stmt.addRule(stmt.require_any_token("DELETE"));
583
        stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
584
        stmt.addRule(stmt.require_any_token("WHERE"));
585
        stmt.addRule(stmt.require_expression().capture_as("CONDITION"));
586
        stmt.addRule(stmt.optional_any_token(";"));
587
//        stmt.code(
588
//                DataManager.FUNCTION_DELETE,
589
//                stmt.args_names("TABLE","CONDITION")
590
//        );
591

    
592
        return stmt;
593
    }
594
    
595
    public static final void selfRegister() {
596
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
597
        manager.registerGrammar(new DataAccessGrammarFactory());
598
    }
599
}