Revision 44211

View differences:

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