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 |
} |