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

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

    
47
/**
48
 *
49
 * @author jjdelcerro
50
 */
51
public class DataAccessGrammarFactory extends AbstractGrammarFactory {
52

    
53
  private Grammar grammar;
54

    
55
  private static class ExistsStatementBuilder extends DefaultStatement.StatementBuilderBase {
56

    
57
    private final String listID;
58
    private final String existsID;
59

    
60
    public ExistsStatementBuilder(String listID, String existsID) {
61
      super(ExistsFunction.NAME, new ArgsBuilderFromNames(listID, existsID));
62
      this.listID = listID;
63
      this.existsID = existsID;
64
    }
65

    
66
    @Override
67
    public Code build(StatementContext context) {
68

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

    
83
  }
84

    
85
  private static class SelectArgsBuilder implements ArgsBuilder {
86

    
87
    public SelectArgsBuilder() {
88
    }
89

    
90
    @Override
91
    public String toString() {
92
      return "select_args()";
93
    }
94

    
95
    @Override
96
    public Codes build(StatementContext context) {
97
      context.trace(this.toString() + ".build");
98
      int n;
99
      BaseCodes argsX;
100
      
101
      CodeBuilder codeBuilder = context.getCodeBuilder();
102
      BaseCodes args = (BaseCodes) codeBuilder.args();
103

    
104
      Code columns = context.getCode("COLUMNS");
105
      args.add(columns);
106
      
107
      Code table = context.getCode("TABLE");
108
      args.add(codeBuilder.identifier((String) ((Code.Constant) table).value()));
109

    
110
      Code where = context.getCode("WHERE");
111
      if (where == null) {
112
        args.add(codeBuilder.constant(null));
113
      } else {
114
        args.add(where);
115
      }
116

    
117
      n = 1;
118
      argsX = (BaseCodes) codeBuilder.args();
119
      while (true) {
120
        String argNameX = "ORDER" + String.valueOf(n);
121
        Code code = context.getCode(argNameX);
122
        if (code == null) {
123
          break;
124
        }
125
        argsX.add(code);
126
        n++;
127
      }
128
      args.add(codeBuilder.tuple(argsX));
129

    
130
      n = 1;
131
      argsX = (BaseCodes) codeBuilder.args();
132
      while (true) {
133
        String argNameX = "ORDER_MODE" + 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
      Code limit = context.getCode("LIMIT");
144
      if (limit == null) {
145
        args.add(codeBuilder.constant(null));
146
      } else {
147
        args.add(limit);
148
      }
149
      return args;
150

    
151
    }
152

    
153
  }
154

    
155
  private static class SelectCountArgsBuilder implements ArgsBuilder {
156

    
157
    public SelectCountArgsBuilder() {
158
    }
159

    
160
    @Override
161
    public String toString() {
162
      return "select_count_args()";
163
    }
164

    
165
    @Override
166
    public Codes build(StatementContext context) {
167
      context.trace(this.toString() + ".build");
168
      CodeBuilder codeBuilder = context.getCodeBuilder();
169
      BaseCodes args = (BaseCodes) codeBuilder.args();
170

    
171
      Code table = context.getCode("table");
172
      Code where = context.getCode("where");
173

    
174
      args.add(codeBuilder.identifier((String) ((Code.Constant) table).value()));
175

    
176
      if (where == null) {
177
        args.add(codeBuilder.constant(null));
178
      } else {
179
        args.add(where);
180
      }
181
      return args;
182
    }
183

    
184
  }
185

    
186
  public DataAccessGrammarFactory() {
187
    super(DALFunctions.GRAMMAR_NAME, true);
188
  }
189

    
190
  @Override
191
  public Grammar create(Object... parameters) {
192
    ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
193
    if (this.grammar == null) {
194
      CodeBuilder codeBuilder = manager.createCodeBuilder();
195
      Grammar theGrammar = manager.createGrammar(this.getName());
196
      
197
      Statement stmt;
198
      
199
      theGrammar.addReservedWord("EXISTS");
200
      theGrammar.addReservedWord("SELECT");
201
      theGrammar.addReservedWord("FROM");
202
      theGrammar.addReservedWord("WHERE");
203
      theGrammar.addReservedWord("ORDER");
204
      theGrammar.addReservedWord("DESC");
205
      theGrammar.addReservedWord("ASC");
206
      theGrammar.addReservedWord("BY");
207

    
208
      stmt = theGrammar.createStatement("EXISTS");
209
      stmt.addRule(stmt.require_any_token("EXISTS"));
210
      stmt.addRule(stmt.require_any_token("("));
211
      stmt.addRule(stmt.require_expression().capture_as("LIST"));
212
      stmt.addRule(stmt.optional_any_token(",")
213
              .addRuleOnTrue(stmt.require_expression().capture_as("ID"))
214
      );
215
      stmt.addRule(stmt.require_any_token(")"));
216
      stmt.builder(new ExistsStatementBuilder("LIST", "ID"));
217
      theGrammar.addStatement(stmt);
218

    
219
      stmt = theGrammar.createStatement("FOREING_VALUE");
220
      stmt.addRule(stmt.require_any_token("FOREING"));
221
      stmt.addRule(stmt.require_any_token("VALUE"));
222
      stmt.addRule(stmt.require_any_token("FROM"));
223
      stmt.addRule(stmt.require_identifiers(".").capture_as("IDENTIFIERS"));
224
      stmt.code(
225
              FUNCTION_FOREING_VALUE,
226
              stmt.args_names("IDENTIFIERS")
227
      );
228
      theGrammar.addStatement(stmt);
229

    
230
      stmt = theGrammar.createStatement("SELECT");
231
      stmt.addRule(stmt.require_any_token("SELECT"));
232
      stmt.addRule(stmt.optional_any_token("*")
233
              .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
234
              .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
235
      );
236
      stmt.addRule(stmt.require_any_token("FROM"));
237
      stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
238
      stmt.addRule(stmt.optional_any_token("WHERE")
239
              .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
240
      );
241

    
242
      stmt.addRule(stmt.optional_any_token("ORDER")
243
              .addRuleOnTrue(stmt.require_any_token("BY"))
244
              .addRuleOnTrue(stmt.repeat()
245
                      .addRule(stmt.require_expression().capture_as("ORDER#"))
246
                      .addRule(stmt.switch_token()
247
                              .addCase("ASC", stmt.set_expression("ORDER_MODE#", true))
248
                              .addCase("DESC", stmt.set_expression("ORDER_MODE#", false))
249
                              .addDefault(stmt.set_expression("ORDER_MODE#", true))
250
                      )
251
                      .addRule(stmt.optional_any_token(",")
252
                              .addRuleOnFalse(stmt.break_loop())
253
                      )
254
              )
255
      );
256
      stmt.addRule(stmt.optional_any_token("LIMIT")
257
              .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
258
      );
259
      stmt.addRule(stmt.optional_any_token(";"));
260
      stmt.code(
261
              FUNCTION_SELECT,
262
              new SelectArgsBuilder()
263
      );
264
      theGrammar.addStatement(stmt);
265

    
266
      stmt = theGrammar.createStatement("SELECT_COUNT");
267
      stmt.addRule(stmt.require_any_token("SELECT"));
268
      stmt.addRule(stmt.require_any_token("COUNT"));
269
      stmt.addRule(stmt.require_any_token("("));
270
      stmt.addRule(stmt.require_any_token("*"));
271
      stmt.addRule(stmt.require_any_token(")"));
272
      stmt.addRule(stmt.require_any_token("FROM"));
273
      stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
274
      stmt.addRule(stmt.optional_any_token("WHERE")
275
              .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
276
      );
277
      stmt.addRule(stmt.require_any_token(";"));
278
      stmt.code(
279
              FUNCTION_SELECT_COUNT,
280
              new SelectCountArgsBuilder()
281
      );
282
      theGrammar.addStatement(stmt);
283

    
284
      this.grammar = theGrammar;
285
    }
286
    return grammar;
287
  }
288

    
289
  public static final void selfRegister() {
290
    ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
291
    manager.registerGrammar(new DataAccessGrammarFactory());
292
  }
293
}