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 / programming / CaseFunction.java @ 47734

History | View | Annotate | Download (5.41 KB)

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

    
3
import org.apache.commons.lang3.Range;
4
import org.gvsig.expressionevaluator.Code;
5
import org.gvsig.expressionevaluator.Codes;
6
import org.gvsig.expressionevaluator.Formatter;
7
import org.gvsig.expressionevaluator.Function;
8
import org.gvsig.expressionevaluator.Interpreter;
9
import org.gvsig.expressionevaluator.PrettyFormatter;
10
import org.gvsig.expressionevaluator.spi.AbstractFunction;
11
import org.gvsig.tools.ToolsLocator;
12
import org.gvsig.tools.dataTypes.DataTypes;
13
import org.gvsig.tools.dataTypes.Coercion;
14

    
15
public class CaseFunction extends AbstractFunction {
16

    
17
    public static final String NAME = "CASE";
18

    
19
    public CaseFunction() {
20
        super(Function.GROUP_PROGRAMMING, 
21
                NAME, 
22
                Range.between(2, Integer.MAX_VALUE),
23
                "",
24
                "CASE\n  WHEN {{condition}} THEN PASS\n  ELSE PASS\nEND CASE\n",
25
                null,
26
                "Object",
27
                true
28
        );
29
    }
30

    
31
    @Override
32
    public boolean isHidden() {
33
      return true;
34
    }
35
    
36
    @Override
37
    public boolean useArgumentsInsteadObjects() {
38
        return true;
39
    }
40

    
41
    @Override
42
    public boolean allowConstantFolding() {
43
        return false;
44
    }
45
    
46
    @Override
47
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
48
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
49
    }
50
    
51
    @Override
52
    public Object call(Interpreter interpreter, Codes args) throws Exception {
53
        // CASE(cond1, cond2, cond3,... condN, expr1, expr2, expr3... exprN, exprElse)
54
        //      0      1      2                3      4      5               6
55
        Coercion toBoolean = ToolsLocator.getDataTypesManager().getCoercion(DataTypes.BOOLEAN);
56
        int count;
57
        int firstValue;
58
        int elseValue;
59
        
60
        if( (args.size() % 2) == 0) {
61
            count = args.size() / 2;
62
            firstValue = count;
63
            elseValue = -1;
64
        } else {
65
            count = (args.size()-1) / 2;
66
            firstValue = count;
67
            elseValue = args.size()-1;
68
        }
69
        boolean needElse = true;
70
        Object value = null;
71
        for( int n=0; n<count; n++ ) {
72
            Object condition_o = getObject(interpreter, args, n);
73
            Boolean condition = (Boolean) toBoolean.coerce(condition_o);
74
            if( condition!=null && condition==true ) {
75
                needElse = false;
76
                value = getObject(interpreter, args, n+firstValue);
77
                return value;
78
            }
79
        }
80
        if( needElse && elseValue>0 ) {
81
            value = getObject(interpreter, args, elseValue);        
82
        }
83
        return value;
84
    }
85
    
86
    @Override
87
    public String toString(Codes args, Formatter<Code> formatter) {
88
        
89
        PrettyFormatter builder = PrettyFormatter.get(formatter);
90
        try {
91
            builder.push();
92
        
93
            int count;
94
            int firstValue;
95
            int elseValue;
96
            Code codeElse = null;
97

    
98
            if( (args.size() % 2) == 0) {
99
                count = args.size() / 2;
100
                firstValue = count;
101
                elseValue = -1;
102
            } else {
103
                count = (args.size()-1) / 2;
104
                firstValue = count;
105
                elseValue = args.size()-1;
106
                codeElse = (elseValue>0)? args.get(elseValue):null;
107
            }
108

    
109
            builder.append("CASE ");
110
            builder.indent();            
111
            for( int n=0; n<count; n++ ) {
112
                builder.nl();
113
                builder.append("WHEN ");
114
                builder.append(args.get(n).toString(formatter));
115
                builder.append(" THEN ");
116
                builder.indent();
117
                builder.nl();
118
                Code codeBody = args.get(n+firstValue);
119
                if( Code.isFunction(codeBody,"BLOCK") ) {
120
                    Code.Callable block = (Code.Callable)codeBody;
121
                    for (Code parameter : block.parameters()) {
122
                        builder.nl();
123
                        builder.append(parameter.toString(formatter));
124
                        builder.append("; ");
125
                    }
126
                } else {
127
                    builder.nl();
128
                    builder.append(codeBody.toString(formatter));
129
                    builder.append("; ");
130
                }                   
131
                builder.unindent();
132
            }
133
            if( codeElse!=null) {
134
                builder.nl();
135
                builder.append("ELSE ");
136
                builder.indent();
137
                builder.nl();
138
                if( Code.isFunction(codeElse,"BLOCK") ) {
139
                    Code.Callable block = (Code.Callable)codeElse;
140
                    for (Code parameter : block.parameters()) {
141
                        builder.nl();
142
                        builder.append(parameter.toString(formatter));
143
                        builder.append("; ");
144
                    }
145
                } else {
146
                    builder.nl();
147
                    builder.append(codeElse.toString(formatter));
148
                    builder.append("; ");
149
                }                   
150
                builder.unindent();
151
            }
152
            builder.unindent();
153
            builder.nl();
154
            builder.append("END");
155

    
156
            return builder.build();
157
        } finally {
158
            builder.pop();
159
        }
160
    }
161
}