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

History | View | Annotate | Download (21.8 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(table);
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(table);
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_expression().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

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

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

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

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

    
433
        return stmt;
434
    }
435

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

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

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

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

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

    
494
        theGrammar.addReservedWord("CREATE");
495

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

    
506
        return stmt;
507
    }
508

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

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

    
541
        return stmt;
542
    }
543

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

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

    
570
        return stmt;
571
    }
572

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

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

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