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 / ConcatOperator.java @ 45307

History | View | Annotate | Download (2.4 KB)

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

    
3
import java.util.Objects;
4
import org.apache.commons.lang3.StringUtils;
5
import org.gvsig.expressionevaluator.Code;
6
import org.gvsig.expressionevaluator.Code.Constant;
7
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_CONCAT;
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.Code.Callable;
13

    
14
public class ConcatOperator 
15
        extends AbstractBinaryOperator 
16
        implements FunctionOptimizer
17
    {
18
    
19
    public ConcatOperator() {
20
        super(Function.GROUP_STRING, OPERATOR_CONCAT, true);
21
    }
22

    
23
    @Override
24
    public boolean allowConstantFolding() {
25
        return true;
26
    }
27
    
28
    @Override
29
    public Object call(Interpreter interpreter, Object op1, Object op2) {
30
        if (op1 == null || op2 == null) {
31
            return null;
32
        }
33
        return Objects.toString(op1, "")+Objects.toString(op2, "");
34
    }
35

    
36
    @Override
37
    public Code optimize(Optimizer optimizer, Callable caller) {
38
        Code op1 = optimizer.optimize(caller.parameters().get(0));
39
        Code op2 = optimizer.optimize(caller.parameters().get(1));
40
        
41
        if ( op1.code() == Code.CONSTANT && op2.code() == Code.CONSTANT) {
42
            Code newCode = optimizer.getCodeBuilder().constant(
43
                    call(
44
                            optimizer.getInterpreter(), 
45
                            ((Constant)op1).value(), 
46
                            ((Constant)op2).value()
47
                    )
48
            );
49
            return newCode;
50
            
51
        } else if ( op1.code() == Code.CONSTANT ) {
52
            String value = Objects.toString(((Constant)op1).value(), "");
53
            if( StringUtils.isBlank(value) ) {
54
                return op2;
55
            }
56
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
57
            return newCode;
58

    
59
        } else if ( op2.code() == Code.CONSTANT ) {
60
            String value = Objects.toString(((Constant)op2).value(), "");
61
            if( StringUtils.isBlank(value) ) {
62
                return op1;
63
            }
64
            Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2);
65
            return newCode;
66
        }
67

    
68
        return caller;
69
    }
70
    
71
}