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 / AddOperator.java @ 44198

History | View | Annotate | Download (3.69 KB)

1 43512 jjdelcerro
package org.gvsig.expressionevaluator.impl.function.operator;
2
3 44191 jjdelcerro
import java.util.Objects;
4 44010 jjdelcerro
import org.gvsig.expressionevaluator.Code;
5
import org.gvsig.expressionevaluator.Code.Caller;
6
import org.gvsig.expressionevaluator.Code.Constant;
7 44191 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionRuntimeException;
8 43521 jjdelcerro
import org.gvsig.expressionevaluator.Function;
9
import org.gvsig.expressionevaluator.Interpreter;
10 44010 jjdelcerro
import org.gvsig.expressionevaluator.Optimizer;
11
import org.gvsig.expressionevaluator.Optimizer.FunctionOptimizer;
12 44191 jjdelcerro
import org.gvsig.expressionevaluator.impl.I18N;
13 43521 jjdelcerro
14 44010 jjdelcerro
public class AddOperator
15
        extends AbstractBinaryOperator
16
        implements FunctionOptimizer
17
    {
18 43512 jjdelcerro
19 44139 jjdelcerro
    public static final String NAME = "+";
20
21 43512 jjdelcerro
    public AddOperator() {
22 44139 jjdelcerro
        super(Function.GROUP_NUMERIC, NAME);
23 43512 jjdelcerro
    }
24
25
    @Override
26 44009 jjdelcerro
    public boolean allowConstantFolding() {
27
        return true;
28
    }
29
30
    @Override
31 43521 jjdelcerro
    public Object call(Interpreter interpreter, Object op1, Object op2) {
32 43512 jjdelcerro
        int type = this.getType(op1, op2);
33
        if( (type & TYPE_DOUBLE) == TYPE_DOUBLE ) {
34
            double value = ((Number) op1).doubleValue() + ((Number) op2).doubleValue();
35
            return value;
36
        }
37
        if( (type & TYPE_FLOAT) == TYPE_FLOAT ) {
38
            double value = ((Number) op1).floatValue() + ((Number) op2).floatValue();
39
            return value;
40
        }
41
        if( (type & TYPE_LONG) == TYPE_LONG ) {
42
            long value = ((Number) op1).longValue() + ((Number) op2).longValue();
43
            return value;
44
        }
45
        if( (type & TYPE_INT) == TYPE_INT ) {
46
            int value = ((Number) op1).intValue()+ ((Number) op2).intValue();
47
            return value;
48
        }
49 44191 jjdelcerro
        if( (type & TYPE_STRING) == TYPE_STRING ) {
50
            if( interpreter.isSQLCompatible() ) {
51
                throw new ExpressionRuntimeException(
52
                        null,
53
                        "The '"+name()+"' operator can not be used with string operands",
54
                        I18N.Use_the_operator_CONCAT_to_concatenate_strings()
55
                );
56
            }
57
            return Objects.toString(op1, "")+Objects.toString(op2, "");
58
        }
59 43512 jjdelcerro
        throw new IllegalArgumentException("Types not allowed in '"+name()+"' operand.");
60
    }
61 44010 jjdelcerro
62
    @Override
63
    public Code optimize(Optimizer optimizer, Caller caller) {
64 44198 jjdelcerro
        Code op1 = optimizer.optimize(caller.parameters().get(0));
65
        Code op2 = optimizer.optimize(caller.parameters().get(1));
66 44010 jjdelcerro
67
        if ( op1.code() == Code.CONSTANT && op2.code() == Code.CONSTANT) {
68
            Code newCode = optimizer.getCodeBuilder().constant(
69
                    call(
70
                            optimizer.getInterpreter(),
71
                            ((Constant)op1).value(),
72
                            ((Constant)op2).value()
73
                    )
74
            );
75
            return newCode;
76
77
        } else if ( op1.code() == Code.CONSTANT ) {
78
            Object value = ((Constant)op1).value();
79
            if( value instanceof Number ) {
80
                double n = ((Number) value).doubleValue();
81
                if( n == 0 ) {
82
                   return op2;
83
                }
84
            }
85
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
86
            return newCode;
87
88
        } else if ( op2.code() == Code.CONSTANT ) {
89
            Object value = ((Code.Constant)op2).value();
90
            if( value instanceof Number ) {
91
                double n = ((Number) value).doubleValue();
92
                if( n == 0 ) {
93
                    return op1;
94
                }
95
            }
96
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
97
            return newCode;
98
        }
99
100
        return caller;
101
    }
102 43512 jjdelcerro
103
}