Revision 46954 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 | ||
---|---|---|
43 | 43 |
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT; |
44 | 44 |
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_COUNT; |
45 | 45 |
import org.gvsig.expressionevaluator.Code.Callable; |
46 |
import static org.gvsig.expressionevaluator.impl.function.dataaccess.SelectAggregateFunction.FUNCTION_SELECT_AGGREGATE; |
|
46 | 47 |
import org.gvsig.fmap.dal.DataManager; |
47 | 48 |
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CREATE_TABLE; |
48 | 49 |
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CREATE_TABLE_STRUCTURE; |
... | ... | |
221 | 222 |
} |
222 | 223 |
|
223 | 224 |
} |
225 |
private static class SelectAggregateArgsBuilder implements ArgsBuilder { |
|
224 | 226 |
|
227 |
public SelectAggregateArgsBuilder() { |
|
228 |
} |
|
229 |
|
|
230 |
@Override |
|
231 |
public String toString() { |
|
232 |
return "select_aggregate_args()"; |
|
233 |
} |
|
234 |
|
|
235 |
@Override |
|
236 |
public Codes build(StatementContext context) { |
|
237 |
context.trace(this.toString() + ".build"); |
|
238 |
CodeBuilder codeBuilder = context.getCodeBuilder(); |
|
239 |
BaseCodes args = (BaseCodes) codeBuilder.args(); |
|
240 |
|
|
241 |
Code table = context.getCode("table"); |
|
242 |
Code where = context.getCode("where"); |
|
243 |
Code aggregateFunction = context.getCode("AGGREGATE_FUNCTION"); |
|
244 |
Code aggregateColumn = context.getCode("AGGREGATE_COLUMN"); |
|
245 |
|
|
246 |
args.add(table); |
|
247 |
|
|
248 |
if (where == null) { |
|
249 |
args.add(codeBuilder.constant(null)); |
|
250 |
} else { |
|
251 |
args.add(where); |
|
252 |
} |
|
253 |
args.add(aggregateFunction); |
|
254 |
args.add(aggregateColumn); |
|
255 |
return args; |
|
256 |
} |
|
257 |
|
|
258 |
} |
|
259 |
|
|
225 | 260 |
public DataAccessGrammarFactory() { |
226 | 261 |
super(DALFunctions.GRAMMAR_NAME, true); |
227 | 262 |
} |
... | ... | |
239 | 274 |
theGrammar.addStatement(createForeingValueStatement(theGrammar)); |
240 | 275 |
theGrammar.addStatement(createInsertIntoTableSelectStatement(theGrammar)); |
241 | 276 |
theGrammar.addStatement(createSelectCountStatement(theGrammar)); |
277 |
theGrammar.addStatement(createSelectAggregateStatement(theGrammar)); |
|
242 | 278 |
theGrammar.addStatement(createSelectStatement(theGrammar)); |
243 | 279 |
// theGrammar.addStatement(createUpdateStatement(theGrammar)); |
244 | 280 |
theGrammar.addStatement(createSelectCountFromSelectionStatement(theGrammar)); |
... | ... | |
503 | 539 |
return stmt; |
504 | 540 |
} |
505 | 541 |
|
542 |
private Statement createSelectAggregateStatement(Grammar theGrammar) { |
|
543 |
Statement stmt; |
|
544 |
// |
|
545 |
// SELECT COUNT(*) FROM table_name WHERE expression |
|
546 |
// |
|
547 |
theGrammar.addReservedWord("SELECT"); |
|
548 |
theGrammar.addReservedWord("FROM"); |
|
549 |
theGrammar.addReservedWord("WHERE"); |
|
550 |
|
|
551 |
stmt = theGrammar.createStatement("SELECT_COUNT"); |
|
552 |
stmt.addRule(stmt.require_any_token("SELECT")); |
|
553 |
stmt.addRule(stmt.require_any_token("COUNT","SUM", "MIN","MAX", "AVG").capture_as("AGGREGATE_FUNCTION")); |
|
554 |
stmt.addRule(stmt.require_any_token("(")); |
|
555 |
stmt.addRule(stmt.require_identifier().capture_as("AGGREGATE_COLUMN")); |
|
556 |
stmt.addRule(stmt.require_any_token(")")); |
|
557 |
stmt.addRule(stmt.require_any_token("FROM")); |
|
558 |
stmt.addRule(stmt.require_expression().capture_as("TABLE")); |
|
559 |
stmt.addRule(stmt.optional_any_token("WHERE") |
|
560 |
.addRuleOnTrue(stmt.require_expression().capture_as("WHERE")) |
|
561 |
); |
|
562 |
stmt.addRule(stmt.optional_any_token(";")); |
|
563 |
stmt.code( |
|
564 |
FUNCTION_SELECT_AGGREGATE, |
|
565 |
new SelectAggregateArgsBuilder() |
|
566 |
); |
|
567 |
return stmt; |
|
568 |
} |
|
569 |
|
|
506 | 570 |
private Statement createSelectCountFromSelectionStatement(Grammar theGrammar) { |
507 | 571 |
Statement stmt; |
508 | 572 |
// |
Also available in: Unified diff