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 43512 jjdelcerro
package org.gvsig.expressionevaluator.impl.function.operator;
2
3 46005 omartinez
import java.math.BigDecimal;
4 44010 jjdelcerro
import org.gvsig.expressionevaluator.Code;
5 44207 jjdelcerro
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_SUBST;
6 43521 jjdelcerro
import org.gvsig.expressionevaluator.Function;
7
import org.gvsig.expressionevaluator.Interpreter;
8 44010 jjdelcerro
import org.gvsig.expressionevaluator.Optimizer;
9
import org.gvsig.expressionevaluator.Optimizer.FunctionOptimizer;
10 43521 jjdelcerro
11 44010 jjdelcerro
public class SubstOperator
12
        extends AbstractBinaryOperator
13
        implements FunctionOptimizer
14
    {
15 44207 jjdelcerro
16 43512 jjdelcerro
    public SubstOperator() {
17 44207 jjdelcerro
        super(Function.GROUP_NUMERIC, OPERATOR_SUBST, true);
18 43512 jjdelcerro
    }
19
20
    @Override
21 44009 jjdelcerro
    public boolean allowConstantFolding() {
22
        return true;
23
    }
24
25
    @Override
26 45307 omartinez
    public Object call(Interpreter interpreter, Object op1, Object op2) {
27
        if (op1 == null || op2 == null) {
28
            return null;
29
        }
30 43512 jjdelcerro
        int type = this.getType(op1, op2);
31 46005 omartinez
        if( (type & TYPE_BIGDECIMAL) == TYPE_BIGDECIMAL ) {
32
            BigDecimal value = getBigDecimal(op1,1).subtract(getBigDecimal(op2,2));
33
            return value;
34
        }
35 43512 jjdelcerro
        if( (type & TYPE_DOUBLE) == TYPE_DOUBLE ) {
36 44855 jjdelcerro
            double value = getDouble(op1,1) - getDouble(op2,2);
37 46505 fdiaz
            checkDoubleValue(value);
38 43512 jjdelcerro
            return value;
39
        }
40
        if( (type & TYPE_FLOAT) == TYPE_FLOAT ) {
41 44855 jjdelcerro
            double value = getFloat(op1,1) - getFloat(op2,2);
42 46505 fdiaz
            checkDoubleValue(value);
43 43512 jjdelcerro
            return value;
44
        }
45
        if( (type & TYPE_LONG) == TYPE_LONG ) {
46 44855 jjdelcerro
            long value = getLong(op1,1) - getLong(op2,2);
47 43512 jjdelcerro
            return value;
48
        }
49
        if( (type & TYPE_INT) == TYPE_INT ) {
50 44855 jjdelcerro
            int value = getInt(op1,1) - getInt(op2,2);
51 43512 jjdelcerro
            return value;
52
        }
53
        throw new IllegalArgumentException("Types not allowed in '"+name()+"' operand.");
54
    }
55 44010 jjdelcerro
56
    @Override
57 44752 jjdelcerro
    public Code optimize(Optimizer optimizer, Code.Callable caller) {
58 44198 jjdelcerro
        Code op1 = optimizer.optimize(caller.parameters().get(0));
59
        Code op2 = optimizer.optimize(caller.parameters().get(1));
60 44010 jjdelcerro
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 43512 jjdelcerro
83 44010 jjdelcerro
        return caller;
84
    }
85
86 43512 jjdelcerro
}