Revision 46091
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/expressionbuilder/formatters/$Constant.java | ||
---|---|---|
34 | 34 |
import org.gvsig.fmap.dal.SQLBuilder; |
35 | 35 |
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase.PROP_SYMBOLTABLE; |
36 | 36 |
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_$CONSTANT; |
37 |
import org.gvsig.expressionevaluator.GeometryExpressionBuilder; |
|
38 |
import org.gvsig.fmap.geom.Geometry; |
|
37 | 39 |
|
38 | 40 |
/** |
39 | 41 |
* |
... | ... | |
59 | 61 |
|
60 | 62 |
@Override |
61 | 63 |
public String format(Value value) { |
62 |
return resolve(this.sqlbuilder.expression(), this.formatter, value);
|
|
64 |
return resolve(this.sqlbuilder, this.formatter, value); |
|
63 | 65 |
} |
64 | 66 |
|
65 | 67 |
public static boolean isConstant(Value value) { |
... | ... | |
70 | 72 |
StringUtils.equalsIgnoreCase(((ExpressionBuilder.Function)value).name(),FUNCTION_$CONSTANT); |
71 | 73 |
} |
72 | 74 |
|
73 |
public static String resolve(Value value) { |
|
74 |
ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder(); |
|
75 |
return resolve(builder, null, value); |
|
76 |
} |
|
77 | 75 |
|
78 |
public static String resolve(ExpressionBuilder builder, Formatter<Value> formatter, Value value) { |
|
76 |
public static String resolve(SQLBuilder sqlbuilder, Formatter<Value> formatter, Value value) { |
|
77 |
GeometryExpressionBuilder builder = sqlbuilder.expression(); |
|
79 | 78 |
if( value instanceof ExpressionBuilder.Constant) { |
80 | 79 |
Object x = ((ExpressionBuilder.Constant)value).value(); |
81 | 80 |
return builder.constant(x).toString(formatter); |
... | ... | |
83 | 82 |
StringUtils.equalsIgnoreCase(((ExpressionBuilder.Function)value).name(),FUNCTION_$CONSTANT) ) { |
84 | 83 |
SymbolTable symbolTable = (SymbolTable) value.getProperty(PROP_SYMBOLTABLE); |
85 | 84 |
Object x = ExpressionUtils.evaluate(symbolTable, value.toString()); |
85 |
|
|
86 |
if( x instanceof Geometry && builder instanceof GeometryExpressionBuilder) { |
|
87 |
GeometryExpressionBuilder gbuilder = (GeometryExpressionBuilder) builder; |
|
88 |
Geometry geom = (Geometry) x; |
|
89 |
String hexwkb = geom.convertToHexWKBQuietly(); |
|
90 |
|
|
91 |
Function v = gbuilder.ST_GeomFromWKB( |
|
92 |
gbuilder.decode( |
|
93 |
gbuilder.constant(hexwkb), |
|
94 |
gbuilder.constant("hex") |
|
95 |
), |
|
96 |
gbuilder.constant( |
|
97 |
sqlbuilder.srs_id(geom.getProjection()) |
|
98 |
) |
|
99 |
); |
|
100 |
return v.toString(formatter); |
|
101 |
} |
|
86 | 102 |
return builder.constant(x).toString(formatter); |
87 | 103 |
} |
88 | 104 |
throw new RuntimeException("Expected constant value or $$CONSTANT function ("+Objects.toString(value)+")."); |
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/java/org/gvsig/app/project/symboltables/ProjectSymbolTable.java | ||
---|---|---|
4 | 4 |
import java.io.FileInputStream; |
5 | 5 |
import java.util.HashMap; |
6 | 6 |
import java.util.Iterator; |
7 |
import java.util.List; |
|
8 | 7 |
import java.util.Map; |
9 | 8 |
import java.util.Properties; |
10 | 9 |
import org.apache.commons.io.IOUtils; |
... | ... | |
32 | 31 |
import org.gvsig.fmap.dal.HasDataStore; |
33 | 32 |
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable; |
34 | 33 |
import org.gvsig.fmap.dal.feature.Feature; |
35 |
import org.gvsig.fmap.dal.feature.FeatureQuery; |
|
36 | 34 |
import org.gvsig.fmap.dal.feature.FeatureSet; |
37 | 35 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
38 | 36 |
import org.gvsig.fmap.geom.Geometry; |
... | ... | |
44 | 42 |
import org.gvsig.temporarystorage.TemporaryStorageGroup; |
45 | 43 |
import org.gvsig.temporarystorage.TemporaryStorageLocator; |
46 | 44 |
import org.gvsig.temporarystorage.TemporaryStorageManager; |
47 |
import org.gvsig.tools.util.UnmodifiableBasicList; |
|
48 | 45 |
|
49 | 46 |
/** |
50 | 47 |
* |
... | ... | |
494 | 491 |
Geometry value = (Geometry) storage.get(getStr(args, 0)); |
495 | 492 |
return value; |
496 | 493 |
} |
494 |
|
|
495 |
} |
|
497 | 496 |
|
498 |
} |
|
499 |
|
|
500 | 497 |
private class AreaFunction extends AbstractGeometryFunction { |
501 | 498 |
|
502 | 499 |
public AreaFunction() { |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/spi/AbstractLexicalAnalyzer.java | ||
---|---|---|
353 | 353 |
} |
354 | 354 |
token.set(Token.STRING_LITERAL, buffer.toString()); |
355 | 355 |
} |
356 |
|
|
356 |
|
|
357 |
// protected void parseStringBlock() { |
|
358 |
// buffer.clear(); |
|
359 |
// char ch = getch(); |
|
360 |
// while (true) { |
|
361 |
// if (ch == EOF) { |
|
362 |
// throw new ExpressionSyntaxException(I18N.End_of_string_was_expected_and_end_of_source_was_found(), this); |
|
363 |
// } |
|
364 |
// if (ch == '$') { |
|
365 |
// ch = getch(); |
|
366 |
// if (ch == EOF) { |
|
367 |
// break; |
|
368 |
// } |
|
369 |
// if (ch != '$') { |
|
370 |
// ungetch(); |
|
371 |
// break; |
|
372 |
// } |
|
373 |
// } |
|
374 |
// buffer.add(ch); |
|
375 |
// ch = getch(); |
|
376 |
// } |
|
377 |
// token.set(Token.STRING_LITERAL, buffer.toString()); |
|
378 |
// } |
|
379 |
|
|
357 | 380 |
protected void parseDMSNumber() { |
358 | 381 |
int d; |
359 | 382 |
int m; |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/LexicalAnalyzer.java | ||
---|---|---|
48 | 48 |
public static final int ASSIGNMENT = 38; |
49 | 49 |
public static final int ARGUMENT_ASSIGNMENT = 39; |
50 | 50 |
public static final int COLON = 40; |
51 |
public static final int BEGIN_$CONSTANT = 41; |
|
52 |
public static final int END_$CONSTANT = 42; |
|
51 | 53 |
|
52 | 54 |
@Override |
53 | 55 |
public Token clone() throws CloneNotSupportedException; |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/SQLLexicalAnalyzer.java | ||
---|---|---|
73 | 73 |
token.set(Token.OP_DIV, "/"); |
74 | 74 |
return token; |
75 | 75 |
case '%': |
76 |
ch = getch(); |
|
77 |
switch( ch ) { |
|
78 |
case EOF: |
|
79 |
throw new ExpressionSyntaxException(I18N.unexpected_end_of_source(), this); |
|
80 |
case '>': |
|
81 |
token.set(Token.END_$CONSTANT, "%>"); |
|
82 |
return token; |
|
83 |
} |
|
84 |
ungetch(); |
|
76 | 85 |
token.set(Token.OP_MOD, "%"); |
77 | 86 |
return token; |
78 | 87 |
case '=': |
... | ... | |
112 | 121 |
case '=': |
113 | 122 |
token.set(Token.OP_LE, "<="); |
114 | 123 |
return token; |
124 |
case '%': |
|
125 |
token.set(Token.BEGIN_$CONSTANT, "<%"); |
|
126 |
return token; |
|
115 | 127 |
} |
116 | 128 |
ungetch(); |
117 | 129 |
token.set(Token.OP_LT, "<"); |
... | ... | |
232 | 244 |
case '\'': |
233 | 245 |
parseString(); |
234 | 246 |
return token; |
235 |
|
|
247 |
|
|
236 | 248 |
case '@': |
237 | 249 |
ungetch(); |
238 | 250 |
parseDMSNumber(); |
239 | 251 |
return token; |
252 |
// |
|
253 |
// case '$': |
|
254 |
// ch = getch(); |
|
255 |
// switch( ch ) { |
|
256 |
// case EOF: |
|
257 |
// throw new ExpressionSyntaxException(I18N.unexpected_end_of_source(), this); |
|
258 |
// case '$': |
|
259 |
// parseStringBlock(); |
|
260 |
// return token; |
|
261 |
// } |
|
262 |
// ungetch(); |
|
263 |
// ungetch(); |
|
264 |
// break; |
|
240 | 265 |
} |
241 | 266 |
|
242 | 267 |
if( Character.isDigit(ch) ) { |
243 | 268 |
ungetch(); |
244 | 269 |
parseNumber(); |
245 | 270 |
return token; |
246 |
} |
|
271 |
}
|
|
247 | 272 |
if( Character.isAlphabetic(ch) || ch =='$' ) { |
248 | 273 |
buffer.clear(); |
249 | 274 |
while( Character.isLetterOrDigit(ch) || ch =='$' || ch == '_' ) { |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/grammars/BasicGrammarFactory.java | ||
---|---|---|
164 | 164 |
theGrammar.addStatement(this.createTimeStatement(theGrammar)); |
165 | 165 |
theGrammar.addStatement(this.createTimestampStatement(theGrammar)); |
166 | 166 |
theGrammar.addStatement(this.createWhileStatement(theGrammar)); |
167 |
theGrammar.addStatement(this.create$ConstantStatement(theGrammar)); |
|
167 | 168 |
|
168 | 169 |
this.grammar = theGrammar; |
169 | 170 |
} |
... | ... | |
187 | 188 |
stmt.builder(new BeginStatementBuilder("VALUES", "EXCEPT")); |
188 | 189 |
return stmt; |
189 | 190 |
} |
191 |
|
|
192 |
private Statement create$ConstantStatement(Grammar theGrammar) { |
|
193 |
Statement stmt; |
|
190 | 194 |
|
195 |
stmt = theGrammar.createStatement("$Constant"); |
|
196 |
stmt.addRule(stmt.require_any_token("<%")); |
|
197 |
stmt.addRule(stmt.require_any_token("=")); |
|
198 |
stmt.addRule(stmt.require_expression().capture_as("VALUE")); |
|
199 |
stmt.addRule(stmt.require_any_token("%>")); |
|
200 |
stmt.code( |
|
201 |
ExpressionBuilder.FUNCTION_$CONSTANT, |
|
202 |
stmt.args_names("VALUE") |
|
203 |
); |
|
204 |
return stmt; |
|
205 |
} |
|
206 |
|
|
191 | 207 |
private Statement createIfStatement(Grammar theGrammar) { |
192 | 208 |
Statement stmt; |
193 | 209 |
|
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestGrammarCompiler.java | ||
---|---|---|
419 | 419 |
link(code); |
420 | 420 |
assertEquals("PASS()", code.toString()); |
421 | 421 |
} |
422 |
|
|
423 |
public void test$Constant1() { |
|
424 |
String source = "set x = <%='hola'%>"; |
|
425 |
|
|
426 |
Compiler compiler = createCompiler(); |
|
427 |
|
|
428 |
Code code = compiler.compileExpression(source); |
|
429 |
link(code); |
|
430 |
assertEquals("LET('x', $CONSTANT('hola'))", code.toString()); |
|
431 |
} |
|
422 | 432 |
|
423 | 433 |
|
424 | 434 |
} |
Also available in: Unified diff