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

History | View | Annotate | Download (6.87 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.Code.Caller;
29
import org.gvsig.expressionevaluator.CodeBuilder;
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.StatementContext;
35
import org.gvsig.expressionevaluator.impl.DALFunctions;
36
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseCodes;
37
import org.gvsig.expressionevaluator.impl.DefaultStatement;
38
import org.gvsig.expressionevaluator.impl.DefaultStatement.ArgsBuilderFromNames;
39
import org.gvsig.expressionevaluator.impl.function.dataaccess.ExistsFunction;
40
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory;
41

    
42
/**
43
 *
44
 * @author jjdelcerro
45
 */
46
public class DataAccessGrammarFactory extends AbstractGrammarFactory {
47

    
48
    private Grammar grammar;
49

    
50
    private class ExistsStatementBuilder extends DefaultStatement.StatementBuilderBase {
51

    
52
        private final String ListID;
53

    
54
        public ExistsStatementBuilder(String ListID) {
55
            super(ExistsFunction.NAME, new ArgsBuilderFromNames(ListID));
56
            this.ListID = ListID;
57
        }
58

    
59
        @Override
60
        public Code build(StatementContext context) {
61
            UUID x = UUID.randomUUID();
62
            String exists_id = x.toString().replaceAll("-", "");
63

    
64
            CodeBuilder codeBuilder = context.getCodeBuilder();
65
            Caller code = (Caller) super.build(context);
66
            BaseCodes args = (BaseCodes) code.parameters();
67
            args.add("EXISTS_ID", codeBuilder.constant(exists_id));
68
            code = codeBuilder.function(ExistsFunction.NAME, args);
69
            return code;
70
        }
71
        
72
    }
73
    public DataAccessGrammarFactory() {
74
        super(DALFunctions.GRAMMAR_NAME, true);
75
    }
76
    
77
    @Override
78
    public Grammar create(Object... parameters) {
79
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
80
        if( this.grammar==null ) {
81
            Grammar theGrammar = manager.createGrammar(this.getName());
82
            Statement stmt;
83
        
84
            theGrammar.addReservedWord("EXISTS");
85
            theGrammar.addReservedWord("SELECT");
86
            theGrammar.addReservedWord("FROM");
87
            theGrammar.addReservedWord("WHERE");
88
            theGrammar.addReservedWord("ORDER");
89
            theGrammar.addReservedWord("DESC");
90
            theGrammar.addReservedWord("ASC");
91
            theGrammar.addReservedWord("BY");
92
            
93
            stmt = theGrammar.createStatement("EXISTS");
94
            stmt.addRule(stmt.require_any_token("EXISTS"));
95
            stmt.addRule(stmt.require_expression("LIST"));
96
            stmt.builder(new ExistsStatementBuilder("LIST"));
97
            theGrammar.addStatement(stmt);
98

    
99

    
100
            stmt = theGrammar.createStatement("SELECT");
101
            stmt.addRule(stmt.require_any_token("SELECT"));
102
            stmt.addRule(stmt.require_any_token("*","1"));
103
            stmt.addRule(stmt.require_any_token("FROM"));
104
            stmt.addRule(stmt.require_identifier("TABLE"));
105
            stmt.addRule(stmt.optional_any_token("WHERE")
106
                    .addRuleOnTrue(stmt.require_expression("WHERE"))
107
            );
108
            
109
            stmt.addRule(stmt.optional_any_token("ORDER")
110
                    .addRuleOnTrue(stmt.require_any_token("BY"))
111
                    .addRuleOnTrue(
112
                      stmt.repeat()
113
                          .addRule(stmt.require_expression("ORDER#"))
114
                          .addRule(stmt.switch_token()
115
                                  .addCase("ASC", 
116
                                          stmt.set_expression("ORDER_MODE#", true)
117
                                  )
118
                                  .addCase("DESC", 
119
                                          stmt.set_expression("ORDER_MODE#", false)
120
                                  )
121
                                  .addDefault(
122
                                          stmt.set_expression("ORDER_MODE#", true)
123
                                  )
124
                          )
125
                          .addRule(
126
                              stmt.optional_any_token(",")
127
                                  .addRuleOnFalse(stmt.break_loop())
128
                          )
129
                    )
130
            );    
131
            stmt.addRule(stmt.optional_any_token("LIMIT")
132
                    .addRuleOnTrue(stmt.require_expression("LIMIT"))
133
            );
134
            stmt.addRule(stmt.require_any_token(";"));
135
            stmt.code(
136
                    DALFunctions.FUNCTION_SELECT,
137
                    stmt.args_names("TABLE","WHERE","ORDER#","ORDER_MODE#","LIMIT")
138
            ); 
139
            theGrammar.addStatement(stmt);
140

    
141
            stmt = theGrammar.createStatement("SELECT_COUNT");
142
            stmt.addRule(stmt.require_any_token("SELECT"));
143
            stmt.addRule(stmt.require_any_token("COUNT"));
144
            stmt.addRule(stmt.require_any_token("("));
145
            stmt.addRule(stmt.require_any_token("*"));
146
            stmt.addRule(stmt.require_any_token(")"));
147
            stmt.addRule(stmt.require_any_token("FROM"));
148
            stmt.addRule(stmt.require_identifier("TABLE"));
149
            stmt.addRule(stmt.optional_any_token("WHERE")
150
                    .addRuleOnTrue(stmt.require_expression("WHERE"))
151
            );
152
            stmt.addRule(stmt.require_any_token(";"));
153
            stmt.code(
154
                    DALFunctions.FUNCTION_SELECT_COUNT,
155
                    stmt.args_names("TABLE","WHERE")
156
            ); 
157
            theGrammar.addStatement(stmt);
158

    
159
            this.grammar = theGrammar;
160
        }
161
        return grammar;
162
    }
163
 
164
    public static final void selfRegister() {
165
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
166
        manager.registerGrammar(new DataAccessGrammarFactory());
167
    }
168
}