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