Revision 47062
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/Interpreter.java | ||
---|---|---|
25 | 25 |
|
26 | 26 |
public void run(MutableSymbolTable symbolTable, Code code); |
27 | 27 |
|
28 |
public Object runCode(Code arg) throws Exception; |
|
29 |
|
|
28 | 30 |
public void link(Code code); |
29 | 31 |
|
30 | 32 |
public Double getAccuracy(); |
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/AbstractFunction.java | ||
---|---|---|
467 | 467 |
if( arg==null ) { |
468 | 468 |
return null; |
469 | 469 |
} |
470 |
Object value = interpreter.run(arg); |
|
470 |
Object value = null; |
|
471 |
try { |
|
472 |
value = interpreter.runCode(arg); |
|
473 |
} catch(RuntimeException ex) { |
|
474 |
throw ex; |
|
475 |
} catch(Exception ex) { |
|
476 |
throw new ExpressionRuntimeException(arg, "", ex); |
|
477 |
} |
|
478 |
|
|
471 | 479 |
return value; |
472 | 480 |
} |
473 | 481 |
|
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/formatter/value/Cast.java | ||
---|---|---|
1 |
package org.gvsig.expressionevaluator.spi.formatter.value; |
|
2 |
|
|
3 |
import java.util.List; |
|
4 |
import org.apache.commons.lang3.StringUtils; |
|
5 |
import org.gvsig.expressionevaluator.ExpressionBuilder; |
|
6 |
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_CAST; |
|
7 |
import org.gvsig.expressionevaluator.ExpressionBuilder.Function; |
|
8 |
import org.gvsig.expressionevaluator.ExpressionBuilder.Value; |
|
9 |
import org.gvsig.expressionevaluator.Formatter; |
|
10 |
|
|
11 |
/** |
|
12 |
* |
|
13 |
* @author jjdelcerro |
|
14 |
*/ |
|
15 |
public class Cast implements Formatter<Value> { |
|
16 |
|
|
17 |
private final Formatter<Value> formatter; |
|
18 |
|
|
19 |
public Cast(Formatter<Value> formatter) { |
|
20 |
this.formatter = formatter; |
|
21 |
} |
|
22 |
@Override |
|
23 |
public boolean canApply(ExpressionBuilder.Value value) { |
|
24 |
if (value instanceof ExpressionBuilder.Function) { |
|
25 |
return StringUtils.equalsIgnoreCase(FUNCTION_CAST, ((Function) value).name()); |
|
26 |
} |
|
27 |
return false; |
|
28 |
} |
|
29 |
|
|
30 |
@Override |
|
31 |
public String format(Value function0) { |
|
32 |
Function function = (Function) function0; |
|
33 |
StringBuilder builder = new StringBuilder(); |
|
34 |
List<Value> args = function.parameters(); |
|
35 |
builder.append("CAST("); |
|
36 |
builder.append(args.get(0).toString(formatter)); |
|
37 |
builder.append(" AS "); |
|
38 |
builder.append(((ExpressionBuilder.Constant)args.get(1)).value()); |
|
39 |
builder.append(")"); |
|
40 |
return builder.toString(); |
|
41 |
} |
|
42 |
|
|
43 |
} |
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/TestScript1.java | ||
---|---|---|
46 | 46 |
assertEquals(true, r); |
47 | 47 |
|
48 | 48 |
r = sc.invokeFunction("form_isReadOnly", new Object[]{"form"}); |
49 |
assertEquals(false, r);
|
|
49 |
assertEquals(true, r);
|
|
50 | 50 |
} |
51 | 51 |
|
52 | 52 |
public void testScript2() throws Exception { |
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/DefaultInterpreter.java | ||
---|---|---|
278 | 278 |
code.link(this.getSymbolTable()); |
279 | 279 |
} |
280 | 280 |
|
281 |
@Override |
|
281 | 282 |
public Object runCode(Code code) throws Exception { |
282 | 283 |
RecursionControlSupport recursionControl = null; |
283 | 284 |
if( code instanceof RecursionControlSupport ) { |
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/DefaultCodeBuilder.java | ||
---|---|---|
301 | 301 |
BaseCodes x = (BaseCodes)super.clone(); |
302 | 302 |
x.codes = new ArrayList<>(); |
303 | 303 |
for (int i = 0; i < this.codes.size(); i++) { |
304 |
x.add(this.codes.get(i).clone()); |
|
304 |
Code code = this.codes.get(i); |
|
305 |
if(code != null){ |
|
306 |
x.add(code.clone()); |
|
307 |
} else { |
|
308 |
x.add(null); |
|
309 |
} |
|
305 | 310 |
} |
306 | 311 |
return x; |
307 | 312 |
} |
... | ... | |
662 | 667 |
@Override |
663 | 668 |
public Code clone() throws CloneNotSupportedException { |
664 | 669 |
BaseMethod x = (BaseMethod) super.clone(); |
665 |
x.args = this.args.clone(); |
|
670 |
if(this.args != null){ |
|
671 |
x.args = this.args.clone(); |
|
672 |
} else { |
|
673 |
x.args = null; |
|
674 |
} |
|
666 | 675 |
return x; |
667 | 676 |
} |
668 | 677 |
|
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.geometry/org.gvsig.expressionevaluator.geometry.lib/org.gvsig.expressionevaluator.geometry.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/repr/ReprGeometry.java | ||
---|---|---|
3 | 3 |
import org.gvsig.expressionevaluator.ReprMethod; |
4 | 4 |
import java.util.Date; |
5 | 5 |
import org.apache.commons.lang3.StringUtils; |
6 |
import org.cresques.cts.IProjection; |
|
6 | 7 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator; |
7 | 8 |
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager; |
8 | 9 |
import org.gvsig.fmap.geom.Geometry; |
... | ... | |
30 | 31 |
@Override |
31 | 32 |
public String repr(Object value) { |
32 | 33 |
StringBuilder builder = new StringBuilder(); |
34 |
//ST_GEOMFROMTEXT |
|
33 | 35 |
try { |
34 |
builder.append("'"); |
|
35 |
builder.append(((Geometry) value).convertToWKT()); |
|
36 |
builder.append("'::geometry"); |
|
36 |
if(value == null){ |
|
37 |
return "CAST(NULL AS geometry)"; |
|
38 |
} |
|
39 |
Geometry geom = (Geometry) value; |
|
40 |
IProjection proj = geom.getProjection(); |
|
41 |
if(proj == null){ |
|
42 |
builder.append("ST_GEOMFROMTEXT('"); |
|
43 |
builder.append(geom.convertToWKT()); |
|
44 |
builder.append("')"); |
|
45 |
|
|
46 |
} else { |
|
47 |
String abrev = geom.getProjection().getAbrev(); |
|
48 |
String srid = abrev.split(":")[1]; |
|
49 |
builder.append("ST_SETSRID(ST_GEOMFROMTEXT('"); |
|
50 |
builder.append(geom.convertToWKT()); |
|
51 |
builder.append("'),"); |
|
52 |
builder.append(srid); |
|
53 |
builder.append(")"); |
|
54 |
} |
|
37 | 55 |
} catch (Exception ex) { |
38 |
builder.append("'UNKNOW'::geometry");
|
|
56 |
builder.append("CAST('UNKNOW' AS geometry)");
|
|
39 | 57 |
} |
40 | 58 |
return builder.toString(); |
41 | 59 |
} |
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.geometry/org.gvsig.expressionevaluator.geometry.lib/org.gvsig.expressionevaluator.geometry.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestOptimizer.java | ||
---|---|---|
151 | 151 |
// System.out.println("Tiempo de optimizacion: " + (System.currentTimeMillis() - t1)); |
152 | 152 |
System.out.println(code2.toString()); |
153 | 153 |
assertEquals( |
154 |
"((\"campo1\" > 10) AND ST_Intersects('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))'::geometry, \"GEOMETRY\"))",
|
|
154 |
"((\"campo1\" > 10) AND ST_Intersects(ST_SETSRID(ST_GEOMFROMTEXT('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))'),4326), \"GEOMETRY\"))",
|
|
155 | 155 |
code2.toString() |
156 | 156 |
); |
157 | 157 |
|
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/function/dataaccess/AbstractSelectFunction.java | ||
---|---|---|
162 | 162 |
} |
163 | 163 |
} |
164 | 164 |
|
165 |
protected Code replaceLocalVariables(Interpreter interpreter, Code expression, FeatureType currentType) { |
|
166 |
try { |
|
167 |
SymbolTable symbolTable = interpreter.getSymbolTable(); |
|
168 |
TableAttributeHandler table = (TableAttributeHandler) symbolTable.value(SYMBOL_CURRENT_TABLE); |
|
169 |
List<Pair<Code, Code>> replaces = new ArrayList<>(); |
|
170 |
CodeBuilder codeBuilder = ExpressionUtils.createCodeBuilder(); |
|
171 |
Code expression2 = expression.clone(); |
|
172 |
expression2.accept((Object o) -> { |
|
173 |
if (o == null) { |
|
174 |
return; |
|
175 |
} |
|
176 |
Code code = (Code) o; |
|
177 |
switch (code.code()) { |
|
178 |
case Code.IDENTIFIER: |
|
179 |
Code.Identifier id = (Code.Identifier) code; |
|
180 |
if (currentType.getAttributeDescriptor(id.name()) == null && symbolTable.exists(id.name())) { |
|
181 |
Object value = symbolTable.value(id.name()); |
|
182 |
replaces.add( |
|
183 |
new ImmutablePair<>( |
|
184 |
id, |
|
185 |
codeBuilder.constant(value) |
|
186 |
) |
|
187 |
); |
|
188 |
} |
|
189 |
break; |
|
190 |
} |
|
191 |
}); |
|
192 |
if (replaces.isEmpty()) { |
|
193 |
return expression; |
|
194 |
} |
|
195 |
for (Pair<Code, Code> replace : replaces) { |
|
196 |
if (replace != null) { |
|
197 |
expression2.replace(replace.getLeft(), replace.getRight()); |
|
198 |
} |
|
199 |
} |
|
200 |
return expression2; |
|
201 |
} catch (Exception ex) { |
|
202 |
throw new ExpressionRuntimeException("Can't remove references to outer tables.", ex); |
|
203 |
} |
|
204 |
} |
|
205 |
|
|
165 | 206 |
protected DataStore getStore(String storeName) { |
166 | 207 |
DataManager dataManager = DALLocator.getDataManager(); |
167 | 208 |
DataStore store = dataManager.getStoresRepository().getStore(storeName); |
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/function/dataaccess/SelectFunction.java | ||
---|---|---|
127 | 127 |
Callable order = getTupleOrNull(args, ORDER); |
128 | 128 |
Callable order_mode = getTupleOrNull(args, ORDER_MODE); |
129 | 129 |
FeatureQueryOrder queryOrder = null; |
130 |
if (order != null || order_mode != null) { |
|
131 |
for (int n = 0; n < order.parameters().size(); n++) { |
|
132 |
if (queryOrder == null) { |
|
133 |
queryOrder = new DefaultFeatureQueryOrder(); |
|
134 |
} |
|
135 |
Boolean mode = (Boolean) ((Code.Constant)order_mode.parameters().get(n)).value(); |
|
136 |
Code memberCode = order.parameters().get(n); |
|
137 |
if(memberCode.code() == Code.IDENTIFIER) { |
|
138 |
queryOrder.add(((Code.Identifier)memberCode).name(), mode); |
|
139 |
} else { |
|
140 |
Expression exp = ExpressionUtils.createExpression(memberCode.toString()); |
|
141 |
queryOrder.add(exp, mode); |
|
142 |
} |
|
143 |
} |
|
144 |
} |
|
145 |
String intovar = null; |
|
146 |
if( args.size()>INTOVAR ) { |
|
147 |
intovar = this.getIdentifier(args, INTOVAR); |
|
148 |
} |
|
149 | 130 |
FeatureStore featureStore; |
150 | 131 |
try { |
151 | 132 |
featureStore = this.getFeatureStore(storeName); |
152 | 133 |
if (featureStore == null) { |
153 | 134 |
throw new ExpressionRuntimeException("Cant locate the feature store '" + storeName + "' in function '" + this.name() + "'."); |
154 | 135 |
} |
136 |
if (order != null || order_mode != null) { |
|
137 |
for (int n = 0; n < order.parameters().size(); n++) { |
|
138 |
if (queryOrder == null) { |
|
139 |
queryOrder = new DefaultFeatureQueryOrder(); |
|
140 |
} |
|
141 |
Boolean mode = (Boolean) ((Code.Constant)order_mode.parameters().get(n)).value(); |
|
142 |
Code memberCode = order.parameters().get(n); |
|
143 |
if(memberCode.code() == Code.IDENTIFIER) { |
|
144 |
queryOrder.add(((Code.Identifier)memberCode).name(), mode); |
|
145 |
} else { |
|
146 |
Code memberCode2 = replaceLocalVariables(interpreter, memberCode, featureStore.getDefaultFeatureTypeQuietly()); |
|
147 |
Expression exp = ExpressionUtils.createExpression(memberCode2.toString()); |
|
148 |
queryOrder.add(exp, mode); |
|
149 |
} |
|
150 |
} |
|
151 |
} |
|
152 |
String intovar = null; |
|
153 |
if( args.size()>INTOVAR ) { |
|
154 |
intovar = this.getIdentifier(args, INTOVAR); |
|
155 |
} |
|
155 | 156 |
List<Feature> features; |
156 | 157 |
FeatureQuery query = featureStore.createFeatureQuery(); |
157 | 158 |
if (where != null) { |
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/JDBCHelperBase.java | ||
---|---|---|
519 | 519 |
switch (column.getType()) { |
520 | 520 |
case DataTypes.GEOMETRY: |
521 | 521 |
value = this.getGeometryFromColumn(rs, rsIndex++); |
522 |
if (value != null){ |
|
523 |
((Geometry)value).setProjection(column.getSRS()); |
|
524 |
} |
|
522 | 525 |
break; |
523 | 526 |
default: |
524 | 527 |
value = rs.getObject(rsIndex++); |
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.h2spatial/org.gvsig.h2spatial.h2gis132/org.gvsig.h2spatial.h2gis132.provider/src/main/java/org/gvsig/fmap/dal/store/h2/expressionbuilderformatter/H2SpatialFormatter.java | ||
---|---|---|
3 | 3 |
import org.gvsig.expressionevaluator.ExpressionBuilder; |
4 | 4 |
import org.gvsig.expressionevaluator.ExpressionBuilder.Value; |
5 | 5 |
import org.gvsig.expressionevaluator.Formatter; |
6 |
import org.gvsig.expressionevaluator.spi.formatter.value.Cast; |
|
6 | 7 |
import org.gvsig.fmap.dal.DALLocator; |
7 | 8 |
import org.gvsig.fmap.dal.SQLBuilder; |
8 | 9 |
import org.gvsig.fmap.dal.store.jdbc2.spi.expressionbuilder.formatters.$Constant; |
... | ... | |
50 | 51 |
new ToDouble(this.builder, this), |
51 | 52 |
new ToLong(this.builder, this), |
52 | 53 |
new ToString(this.builder, this), |
54 |
new Cast(this), |
|
53 | 55 |
DALLocator.getDataManager().createDALExpressionBuilder().formatter(this), |
54 | 56 |
}; |
55 | 57 |
} |
Also available in: Unified diff