Revision 44211
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/TestCodeToValue.java | ||
---|---|---|
175 | 175 |
String source = "precio + abs(-10)"; |
176 | 176 |
|
177 | 177 |
Code code = compileExpression(source); |
178 |
assertEquals("(\"precio\" + abs(-(10)))", code.toValue().toString());
|
|
178 |
assertEquals("(\"precio\" + abs(-10))", code.toValue().toString());
|
|
179 | 179 |
} |
180 | 180 |
|
181 | 181 |
public void testPI() { |
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/TestCompiler.java | ||
---|---|---|
175 | 175 |
Compiler compiler = createCompiler(); |
176 | 176 |
|
177 | 177 |
Code code = compiler.compileExpression(source); |
178 |
assertEquals("(\"precio\" + abs(-(10)))", code.toString());
|
|
178 |
assertEquals("(\"precio\" + abs(-10))", code.toString());
|
|
179 | 179 |
} |
180 | 180 |
|
181 | 181 |
public void testPI() { |
... | ... | |
349 | 349 |
assertEquals("MID('NOMBRE', 2, 2)", code.toString()); |
350 | 350 |
} |
351 | 351 |
|
352 |
public void testDecimal1() { |
|
353 |
String source = "23.1"; |
|
354 |
|
|
355 |
Compiler compiler = createCompiler(); |
|
356 |
Code code = compiler.compileExpression(source); |
|
357 |
assertEquals("23.1", code.toString()); |
|
358 |
} |
|
359 |
|
|
360 |
public void testDecimal2() { |
|
361 |
String source = "23,1"; |
|
362 |
|
|
363 |
Compiler compiler = createCompiler(); |
|
364 |
try { |
|
365 |
Code code = compiler.compileExpression(source); |
|
366 |
fail("I expected 23,1 to be erroneous."); |
|
367 |
} catch(ExpressionSyntaxException ex) { |
|
368 |
// This is OK. |
|
369 |
} |
|
370 |
} |
|
371 |
public void testDecimal3() { |
|
372 |
String source = "1.23E4"; |
|
373 |
|
|
374 |
Compiler compiler = createCompiler(); |
|
375 |
Code code = compiler.compileExpression(source); |
|
376 |
assertEquals("12300", code.toString()); |
|
377 |
} |
|
378 |
|
|
379 |
public void testDecimal4() { |
|
380 |
String source = "1.23E-2"; |
|
381 |
|
|
382 |
Compiler compiler = createCompiler(); |
|
383 |
Code code = compiler.compileExpression(source); |
|
384 |
assertEquals("0.0123", code.toString()); |
|
385 |
} |
|
386 |
|
|
387 |
public void testDecimal5() { |
|
388 |
String source = "1.23E-4"; |
|
389 |
|
|
390 |
Compiler compiler = createCompiler(); |
|
391 |
Code code = compiler.compileExpression(source); |
|
392 |
assertEquals("1.23E-4", code.toString()); |
|
393 |
} |
|
394 |
|
|
395 |
public void testDecimal6() { |
|
396 |
String source = "-23.1"; |
|
397 |
|
|
398 |
Compiler compiler = createCompiler(); |
|
399 |
Code code = compiler.compileExpression(source); |
|
400 |
assertEquals("-23.1", code.toString()); |
|
401 |
} |
|
402 |
|
|
403 |
public void testDecimal7() { |
|
404 |
String source = "-1.23E-2"; |
|
405 |
|
|
406 |
Compiler compiler = createCompiler(); |
|
407 |
Code code = compiler.compileExpression(source); |
|
408 |
assertEquals("-0.0123", code.toString()); |
|
409 |
} |
|
410 |
|
|
411 |
public void testDecimal8() { |
|
412 |
String source = "-1.23E-4"; |
|
413 |
|
|
414 |
Compiler compiler = createCompiler(); |
|
415 |
Code code = compiler.compileExpression(source); |
|
416 |
assertEquals("-1.23E-4", code.toString()); |
|
417 |
} |
|
418 |
|
|
419 |
|
|
352 | 420 |
} |
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/TestCodeFormatter.java | ||
---|---|---|
427 | 427 |
String source = "precio + abs(-10)"; |
428 | 428 |
|
429 | 429 |
Code code = compileExpression(source); |
430 |
assertEquals("(\"precio\" + abs(-(10)))", code.toString(formatter()));
|
|
430 |
assertEquals("(\"precio\" + abs(-10))", code.toString(formatter()));
|
|
431 | 431 |
} |
432 | 432 |
|
433 | 433 |
public void testPI() { |
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/TestOptimizer.java | ||
---|---|---|
357 | 357 |
Compiler compiler = createCompiler(); |
358 | 358 |
|
359 | 359 |
Code code = compiler.compileExpression(source); |
360 |
assertEquals("(\"precio\" + abs(-(10)))", code.toString());
|
|
360 |
assertEquals("(\"precio\" + abs(-10))", code.toString());
|
|
361 | 361 |
|
362 | 362 |
SymbolTable symbolTable = createSymbolTable(); |
363 | 363 |
Optimizer optimizer = createOptimizer(symbolTable); |
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/function/operator/NegOperator.java | ||
---|---|---|
1 | 1 |
package org.gvsig.expressionevaluator.impl.function.operator; |
2 | 2 |
|
3 |
import java.math.BigDecimal; |
|
3 | 4 |
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_NEGATE; |
4 | 5 |
import org.gvsig.expressionevaluator.Function; |
5 | 6 |
import org.gvsig.expressionevaluator.Interpreter; |
... | ... | |
21 | 22 |
if( !(arg instanceof Number) ) { |
22 | 23 |
throw new IllegalArgumentException("NEGATE function require a number"); |
23 | 24 |
} |
24 |
if( arg instanceof Double ) { |
|
25 |
return -((Number)arg).doubleValue(); |
|
25 |
return negate((Number) arg); |
|
26 |
} |
|
27 |
|
|
28 |
public static Number negate(Number n) { |
|
29 |
if( n instanceof Double ) { |
|
30 |
return -((Double)n); |
|
26 | 31 |
} |
27 |
if( arg instanceof Float ) {
|
|
28 |
return -((Number)arg).floatValue();
|
|
32 |
if( n instanceof Float ) {
|
|
33 |
return -((Float)n);
|
|
29 | 34 |
} |
30 |
if( arg instanceof Long ) {
|
|
31 |
return -((Number)arg).longValue();
|
|
35 |
if( n instanceof Long ) {
|
|
36 |
return -((Long)n);
|
|
32 | 37 |
} |
33 |
if( arg instanceof Integer ) {
|
|
34 |
return -((Number)arg).intValue();
|
|
38 |
if( n instanceof Integer ) {
|
|
39 |
return -((Integer)n);
|
|
35 | 40 |
} |
36 |
return -((Number)arg).doubleValue(); |
|
41 |
if( n instanceof BigDecimal ) { |
|
42 |
return ((BigDecimal)n).negate(); |
|
43 |
} |
|
44 |
return -((Number)n).doubleValue(); |
|
37 | 45 |
} |
38 |
|
|
39 | 46 |
} |
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/DefaultCompiler.java | ||
---|---|---|
3 | 3 |
import java.util.HashMap; |
4 | 4 |
import java.util.Map; |
5 | 5 |
import org.apache.commons.lang3.StringUtils; |
6 |
import org.apache.commons.lang3.math.NumberUtils; |
|
6 | 7 |
import org.gvsig.expressionevaluator.Compiler; |
7 | 8 |
import org.gvsig.expressionevaluator.LexicalAnalyzer; |
8 | 9 |
import org.gvsig.expressionevaluator.LexicalAnalyzer.Token; |
9 | 10 |
import org.gvsig.expressionevaluator.Code; |
11 |
import org.gvsig.expressionevaluator.Code.Constant; |
|
10 | 12 |
import org.gvsig.expressionevaluator.CodeBuilder; |
11 | 13 |
import org.gvsig.expressionevaluator.Codes; |
14 |
import org.gvsig.expressionevaluator.ExpressionBuilder; |
|
12 | 15 |
import org.gvsig.expressionevaluator.ExpressionSyntaxException; |
13 | 16 |
import org.gvsig.expressionevaluator.GrammarSet; |
14 | 17 |
import org.gvsig.expressionevaluator.Statement; |
15 | 18 |
import org.gvsig.expressionevaluator.Statement.StatementContext; |
16 | 19 |
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseCodes; |
20 |
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseConstant; |
|
21 |
import org.gvsig.expressionevaluator.impl.function.operator.NegOperator; |
|
17 | 22 |
|
18 | 23 |
public class DefaultCompiler implements Compiler { |
19 | 24 |
|
... | ... | |
513 | 518 |
case Token.OP_SUBST: |
514 | 519 |
lexer.next(); |
515 | 520 |
Code code = parse_termino(); |
521 |
if( code.code()==Code.CONSTANT ) { |
|
522 |
BaseConstant c = (BaseConstant)code; |
|
523 |
if( c.value() instanceof Number ) { |
|
524 |
c.value(NegOperator.negate((Number) c.value())); |
|
525 |
return code; |
|
526 |
} |
|
527 |
// Aqui no tengo claro si deberia lanzarse una excepcion |
|
528 |
// Ya que se esta intentando aplicar el operador unario de |
|
529 |
// negacion a algo que no es un numero. Lo normal es que falle |
|
530 |
// en tiempo de ejecucion. |
|
531 |
} |
|
516 | 532 |
return codeBuilder.negate(code); |
517 | 533 |
case Token.EOF: |
518 | 534 |
throw new ExpressionSyntaxException(I18N.unexpected_end_of_source(),lexer); |
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 | ||
---|---|---|
95 | 95 |
|
96 | 96 |
class BaseConstant extends BaseCode implements Constant { |
97 | 97 |
|
98 |
private final Object value;
|
|
98 |
private Object value; |
|
99 | 99 |
|
100 | 100 |
public BaseConstant(Object value) { |
101 | 101 |
this.value = value; |
... | ... | |
111 | 111 |
return this.value; |
112 | 112 |
} |
113 | 113 |
|
114 |
public void value(Object v) { |
|
115 |
this.value = v; |
|
116 |
} |
|
117 |
|
|
114 | 118 |
@Override |
115 | 119 |
public Value toValue(ExpressionBuilder builder) { |
116 | 120 |
return builder.constant(this.value); |
Also available in: Unified diff