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 / typeconversion / CastFunction.java @ 47320

History | View | Annotate | Download (3.43 KB)

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

    
3
import java.util.Iterator;
4
import java.util.function.Function;
5
import org.apache.commons.lang3.Range;
6
import org.gvsig.expressionevaluator.Code;
7
import org.gvsig.expressionevaluator.Codes;
8
import org.gvsig.expressionevaluator.ExpressionBuilder;
9
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_CAST;
10
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_GETATTR;
11
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
12
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
13
import org.gvsig.expressionevaluator.ExpressionRuntimeException;
14
import org.gvsig.expressionevaluator.Formatter;
15
import org.gvsig.expressionevaluator.Interpreter;
16
import org.gvsig.expressionevaluator.spi.AbstractFunction;
17
import org.gvsig.tools.ToolsLocator;
18
import org.gvsig.tools.dataTypes.Coercion;
19
import org.gvsig.tools.dataTypes.DataType;
20
import org.gvsig.tools.dataTypes.DataTypes;
21
import org.gvsig.tools.dataTypes.DataTypesManager;
22

    
23
public class CastFunction extends AbstractFunction {
24
    
25
    public CastFunction() {
26
        super(
27
                GROUP_CONVERSION, 
28
                FUNCTION_CAST, 
29
                Range.is(2),
30
                "",
31
                "CAST( {{value}} AS type_identifier)",
32
                null,
33
                null,
34
                true
35
        );
36
    }
37

    
38
    @Override
39
    public boolean allowConstantFolding() {
40
        return true;
41
    }
42
    
43
    @Override
44
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
45
        DataTypesManager manager = ToolsLocator.getDataTypesManager();
46

    
47
        Object valueIn = this.getObject(args, 0);
48
        String typeName = this.getStr(args, 1);
49
        
50
        int type = manager.getType(typeName);
51
        if( type == DataTypes.INVALID ) {
52
            throw new ExpressionRuntimeException("The value of type ("+typeName+") in function CAST is incorrect", getTip());
53
        }
54
        Coercion converter = manager.get(type).getCoercion();
55
        if( converter==null ) {
56
            throw new IllegalArgumentException("Can't convert to the indicated type ("+typeName+").");
57
        }
58
        Object valueOut = converter.coerce(valueIn);
59
        return valueOut;
60
    }
61

    
62
    private String getTip() {
63
        DataTypesManager manager = ToolsLocator.getDataTypesManager();
64
        
65
        StringBuilder builder = new StringBuilder();
66
        Iterator<DataType> it = manager.iterator();
67
        while( it.hasNext() ) {
68
            DataType dataType = it.next();
69
            builder.append("- ");
70
            builder.append(dataType.getName());
71
            builder.append("\n");
72
        }
73
        
74
        return "The valid type names for the function CAST are:\n"+ builder.toString();
75
    }
76
    
77
    @Override
78
    public String toString(Codes args, Formatter<Code> formatter) {
79
        StringBuilder builder = new StringBuilder();
80
        Code expression = args.get(0);
81
        Code typeName = args.get(1);
82
        if( typeName instanceof Code.Constant && ((Code.Constant)typeName).value() instanceof CharSequence ) {
83
          builder.append(this.name());
84
          builder.append("(");
85
          builder.append(expression.toString(formatter));
86
          builder.append(" AS ");
87
          builder.append(((Code.Constant)typeName).value().toString());
88
          builder.append(")");
89
          return builder.toString();
90
        }
91
        return super.toString(args, formatter);
92
    }
93

    
94
    
95
    
96
    
97
    
98
}