Revision 44010 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/SubstOperator.java

View differences:

SubstOperator.java
1 1
package org.gvsig.expressionevaluator.impl.function.operator;
2 2

  
3
import org.gvsig.expressionevaluator.Code;
3 4
import org.gvsig.expressionevaluator.Function;
4 5
import org.gvsig.expressionevaluator.Interpreter;
6
import org.gvsig.expressionevaluator.Optimizer;
7
import org.gvsig.expressionevaluator.Optimizer.FunctionOptimizer;
5 8

  
6
public class SubstOperator extends AbstractBinaryOperator {
7

  
9
public class SubstOperator 
10
        extends AbstractBinaryOperator 
11
        implements FunctionOptimizer
12
    {
8 13
    public SubstOperator() {
9 14
        super(Function.GROUP_NUMERIC,"-");
10 15
    }
......
35 40
        }
36 41
        throw new IllegalArgumentException("Types not allowed in '"+name()+"' operand.");
37 42
    }
43
    
44
    @Override
45
    public Code optimize(Optimizer optimizer, Code.Caller caller) {
46
        Code op1 = optimizer.optimize(caller.args().get(0));
47
        Code op2 = optimizer.optimize(caller.args().get(1));
48
        
49
        if ( op1.code() == Code.CONSTANT && op2.code() == Code.CONSTANT) {
50
            Code newCode = optimizer.getCodeBuilder().constant(
51
                    call(
52
                            optimizer.getInterpreter(), 
53
                            ((Code.Constant)op1).value(), 
54
                            ((Code.Constant)op2).value()
55
                    )
56
            );
57
            return newCode;
58
            
59
        } else if ( op2.code() == Code.CONSTANT ) {
60
            Object value = ((Code.Constant)op2).value();
61
            if( value instanceof Number ) {
62
                double n = ((Number) value).doubleValue();
63
                if( n == 0 ) {
64
                    return op1;
65
                }
66
            }
67
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
68
            return newCode;
69
        }
38 70

  
71
        return caller;
72
    }
73

  
39 74
}

Also available in: Unified diff