Revision 44750 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

View differences:

DataAccessGrammarFactory.java
24 24
package org.gvsig.expressionevaluator.impl.grammars;
25 25

  
26 26
import java.util.UUID;
27
import org.apache.commons.lang3.StringUtils;
27 28
import org.gvsig.expressionevaluator.Code;
28 29
import org.gvsig.expressionevaluator.Code.Caller;
29 30
import org.gvsig.expressionevaluator.CodeBuilder;
31
import org.gvsig.expressionevaluator.Codes;
30 32
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
31 33
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
34
import org.gvsig.expressionevaluator.ExpressionSyntaxException;
32 35
import org.gvsig.expressionevaluator.Grammar;
33 36
import org.gvsig.expressionevaluator.Statement;
37
import org.gvsig.expressionevaluator.Statement.ArgsBuilder;
34 38
import org.gvsig.expressionevaluator.Statement.StatementContext;
35 39
import org.gvsig.expressionevaluator.impl.DALFunctions;
36 40
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseCodes;
......
48 52
 */
49 53
public class DataAccessGrammarFactory extends AbstractGrammarFactory {
50 54

  
51
    private Grammar grammar;
55
  private Grammar grammar;
52 56

  
53
    private class ExistsStatementBuilder extends DefaultStatement.StatementBuilderBase {
57
  private static class ExistsStatementBuilder extends DefaultStatement.StatementBuilderBase {
54 58

  
55
        private final String listID;
56
        private final String existsID;
59
    private final String listID;
60
    private final String existsID;
57 61

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

  
64
        @Override
65
        public Code build(StatementContext context) {
68
    @Override
69
    public Code build(StatementContext context) {
66 70

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

  
80
    public DataAccessGrammarFactory() {
81
        super(DALFunctions.GRAMMAR_NAME, true);
85
  }
86

  
87
  private static class SelectArgsBuilder implements ArgsBuilder {
88

  
89
    public SelectArgsBuilder() {
82 90
    }
83
    
91

  
84 92
    @Override
85
    public Grammar create(Object... parameters) {
86
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
87
        if( this.grammar==null ) {
88
            Grammar theGrammar = manager.createGrammar(this.getName());
89
            Statement stmt;
90
        
91
            theGrammar.addReservedWord("EXISTS");
92
            theGrammar.addReservedWord("SELECT");
93
            theGrammar.addReservedWord("FROM");
94
            theGrammar.addReservedWord("WHERE");
95
            theGrammar.addReservedWord("ORDER");
96
            theGrammar.addReservedWord("DESC");
97
            theGrammar.addReservedWord("ASC");
98
            theGrammar.addReservedWord("BY");
99
            
100
            stmt = theGrammar.createStatement("EXISTS");
101
            stmt.addRule(stmt.require_any_token("EXISTS"));
102
            stmt.addRule(stmt.require_any_token("("));
103
            stmt.addRule(stmt.require_expression("LIST"));
104
            stmt.addRule(stmt.optional_any_token(",")
105
                    .addRuleOnTrue(stmt.require_expression("ID"))
106
            );
107
            stmt.addRule(stmt.require_any_token(")"));
108
            stmt.builder(new ExistsStatementBuilder("LIST","ID"));
109
            theGrammar.addStatement(stmt);
93
    public String toString() {
94
      return "select_args()";
95
    }
110 96

  
111
            stmt = theGrammar.createStatement("FOREING_VALUE");
112
            stmt.addRule(stmt.require_any_token("FOREING"));
113
            stmt.addRule(stmt.require_any_token("VALUE"));
114
            stmt.addRule(stmt.require_any_token("FROM"));
115
            stmt.addRule(stmt.require_identifiers("IDENTIFIERS","."));
116
            stmt.code(
117
                    FUNCTION_FOREING_VALUE,
118
                    stmt.args_names("IDENTIFIERS")
119
            ); 
120
            theGrammar.addStatement(stmt);
97
    @Override
98
    public Codes build(StatementContext context) {
99
      context.trace(this.toString() + ".build");
100
      CodeBuilder codeBuilder = context.getCodeBuilder();
101
      BaseCodes args = (BaseCodes) codeBuilder.args();
121 102

  
122
            stmt = theGrammar.createStatement("SELECT");
123
            stmt.addRule(stmt.require_any_token("SELECT"));
124
            stmt.addRule(stmt.require_any_token("*","1"));
125
            stmt.addRule(stmt.require_any_token("FROM"));
126
            stmt.addRule(stmt.require_identifier("TABLE"));
127
            stmt.addRule(stmt.optional_any_token("WHERE")
128
                    .addRuleOnTrue(stmt.require_expression("WHERE"))
129
            );
130
            
131
            stmt.addRule(stmt.optional_any_token("ORDER")
132
                    .addRuleOnTrue(stmt.require_any_token("BY"))
133
                    .addRuleOnTrue(
134
                      stmt.repeat()
135
                          .addRule(stmt.require_expression("ORDER#"))
136
                          .addRule(stmt.switch_token()
137
                                  .addCase("ASC", 
138
                                          stmt.set_expression("ORDER_MODE#", true)
139
                                  )
140
                                  .addCase("DESC", 
141
                                          stmt.set_expression("ORDER_MODE#", false)
142
                                  )
143
                                  .addDefault(
144
                                          stmt.set_expression("ORDER_MODE#", true)
145
                                  )
146
                          )
147
                          .addRule(
148
                              stmt.optional_any_token(",")
149
                                  .addRuleOnFalse(stmt.break_loop())
150
                          )
151
                    )
152
            );    
153
            stmt.addRule(stmt.optional_any_token("LIMIT")
154
                    .addRuleOnTrue(stmt.require_expression("LIMIT"))
155
            );
156
            stmt.addRule(stmt.require_any_token(";"));
157
            stmt.code(
158
                    FUNCTION_SELECT,
159
                    stmt.args_names("TABLE","WHERE","ORDER#","ORDER_MODE#","LIMIT")
160
            ); 
161
            theGrammar.addStatement(stmt);
103
      Code columns = context.getCode("COLUMNS");
104
      Code table = context.getCode("TABLE");
105
      Code where = context.getCode("WHERE");
106
//      Code order = context.getCode("ORDER");
107
//      Code order_mode = context.getCode("ORDER_MODE");
108
      Code limit = context.getCode("LIMIT");
162 109

  
163
            stmt = theGrammar.createStatement("SELECT_COUNT");
164
            stmt.addRule(stmt.require_any_token("SELECT"));
165
            stmt.addRule(stmt.require_any_token("COUNT"));
166
            stmt.addRule(stmt.require_any_token("("));
167
            stmt.addRule(stmt.require_any_token("*"));
168
            stmt.addRule(stmt.require_any_token(")"));
169
            stmt.addRule(stmt.require_any_token("FROM"));
170
            stmt.addRule(stmt.require_identifier("TABLE"));
171
            stmt.addRule(stmt.optional_any_token("WHERE")
172
                    .addRuleOnTrue(stmt.require_expression("WHERE"))
173
            );
174
            stmt.addRule(stmt.require_any_token(";"));
175
            stmt.code(
176
                    FUNCTION_SELECT_COUNT,
177
                    stmt.args_names("TABLE","WHERE")
178
            ); 
179
            theGrammar.addStatement(stmt);
110
      if (columns == null) {
111
        throw new ExpressionSyntaxException();
112
      }
113
      Caller tuple = codeBuilder.tuple();
114
      args.add(tuple);
115
      String s = (String) ((Code.Constant) columns).value();
116
      if (!StringUtils.equalsIgnoreCase(s, "*")) {
117
        ((BaseCodes) (tuple.parameters())).add(codeBuilder.constant(1));
118
      }
119
      
120
      args.add(codeBuilder.identifier((String) ((Code.Constant) table).value()));
180 121

  
181
            this.grammar = theGrammar;
122
      if (where == null) {
123
        args.add(codeBuilder.constant(null));
124
      } else {
125
        args.add(where);
126
      }
127

  
128
      int n = 1;
129
      BaseCodes 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;
182 135
        }
183
        return grammar;
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
      if (limit == null) {
155
        args.add(codeBuilder.constant(null));
156
      } else {
157
        args.add(limit);
158
      }
159
      return args;
160

  
184 161
    }
185
 
186
    public static final void selfRegister() {
187
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
188
        manager.registerGrammar(new DataAccessGrammarFactory());
162

  
163
  }
164

  
165
  private static class SelectCountArgsBuilder implements ArgsBuilder {
166

  
167
    public SelectCountArgsBuilder() {
189 168
    }
169

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

  
175
    @Override
176
    public Codes build(StatementContext context) {
177
      context.trace(this.toString() + ".build");
178
      CodeBuilder codeBuilder = context.getCodeBuilder();
179
      BaseCodes args = (BaseCodes) codeBuilder.args();
180

  
181
      Code table = context.getCode("table");
182
      Code where = context.getCode("where");
183

  
184
      args.add(codeBuilder.identifier((String) ((Code.Constant) table).value()));
185

  
186
      if (where == null) {
187
        args.add(codeBuilder.constant(null));
188
      } else {
189
        args.add(where);
190
      }
191
      return args;
192
    }
193

  
194
  }
195

  
196
  public DataAccessGrammarFactory() {
197
    super(DALFunctions.GRAMMAR_NAME, true);
198
  }
199

  
200
  @Override
201
  public Grammar create(Object... parameters) {
202
    ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
203
    if (this.grammar == null) {
204
      Grammar theGrammar = manager.createGrammar(this.getName());
205
      Statement stmt;
206

  
207
      theGrammar.addReservedWord("EXISTS");
208
      theGrammar.addReservedWord("SELECT");
209
      theGrammar.addReservedWord("FROM");
210
      theGrammar.addReservedWord("WHERE");
211
      theGrammar.addReservedWord("ORDER");
212
      theGrammar.addReservedWord("DESC");
213
      theGrammar.addReservedWord("ASC");
214
      theGrammar.addReservedWord("BY");
215

  
216
      stmt = theGrammar.createStatement("EXISTS");
217
      stmt.addRule(stmt.require_any_token("EXISTS"));
218
      stmt.addRule(stmt.require_any_token("("));
219
      stmt.addRule(stmt.require_expression().capture_as("LIST"));
220
      stmt.addRule(stmt.optional_any_token(",")
221
              .addRuleOnTrue(stmt.require_expression().capture_as("ID"))
222
      );
223
      stmt.addRule(stmt.require_any_token(")"));
224
      stmt.builder(new ExistsStatementBuilder("LIST", "ID"));
225
      theGrammar.addStatement(stmt);
226

  
227
      stmt = theGrammar.createStatement("FOREING_VALUE");
228
      stmt.addRule(stmt.require_any_token("FOREING"));
229
      stmt.addRule(stmt.require_any_token("VALUE"));
230
      stmt.addRule(stmt.require_any_token("FROM"));
231
      stmt.addRule(stmt.require_identifiers(".").capture_as("IDENTIFIERS"));
232
      stmt.code(
233
              FUNCTION_FOREING_VALUE,
234
              stmt.args_names("IDENTIFIERS")
235
      );
236
      theGrammar.addStatement(stmt);
237

  
238
      stmt = theGrammar.createStatement("SELECT");
239
      stmt.addRule(stmt.require_any_token("SELECT"));
240
      stmt.addRule(stmt.switch_token()
241
              .addCase("*", stmt.set_expression("COLUMNS", "*"))
242
              .addCase("1", stmt.set_expression("COLUMNS", "1"))
243
              .addDefault(stmt.fail())
244
      );
245
      stmt.addRule(stmt.require_any_token("FROM"));
246
      stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
247
      stmt.addRule(stmt.optional_any_token("WHERE")
248
              .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
249
      );
250

  
251
      stmt.addRule(stmt.optional_any_token("ORDER")
252
              .addRuleOnTrue(stmt.require_any_token("BY"))
253
              .addRuleOnTrue(stmt.repeat()
254
                      .addRule(stmt.require_expression().capture_as("ORDER#"))
255
                      .addRule(stmt.switch_token()
256
                              .addCase("ASC", stmt.set_expression("ORDER_MODE#", true))
257
                              .addCase("DESC", stmt.set_expression("ORDER_MODE#", false))
258
                              .addDefault(stmt.set_expression("ORDER_MODE#", true))
259
                      )
260
                      .addRule(stmt.optional_any_token(",")
261
                              .addRuleOnFalse(stmt.break_loop())
262
                      )
263
              )
264
      );
265
      stmt.addRule(stmt.optional_any_token("LIMIT")
266
              .addRuleOnTrue(stmt.require_expression().capture_as("LIMIT"))
267
      );
268
      stmt.addRule(stmt.optional_any_token(";"));
269
      stmt.code(
270
              FUNCTION_SELECT,
271
              new SelectArgsBuilder()
272
      );
273
      theGrammar.addStatement(stmt);
274

  
275
      stmt = theGrammar.createStatement("SELECT_COUNT");
276
      stmt.addRule(stmt.require_any_token("SELECT"));
277
      stmt.addRule(stmt.require_any_token("COUNT"));
278
      stmt.addRule(stmt.require_any_token("("));
279
      stmt.addRule(stmt.require_any_token("*"));
280
      stmt.addRule(stmt.require_any_token(")"));
281
      stmt.addRule(stmt.require_any_token("FROM"));
282
      stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
283
      stmt.addRule(stmt.optional_any_token("WHERE")
284
              .addRuleOnTrue(stmt.require_expression().capture_as("WHERE"))
285
      );
286
      stmt.addRule(stmt.require_any_token(";"));
287
      stmt.code(
288
              FUNCTION_SELECT_COUNT,
289
              new SelectCountArgsBuilder()
290
      );
291
      theGrammar.addStatement(stmt);
292

  
293
      this.grammar = theGrammar;
294
    }
295
    return grammar;
296
  }
297

  
298
  public static final void selfRegister() {
299
    ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
300
    manager.registerGrammar(new DataAccessGrammarFactory());
301
  }
190 302
}

Also available in: Unified diff