Revision 44010 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/SubstOperator.java
SubstOperator.java | ||
---|---|---|
1 | 1 |
package org.gvsig.expressionevaluator.impl.function.operator; |
2 | 2 |
|
3 |
import org.gvsig.expressionevaluator.Code; |
|
3 | 4 |
import org.gvsig.expressionevaluator.Function; |
4 | 5 |
import org.gvsig.expressionevaluator.Interpreter; |
6 |
import org.gvsig.expressionevaluator.Optimizer; |
|
7 |
import org.gvsig.expressionevaluator.Optimizer.FunctionOptimizer; |
|
5 | 8 |
|
6 |
public class SubstOperator extends AbstractBinaryOperator { |
|
7 |
|
|
9 |
public class SubstOperator |
|
10 |
extends AbstractBinaryOperator |
|
11 |
implements FunctionOptimizer |
|
12 |
{ |
|
8 | 13 |
public SubstOperator() { |
9 | 14 |
super(Function.GROUP_NUMERIC,"-"); |
10 | 15 |
} |
... | ... | |
35 | 40 |
} |
36 | 41 |
throw new IllegalArgumentException("Types not allowed in '"+name()+"' operand."); |
37 | 42 |
} |
43 |
|
|
44 |
@Override |
|
45 |
public Code optimize(Optimizer optimizer, Code.Caller caller) { |
|
46 |
Code op1 = optimizer.optimize(caller.args().get(0)); |
|
47 |
Code op2 = optimizer.optimize(caller.args().get(1)); |
|
48 |
|
|
49 |
if ( op1.code() == Code.CONSTANT && op2.code() == Code.CONSTANT) { |
|
50 |
Code newCode = optimizer.getCodeBuilder().constant( |
|
51 |
call( |
|
52 |
optimizer.getInterpreter(), |
|
53 |
((Code.Constant)op1).value(), |
|
54 |
((Code.Constant)op2).value() |
|
55 |
) |
|
56 |
); |
|
57 |
return newCode; |
|
58 |
|
|
59 |
} else if ( op2.code() == Code.CONSTANT ) { |
|
60 |
Object value = ((Code.Constant)op2).value(); |
|
61 |
if( value instanceof Number ) { |
|
62 |
double n = ((Number) value).doubleValue(); |
|
63 |
if( n == 0 ) { |
|
64 |
return op1; |
|
65 |
} |
|
66 |
} |
|
67 |
Code newCode = optimizer.getCodeBuilder().operator(caller.name(), op1, op2); |
|
68 |
return newCode; |
|
69 |
} |
|
38 | 70 |
|
71 |
return caller; |
|
72 |
} |
|
73 |
|
|
39 | 74 |
} |
Also available in: Unified diff