Statistics
| Revision:

svn-gvsig-desktop / 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 @ 46505

History | View | Annotate | Download (2.91 KB)

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

    
3
import java.math.BigDecimal;
4
import org.gvsig.expressionevaluator.Code;
5
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_SUBST;
6
import org.gvsig.expressionevaluator.Function;
7
import org.gvsig.expressionevaluator.Interpreter;
8
import org.gvsig.expressionevaluator.Optimizer;
9
import org.gvsig.expressionevaluator.Optimizer.FunctionOptimizer;
10

    
11
public class SubstOperator 
12
        extends AbstractBinaryOperator 
13
        implements FunctionOptimizer
14
    {
15
    
16
    public SubstOperator() {
17
        super(Function.GROUP_NUMERIC, OPERATOR_SUBST, true);
18
    }
19

    
20
    @Override
21
    public boolean allowConstantFolding() {
22
        return true;
23
    }
24
    
25
    @Override
26
    public Object call(Interpreter interpreter, Object op1, Object op2) {
27
        if (op1 == null || op2 == null) {
28
            return null;
29
        }
30
        int type = this.getType(op1, op2);
31
        if( (type & TYPE_BIGDECIMAL) == TYPE_BIGDECIMAL ) {
32
            BigDecimal value = getBigDecimal(op1,1).subtract(getBigDecimal(op2,2));
33
            return value;
34
        }
35
        if( (type & TYPE_DOUBLE) == TYPE_DOUBLE ) {
36
            double value = getDouble(op1,1) - getDouble(op2,2);
37
            checkDoubleValue(value);
38
            return value;
39
        }
40
        if( (type & TYPE_FLOAT) == TYPE_FLOAT ) {
41
            double value = getFloat(op1,1) - getFloat(op2,2);
42
            checkDoubleValue(value);
43
            return value;
44
        }
45
        if( (type & TYPE_LONG) == TYPE_LONG ) {
46
            long value = getLong(op1,1) - getLong(op2,2);
47
            return value;
48
        }
49
        if( (type & TYPE_INT) == TYPE_INT ) {
50
            int value = getInt(op1,1) - getInt(op2,2);
51
            return value;
52
        }
53
        throw new IllegalArgumentException("Types not allowed in '"+name()+"' operand.");
54
    }
55
    
56
    @Override
57
    public Code optimize(Optimizer optimizer, Code.Callable caller) {
58
        Code op1 = optimizer.optimize(caller.parameters().get(0));
59
        Code op2 = optimizer.optimize(caller.parameters().get(1));
60
        
61
        if ( op1.code() == Code.CONSTANT && op2.code() == Code.CONSTANT) {
62
            Code newCode = optimizer.getCodeBuilder().constant(
63
                    call(
64
                            optimizer.getInterpreter(), 
65
                            ((Code.Constant)op1).value(), 
66
                            ((Code.Constant)op2).value()
67
                    )
68
            );
69
            return newCode;
70
            
71
        } else if ( op2.code() == Code.CONSTANT ) {
72
            Object value = ((Code.Constant)op2).value();
73
            if( value instanceof Number ) {
74
                double n = ((Number) value).doubleValue();
75
                if( n == 0 ) {
76
                    return op1;
77
                }
78
            }
79
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
80
            return newCode;
81
        }
82

    
83
        return caller;
84
    }
85

    
86
}