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
package org.gvsig.expressionevaluator.impl.function.operator;
2

    
3
import java.util.Objects;
4
import org.gvsig.expressionevaluator.Code;
5
import org.gvsig.expressionevaluator.Code.Caller;
6
import org.gvsig.expressionevaluator.Code.Constant;
7
import org.gvsig.expressionevaluator.ExpressionRuntimeException;
8
import org.gvsig.expressionevaluator.Function;
9
import org.gvsig.expressionevaluator.Interpreter;
10
import org.gvsig.expressionevaluator.Optimizer;
11
import org.gvsig.expressionevaluator.Optimizer.FunctionOptimizer;
12
import org.gvsig.expressionevaluator.impl.I18N;
13

    
14
public class AddOperator 
15
        extends AbstractBinaryOperator 
16
        implements FunctionOptimizer
17
    {
18

    
19
    public static final String NAME = "+";
20

    
21
    public AddOperator() {
22
        super(Function.GROUP_NUMERIC, NAME);
23
    }
24

    
25
    @Override
26
    public boolean allowConstantFolding() {
27
        return true;
28
    }
29
    
30
    @Override
31
    public Object call(Interpreter interpreter, Object op1, Object op2) {       
32
        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
        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
        throw new IllegalArgumentException("Types not allowed in '"+name()+"' operand.");
60
    }
61

    
62
    @Override
63
    public Code optimize(Optimizer optimizer, Caller caller) {
64
        Code op1 = optimizer.optimize(caller.parameters().get(0));
65
        Code op2 = optimizer.optimize(caller.parameters().get(1));
66
        
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
    
103
}