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 / DefaultExpressionBuilder.java @ 44644
History | View | Annotate | Download (38.7 KB)
1 | 44006 | jjdelcerro | package org.gvsig.expressionevaluator.impl; |
---|---|---|---|
2 | 43020 | jjdelcerro | |
3 | import java.text.MessageFormat; |
||
4 | import java.util.ArrayList; |
||
5 | import java.util.Collections; |
||
6 | import java.util.HashSet; |
||
7 | import java.util.List; |
||
8 | import java.util.Objects; |
||
9 | import java.util.Set; |
||
10 | import org.apache.commons.lang3.StringUtils; |
||
11 | 44198 | jjdelcerro | import org.gvsig.expressionevaluator.Code; |
12 | 44274 | jjdelcerro | import org.gvsig.expressionevaluator.Expression; |
13 | 43020 | jjdelcerro | |
14 | 44006 | jjdelcerro | import org.gvsig.expressionevaluator.ExpressionBuilder; |
15 | 44198 | jjdelcerro | import static org.gvsig.expressionevaluator.ExpressionBuilder.EMPTY_FORMATTER; |
16 | 44644 | jjdelcerro | import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_CONSTANT; |
17 | import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE; |
||
18 | import org.gvsig.expressionevaluator.ExpressionEvaluatorManager; |
||
19 | 44198 | jjdelcerro | import org.gvsig.expressionevaluator.ExpressionUtils; |
20 | import org.gvsig.expressionevaluator.Formatter; |
||
21 | 43093 | jjdelcerro | |
22 | 44198 | jjdelcerro | @SuppressWarnings({"UseSpecificCatch" ,"OverridableMethodCallInConstructor"}) |
23 | 44006 | jjdelcerro | public class DefaultExpressionBuilder implements ExpressionBuilder { |
24 | 44198 | jjdelcerro | |
25 | private static final String FORMAT_QUOTE_FOR_STRINGS = "'"; |
||
26 | private static final String FORMAT_QUOTE_FOR_IDENTIFIERS = "\""; |
||
27 | 44006 | jjdelcerro | |
28 | 44198 | jjdelcerro | private static final String FORMAT_TRUE = "TRUE"; |
29 | private static final String FORMAT_FALSE = "FALSE"; |
||
30 | 43020 | jjdelcerro | |
31 | 44198 | jjdelcerro | private static final String FORMAT_GROUP = "( {0} )"; |
32 | 43093 | jjdelcerro | |
33 | 44198 | jjdelcerro | private static final String FORMAT_ISNULL = "( ({0}) IS NULL )"; |
34 | 44361 | jjdelcerro | private static final String FORMAT_NOTISNULL = "( ({0}) IS NOT NULL )"; |
35 | 44198 | jjdelcerro | private static final String FORMAT_OPERATOR_NOT = "( NOT ({0}) )"; |
36 | 43093 | jjdelcerro | |
37 | 44262 | jjdelcerro | private static final String FORMAT_OPERATOR_AND = "({0} AND {1})"; |
38 | 44198 | jjdelcerro | private static final String FORMAT_OPERATOR_OR = "{0} OR {1}"; |
39 | private static final String FORMAT_OPERATOR_EQ = "( ({0}) = ({1}) )"; |
||
40 | private static final String FORMAT_OPERATOR_NE = "( ({0}) <> ({1}) )"; |
||
41 | private static final String FORMAT_OPERATOR_GT = "( ({0}) > ({1}) )"; |
||
42 | private static final String FORMAT_OPERATOR_GE = "( ({0}) >= ({1}) )"; |
||
43 | private static final String FORMAT_OPERATOR_LT = "( ({0}) < ({1}) )"; |
||
44 | private static final String FORMAT_OPERATOR_LE = "( ({0}) <= ({1}) )"; |
||
45 | private static final String FORMAT_OPERATOR_LIKE = "( ({0}) LIKE ({1}) )"; |
||
46 | private static final String FORMAT_OPERATOR_ILIKE = "( ({0}) ILIKE ({1}) )"; |
||
47 | private static final String FORMAT_OPERATOR_ADD = "{0} + {1}"; |
||
48 | private static final String FORMAT_OPERATOR_SUBST = "{0} - {1}"; |
||
49 | 44262 | jjdelcerro | private static final String FORMAT_OPERATOR_MULT = "({0} * {1})"; |
50 | private static final String FORMAT_OPERATOR_DIV = "({0} / {1})"; |
||
51 | 44198 | jjdelcerro | private static final String FORMAT_OPERATOR_CONCAT = "{0} || {1}"; |
52 | 43093 | jjdelcerro | |
53 | 44644 | jjdelcerro | public static class GroupBase extends AbstractValue implements Group { |
54 | 43093 | jjdelcerro | |
55 | 43020 | jjdelcerro | protected Value value;
|
56 | 43093 | jjdelcerro | |
57 | 43020 | jjdelcerro | public GroupBase(Value value) {
|
58 | this.value = value;
|
||
59 | } |
||
60 | |||
61 | @Override
|
||
62 | 44198 | jjdelcerro | public Value value() {
|
63 | 43020 | jjdelcerro | return value;
|
64 | } |
||
65 | |||
66 | @Override
|
||
67 | public void accept(Visitor visitor, VisitorFilter filter) { |
||
68 | 43093 | jjdelcerro | super.accept(visitor, filter);
|
69 | this.value.accept(visitor, filter);
|
||
70 | 43020 | jjdelcerro | } |
71 | 43093 | jjdelcerro | |
72 | 43020 | jjdelcerro | @Override
|
73 | 44376 | jjdelcerro | public void replace(Value target, Value replacement) { |
74 | if( this.value == target ) { |
||
75 | this.value = replacement;
|
||
76 | } else {
|
||
77 | this.value.replace(target, replacement);
|
||
78 | } |
||
79 | } |
||
80 | |||
81 | @Override
|
||
82 | 43020 | jjdelcerro | public String toString() { |
83 | 44198 | jjdelcerro | return this.toString(EMPTY_FORMATTER); |
84 | 43020 | jjdelcerro | } |
85 | 44198 | jjdelcerro | |
86 | @Override
|
||
87 | public String toString(Formatter<Value> formatter) { |
||
88 | 44296 | jjdelcerro | if( formatter!=null && formatter.canApply(this) ) { |
89 | 44198 | jjdelcerro | return formatter.format(this); |
90 | } |
||
91 | return MessageFormat.format(FORMAT_GROUP, this.value.toString()); |
||
92 | } |
||
93 | 43020 | jjdelcerro | } |
94 | |||
95 | 44644 | jjdelcerro | public static class VariableBase extends AbstractValue implements Variable { |
96 | 43093 | jjdelcerro | |
97 | 43020 | jjdelcerro | protected String name; |
98 | 44644 | jjdelcerro | protected ExpressionBuilder builder;
|
99 | |||
100 | public VariableBase(ExpressionBuilder builder, String name) { |
||
101 | 43020 | jjdelcerro | this.name = name;
|
102 | 44644 | jjdelcerro | this.builder = builder;
|
103 | 43020 | jjdelcerro | } |
104 | 43093 | jjdelcerro | |
105 | 43020 | jjdelcerro | @Override
|
106 | 44198 | jjdelcerro | public String name() { |
107 | 43020 | jjdelcerro | return this.name; |
108 | } |
||
109 | |||
110 | @Override
|
||
111 | public String toString() { |
||
112 | 44198 | jjdelcerro | return this.toString(EMPTY_FORMATTER); |
113 | } |
||
114 | |||
115 | @Override
|
||
116 | public String toString(Formatter<Value> formatter) { |
||
117 | 44296 | jjdelcerro | if( formatter!=null && formatter.canApply(this) ) { |
118 | 44198 | jjdelcerro | return formatter.format(this); |
119 | } |
||
120 | 44644 | jjdelcerro | return this.builder.identifier(this.name); |
121 | 43020 | jjdelcerro | } |
122 | |||
123 | @Override
|
||
124 | public int compareTo(Variable o) { |
||
125 | 44198 | jjdelcerro | return this.name.compareTo(o.name()); |
126 | 43020 | jjdelcerro | } |
127 | |||
128 | @Override
|
||
129 | public boolean equals(Object obj) { |
||
130 | 43093 | jjdelcerro | if (!(obj instanceof Variable)) { |
131 | 43020 | jjdelcerro | return false; |
132 | } |
||
133 | 44198 | jjdelcerro | return this.name.equals(((Variable) obj).name()); |
134 | 43020 | jjdelcerro | } |
135 | |||
136 | @Override
|
||
137 | public int hashCode() { |
||
138 | int hash = 7; |
||
139 | hash = 37 * hash + Objects.hashCode(this.name); |
||
140 | return hash;
|
||
141 | } |
||
142 | } |
||
143 | |||
144 | 44644 | jjdelcerro | public static class ParameterBase extends AbstractValue implements Parameter { |
145 | 43093 | jjdelcerro | |
146 | protected String name; |
||
147 | 43020 | jjdelcerro | protected Object value; |
148 | 44644 | jjdelcerro | protected int type; |
149 | 43093 | jjdelcerro | |
150 | public ParameterBase() {
|
||
151 | 44644 | jjdelcerro | this.type = PARAMETER_TYPE_CONSTANT;
|
152 | 43093 | jjdelcerro | this.name = null; |
153 | this.value = null; |
||
154 | 43020 | jjdelcerro | } |
155 | |||
156 | @Override
|
||
157 | public Parameter as_constant() {
|
||
158 | 44644 | jjdelcerro | this.type = PARAMETER_TYPE_CONSTANT;
|
159 | 43093 | jjdelcerro | if (this.value == null && this.name != null) { |
160 | this.value = this.name; |
||
161 | } |
||
162 | 43020 | jjdelcerro | return this; |
163 | } |
||
164 | 43093 | jjdelcerro | |
165 | 43020 | jjdelcerro | @Override
|
166 | public Parameter as_variable() {
|
||
167 | 44644 | jjdelcerro | this.type = PARAMETER_TYPE_VARIABLE;
|
168 | 43093 | jjdelcerro | if (this.value != null && this.name == null) { |
169 | this.name = (String) this.value; |
||
170 | } |
||
171 | 43020 | jjdelcerro | return this; |
172 | } |
||
173 | 44644 | jjdelcerro | |
174 | 43020 | jjdelcerro | @Override
|
175 | 44198 | jjdelcerro | public String name() { |
176 | 43093 | jjdelcerro | switch (this.type) { |
177 | 44644 | jjdelcerro | case PARAMETER_TYPE_VARIABLE:
|
178 | 43093 | jjdelcerro | return this.name; |
179 | 44644 | jjdelcerro | case PARAMETER_TYPE_CONSTANT:
|
180 | 43093 | jjdelcerro | if (this.value == null) { |
181 | return null; |
||
182 | } |
||
183 | return this.value.toString(); |
||
184 | 43020 | jjdelcerro | default:
|
185 | 43093 | jjdelcerro | if (this.name != null) { |
186 | return this.name; |
||
187 | } |
||
188 | if (this.value != null) { |
||
189 | return this.value.toString(); |
||
190 | } |
||
191 | 43020 | jjdelcerro | return null; |
192 | } |
||
193 | } |
||
194 | |||
195 | @Override
|
||
196 | 44644 | jjdelcerro | public int type() { |
197 | return this.type; |
||
198 | 43020 | jjdelcerro | } |
199 | |||
200 | @Override
|
||
201 | 44644 | jjdelcerro | public boolean is_constant() { |
202 | return this.type == PARAMETER_TYPE_CONSTANT; |
||
203 | 43020 | jjdelcerro | } |
204 | |||
205 | @Override
|
||
206 | public boolean is_variable() { |
||
207 | 44644 | jjdelcerro | return this.type == PARAMETER_TYPE_VARIABLE; |
208 | 43020 | jjdelcerro | } |
209 | |||
210 | @Override
|
||
211 | 43093 | jjdelcerro | public Parameter value(Object value) { |
212 | this.value = value;
|
||
213 | return this; |
||
214 | } |
||
215 | |||
216 | @Override
|
||
217 | public Parameter name(String name) { |
||
218 | 44644 | jjdelcerro | this.type = PARAMETER_TYPE_VARIABLE;
|
219 | 43093 | jjdelcerro | this.name = name;
|
220 | return this; |
||
221 | } |
||
222 | |||
223 | @Override
|
||
224 | 44198 | jjdelcerro | public Object value() { |
225 | 43020 | jjdelcerro | try {
|
226 | 43093 | jjdelcerro | switch (this.type) { |
227 | 44644 | jjdelcerro | case PARAMETER_TYPE_CONSTANT:
|
228 | 43020 | jjdelcerro | return this.value; |
229 | 44644 | jjdelcerro | case PARAMETER_TYPE_VARIABLE:
|
230 | 43020 | jjdelcerro | default:
|
231 | 44644 | jjdelcerro | return this.name; |
232 | 43020 | jjdelcerro | } |
233 | 43093 | jjdelcerro | } catch (Exception ex) { |
234 | throw new RuntimeException("Can't get value from parameter.", ex); |
||
235 | 43020 | jjdelcerro | } |
236 | } |
||
237 | |||
238 | @Override
|
||
239 | public String toString() { |
||
240 | 44198 | jjdelcerro | return this.toString(EMPTY_FORMATTER); |
241 | } |
||
242 | |||
243 | @Override
|
||
244 | public String toString(Formatter<Value> formatter) { |
||
245 | 44296 | jjdelcerro | if( formatter!=null && formatter.canApply(this) ) { |
246 | 44198 | jjdelcerro | return formatter.format(this); |
247 | } |
||
248 | 43093 | jjdelcerro | switch (this.type) { |
249 | 44644 | jjdelcerro | case PARAMETER_TYPE_CONSTANT:
|
250 | return Objects.toString(this.value); |
||
251 | |||
252 | case PARAMETER_TYPE_VARIABLE:
|
||
253 | 43020 | jjdelcerro | default:
|
254 | return "?"; |
||
255 | } |
||
256 | 43093 | jjdelcerro | } |
257 | 43020 | jjdelcerro | } |
258 | |||
259 | 44644 | jjdelcerro | public static class ConstantBase extends AbstractValue implements Constant { |
260 | 43093 | jjdelcerro | |
261 | 43020 | jjdelcerro | protected Object value; |
262 | 44644 | jjdelcerro | protected ExpressionBuilder builder;
|
263 | |||
264 | public ConstantBase(ExpressionBuilder builder, Object value) { |
||
265 | 43020 | jjdelcerro | this.value = value;
|
266 | 44644 | jjdelcerro | this.builder = builder;
|
267 | 43020 | jjdelcerro | } |
268 | 43093 | jjdelcerro | |
269 | 43020 | jjdelcerro | @Override
|
270 | 44198 | jjdelcerro | public Object value() { |
271 | 43020 | jjdelcerro | return this.value; |
272 | } |
||
273 | |||
274 | @Override
|
||
275 | public String toString() { |
||
276 | 44198 | jjdelcerro | return this.toString(EMPTY_FORMATTER); |
277 | } |
||
278 | |||
279 | @Override
|
||
280 | public String toString(Formatter<Value> formatter) { |
||
281 | 44296 | jjdelcerro | if( formatter!=null && formatter.canApply(this) ) { |
282 | 44198 | jjdelcerro | return formatter.format(this); |
283 | } |
||
284 | if( this.value==null ) { |
||
285 | return "NULL"; |
||
286 | } |
||
287 | if( this.value instanceof byte[] ) { |
||
288 | 44644 | jjdelcerro | return "DECODE('"+this.builder.bytearray_hex((byte[])this.value)+"','hex')"; |
289 | 44198 | jjdelcerro | } |
290 | 43093 | jjdelcerro | if (this.value instanceof String) { |
291 | 44644 | jjdelcerro | return this.builder.string((String) this.value); |
292 | 43020 | jjdelcerro | } |
293 | 43093 | jjdelcerro | if (this.value instanceof Boolean) { |
294 | if (((Boolean) this.value)) { |
||
295 | 44198 | jjdelcerro | return FORMAT_TRUE;
|
296 | 43020 | jjdelcerro | } else {
|
297 | 44198 | jjdelcerro | return FORMAT_FALSE;
|
298 | 43020 | jjdelcerro | } |
299 | } |
||
300 | 44198 | jjdelcerro | return Objects.toString(this.value, ""); |
301 | 43020 | jjdelcerro | } |
302 | } |
||
303 | |||
304 | 44644 | jjdelcerro | public static class CustomBase extends AbstractValue implements Custom { |
305 | 43093 | jjdelcerro | |
306 | 43020 | jjdelcerro | protected Object value; |
307 | 43093 | jjdelcerro | |
308 | 43020 | jjdelcerro | // Esto es para permitir declarar parametros y columnas en una seccion
|
309 | // custom.
|
||
310 | protected List<Value> values; |
||
311 | 43093 | jjdelcerro | |
312 | 43020 | jjdelcerro | public CustomBase(Object value) { |
313 | this.value = value;
|
||
314 | } |
||
315 | |||
316 | @Override
|
||
317 | public void accept(Visitor visitor, VisitorFilter filter) { |
||
318 | super.accept(visitor, filter);
|
||
319 | 43093 | jjdelcerro | if (this.values != null) { |
320 | 44006 | jjdelcerro | for (Value theValue : values) {
|
321 | theValue.accept(visitor, filter); |
||
322 | 43020 | jjdelcerro | } |
323 | } |
||
324 | } |
||
325 | 43093 | jjdelcerro | |
326 | 43020 | jjdelcerro | @Override
|
327 | 44376 | jjdelcerro | public void replace(Value target, Value replacement) { |
328 | if( this.values == null ) { |
||
329 | return;
|
||
330 | } |
||
331 | for (int i = 0; i < values.size(); i++) { |
||
332 | Value theValue = values.get(i); |
||
333 | if( target == theValue ) {
|
||
334 | values.set(i, replacement); |
||
335 | } else {
|
||
336 | theValue.replace(target, replacement); |
||
337 | } |
||
338 | } |
||
339 | } |
||
340 | |||
341 | @Override
|
||
342 | 44198 | jjdelcerro | public Object value() { |
343 | 43020 | jjdelcerro | return this.value; |
344 | } |
||
345 | |||
346 | @Override
|
||
347 | public Custom add(Variable variable) {
|
||
348 | 43093 | jjdelcerro | if (this.values == null) { |
349 | 43020 | jjdelcerro | this.values = new ArrayList<>(); |
350 | } |
||
351 | this.values.add(variable);
|
||
352 | return this; |
||
353 | } |
||
354 | |||
355 | @Override
|
||
356 | public Custom add(Parameter parameter) {
|
||
357 | 43093 | jjdelcerro | if (this.values == null) { |
358 | 43020 | jjdelcerro | this.values = new ArrayList<>(); |
359 | } |
||
360 | this.values.add(parameter);
|
||
361 | return this; |
||
362 | } |
||
363 | |||
364 | @Override
|
||
365 | public String toString() { |
||
366 | 44198 | jjdelcerro | return this.toString(EMPTY_FORMATTER); |
367 | 43020 | jjdelcerro | } |
368 | 44198 | jjdelcerro | |
369 | 43020 | jjdelcerro | @Override
|
370 | 44198 | jjdelcerro | public String toString(Formatter<Value> formatter) { |
371 | 44296 | jjdelcerro | if( formatter!=null && formatter.canApply(this) ) { |
372 | 44198 | jjdelcerro | return formatter.format(this); |
373 | 43020 | jjdelcerro | } |
374 | 44198 | jjdelcerro | return Objects.toString(this.value, ""); |
375 | 43020 | jjdelcerro | } |
376 | 43093 | jjdelcerro | } |
377 | 43020 | jjdelcerro | |
378 | 44644 | jjdelcerro | public static class FunctionBase extends AbstractValue implements Function { |
379 | 43020 | jjdelcerro | |
380 | protected String name; |
||
381 | protected String format; |
||
382 | protected List<Value> parameters; |
||
383 | 43093 | jjdelcerro | |
384 | 43020 | jjdelcerro | public FunctionBase(String name, String format) { |
385 | this.name = name;
|
||
386 | this.format = format;
|
||
387 | } |
||
388 | 43093 | jjdelcerro | |
389 | 44020 | jjdelcerro | public FunctionBase(String name) { |
390 | this(name,null); |
||
391 | } |
||
392 | |||
393 | 43020 | jjdelcerro | @Override
|
394 | public List<Value> parameters() { |
||
395 | 43093 | jjdelcerro | if (this.parameters == null) { |
396 | 43020 | jjdelcerro | this.parameters = new ArrayList<>(); |
397 | } |
||
398 | return this.parameters; |
||
399 | 43093 | jjdelcerro | } |
400 | 43020 | jjdelcerro | |
401 | @Override
|
||
402 | public Function parameter(Value parameter) {
|
||
403 | this.parameters().add(parameter);
|
||
404 | return this; |
||
405 | } |
||
406 | |||
407 | @Override
|
||
408 | 44198 | jjdelcerro | public String name() { |
409 | 43020 | jjdelcerro | return this.name; |
410 | } |
||
411 | |||
412 | @Override
|
||
413 | public void accept(Visitor visitor, VisitorFilter filter) { |
||
414 | 43093 | jjdelcerro | super.accept(visitor, filter);
|
415 | 44644 | jjdelcerro | if( this.parameters!=null ) { |
416 | for (Value value : this.parameters) { |
||
417 | if( value!=null ) { |
||
418 | value.accept(visitor, filter); |
||
419 | } |
||
420 | } |
||
421 | 43020 | jjdelcerro | } |
422 | } |
||
423 | |||
424 | @Override
|
||
425 | 44376 | jjdelcerro | public void replace(Value target, Value replacement) { |
426 | for (int i = 0; i < parameters.size(); i++) { |
||
427 | Value value = parameters.get(i); |
||
428 | if( value == target ) {
|
||
429 | parameters.set(i, replacement); |
||
430 | } else {
|
||
431 | value.replace(target, replacement); |
||
432 | } |
||
433 | } |
||
434 | } |
||
435 | |||
436 | @Override
|
||
437 | 43020 | jjdelcerro | public String toString() { |
438 | 44198 | jjdelcerro | return this.toString(EMPTY_FORMATTER); |
439 | } |
||
440 | |||
441 | @Override
|
||
442 | public String toString(Formatter<Value> formatter) { |
||
443 | 44296 | jjdelcerro | if( formatter!=null && formatter.canApply(this) ) { |
444 | 44198 | jjdelcerro | return formatter.format(this); |
445 | } |
||
446 | 44020 | jjdelcerro | if( this.format==null ) { |
447 | StringBuilder builder = new StringBuilder(); |
||
448 | builder.append(name); |
||
449 | builder.append("(");
|
||
450 | if (this.parameters != null && !this.parameters.isEmpty()) { |
||
451 | boolean first = true; |
||
452 | for (Value value : this.parameters) { |
||
453 | if( first ) {
|
||
454 | first=false;
|
||
455 | 44198 | jjdelcerro | builder.append(value.toString(formatter)); |
456 | 44020 | jjdelcerro | } else {
|
457 | builder.append(", ");
|
||
458 | 44198 | jjdelcerro | builder.append(value.toString(formatter)); |
459 | 44020 | jjdelcerro | } |
460 | } |
||
461 | } |
||
462 | builder.append(")");
|
||
463 | return builder.toString();
|
||
464 | } |
||
465 | 43093 | jjdelcerro | if (this.parameters != null && !this.parameters.isEmpty()) { |
466 | 43020 | jjdelcerro | List<String> values = new ArrayList<>(); |
467 | for (Value value : this.parameters) { |
||
468 | 44198 | jjdelcerro | values.add(value.toString(formatter)); |
469 | 43020 | jjdelcerro | } |
470 | return MessageFormat.format(format, values.toArray()); |
||
471 | } else {
|
||
472 | return this.format; |
||
473 | } |
||
474 | } |
||
475 | } |
||
476 | 43093 | jjdelcerro | |
477 | 44198 | jjdelcerro | public class MethodBase extends FunctionBase implements Method { |
478 | |||
479 | 44376 | jjdelcerro | private Value instance;
|
480 | 44198 | jjdelcerro | |
481 | public MethodBase(Value instance, String name) { |
||
482 | super(name);
|
||
483 | this.instance = instance;
|
||
484 | } |
||
485 | |||
486 | @Override
|
||
487 | public Value instance() {
|
||
488 | return this.instance; |
||
489 | } |
||
490 | |||
491 | @Override
|
||
492 | public void accept(Visitor visitor, VisitorFilter filter) { |
||
493 | this.instance.accept(visitor, filter);
|
||
494 | super.accept(visitor, filter);
|
||
495 | } |
||
496 | 44376 | jjdelcerro | |
497 | @Override
|
||
498 | public void replace(Value target, Value replacement) { |
||
499 | if( this.instance == target ) { |
||
500 | this.instance = replacement;
|
||
501 | } else {
|
||
502 | this.instance.replace(target, replacement);
|
||
503 | } |
||
504 | } |
||
505 | 44198 | jjdelcerro | |
506 | @Override
|
||
507 | public String toString(Formatter<Value> formatter) { |
||
508 | 44296 | jjdelcerro | if( formatter!=null && formatter.canApply(this) ) { |
509 | 44198 | jjdelcerro | return formatter.format(this); |
510 | } |
||
511 | StringBuilder builder = new StringBuilder(); |
||
512 | builder.append(this.instance.toString(formatter));
|
||
513 | builder.append("->");
|
||
514 | builder.append(this.name());
|
||
515 | builder.append("(");
|
||
516 | if (this.parameters != null && !this.parameters.isEmpty()) { |
||
517 | boolean first = true; |
||
518 | for (Value value : this.parameters) { |
||
519 | if( first ) {
|
||
520 | first=false;
|
||
521 | builder.append(value.toString(formatter)); |
||
522 | } else {
|
||
523 | builder.append(", ");
|
||
524 | builder.append(value.toString(formatter)); |
||
525 | } |
||
526 | } |
||
527 | } |
||
528 | builder.append(")");
|
||
529 | return builder.toString();
|
||
530 | } |
||
531 | } |
||
532 | |||
533 | 43020 | jjdelcerro | public class BinaryOperatorBase extends AbstractValue implements BinaryOperator { |
534 | |||
535 | protected String name; |
||
536 | protected String format; |
||
537 | protected Value left;
|
||
538 | protected Value right;
|
||
539 | 43093 | jjdelcerro | |
540 | 43020 | jjdelcerro | public BinaryOperatorBase(String name, String format) { |
541 | this.name = name;
|
||
542 | this.format = format;
|
||
543 | } |
||
544 | 43093 | jjdelcerro | |
545 | 43020 | jjdelcerro | @Override
|
546 | 44198 | jjdelcerro | public String name() { |
547 | 43020 | jjdelcerro | return this.name; |
548 | } |
||
549 | |||
550 | @Override
|
||
551 | 44376 | jjdelcerro | public void replace(Value target, Value replacement) { |
552 | if( target == this.left ) { |
||
553 | this.left = replacement;
|
||
554 | } else {
|
||
555 | this.left.replace(target, replacement);
|
||
556 | } |
||
557 | if( target == this.right ) { |
||
558 | this.right = replacement;
|
||
559 | } else {
|
||
560 | this.right.replace(target, replacement);
|
||
561 | } |
||
562 | } |
||
563 | |||
564 | @Override
|
||
565 | 43020 | jjdelcerro | public void accept(Visitor visitor, VisitorFilter filter) { |
566 | 43093 | jjdelcerro | super.accept(visitor, filter);
|
567 | 43020 | jjdelcerro | this.left.accept(visitor, filter);
|
568 | this.right.accept(visitor, filter);
|
||
569 | } |
||
570 | |||
571 | @Override
|
||
572 | 44198 | jjdelcerro | public BinaryOperator left(Value operand) {
|
573 | 43020 | jjdelcerro | this.left = operand;
|
574 | return this; |
||
575 | } |
||
576 | |||
577 | @Override
|
||
578 | 44198 | jjdelcerro | public BinaryOperator right(Value operand) {
|
579 | 43020 | jjdelcerro | this.right = operand;
|
580 | return this; |
||
581 | } |
||
582 | |||
583 | @Override
|
||
584 | 44198 | jjdelcerro | public Value left() {
|
585 | 43020 | jjdelcerro | return this.left; |
586 | } |
||
587 | |||
588 | @Override
|
||
589 | 44198 | jjdelcerro | public Value right() {
|
590 | 43020 | jjdelcerro | return this.right; |
591 | } |
||
592 | 43093 | jjdelcerro | |
593 | 43020 | jjdelcerro | @Override
|
594 | public String toString() { |
||
595 | 44198 | jjdelcerro | return this.toString(EMPTY_FORMATTER); |
596 | 43020 | jjdelcerro | } |
597 | 44198 | jjdelcerro | |
598 | @Override
|
||
599 | public String toString(Formatter<Value> formatter) { |
||
600 | 44296 | jjdelcerro | if( formatter!=null && formatter.canApply(this) ) { |
601 | 44198 | jjdelcerro | return formatter.format(this); |
602 | } |
||
603 | if( this.format==null ) { |
||
604 | StringBuilder builder = new StringBuilder(); |
||
605 | builder.append("(");
|
||
606 | builder.append(this.left.toString(formatter));
|
||
607 | builder.append(" ");
|
||
608 | builder.append(this.name);
|
||
609 | builder.append(" ");
|
||
610 | builder.append(this.right.toString(formatter));
|
||
611 | builder.append(")");
|
||
612 | return builder.toString();
|
||
613 | } else {
|
||
614 | return MessageFormat.format( |
||
615 | format, |
||
616 | this.left.toString(formatter),
|
||
617 | this.right.toString(formatter)
|
||
618 | ); |
||
619 | } |
||
620 | } |
||
621 | 43020 | jjdelcerro | } |
622 | |||
623 | protected Value value;
|
||
624 | 44644 | jjdelcerro | protected ExpressionEvaluatorManager manager;
|
625 | 43093 | jjdelcerro | |
626 | 44644 | jjdelcerro | public DefaultExpressionBuilder(ExpressionEvaluatorManager manager) {
|
627 | this.manager = manager;
|
||
628 | 43020 | jjdelcerro | } |
629 | |||
630 | @Override
|
||
631 | 44259 | jjdelcerro | public boolean isEmpty() { |
632 | return value == null; |
||
633 | } |
||
634 | |||
635 | @Override
|
||
636 | 43020 | jjdelcerro | public ExpressionBuilder createExpressionBuilder() {
|
637 | 44644 | jjdelcerro | return new DefaultExpressionBuilder(this.manager); |
638 | 43020 | jjdelcerro | } |
639 | 43093 | jjdelcerro | |
640 | 43020 | jjdelcerro | @Override
|
641 | 44198 | jjdelcerro | public Value value() {
|
642 | 43020 | jjdelcerro | return this.value; |
643 | } |
||
644 | 43093 | jjdelcerro | |
645 | 43020 | jjdelcerro | @Override
|
646 | 44198 | jjdelcerro | public ExpressionBuilder value(Value value) {
|
647 | 43020 | jjdelcerro | this.value = value;
|
648 | return this; |
||
649 | } |
||
650 | |||
651 | @Override
|
||
652 | public String toString() { |
||
653 | return this.value.toString(); |
||
654 | } |
||
655 | |||
656 | @Override
|
||
657 | 44198 | jjdelcerro | public String toString(Formatter<Value> formatter) { |
658 | return this.value.toString(formatter); |
||
659 | } |
||
660 | |||
661 | @Override
|
||
662 | public Value toValue(String expression) { |
||
663 | try {
|
||
664 | Code code = ExpressionUtils.compile(expression); |
||
665 | return code.toValue(this); |
||
666 | } catch(Throwable ex) { |
||
667 | return custom(expression);
|
||
668 | } |
||
669 | } |
||
670 | |||
671 | @Override
|
||
672 | 43020 | jjdelcerro | public void accept(Visitor visitor, VisitorFilter filter) { |
673 | 43093 | jjdelcerro | if( this.value == null) { |
674 | return;
|
||
675 | } |
||
676 | 43020 | jjdelcerro | this.value.accept(visitor, filter);
|
677 | } |
||
678 | 43093 | jjdelcerro | |
679 | 43020 | jjdelcerro | @Override
|
680 | 44198 | jjdelcerro | public String quote_for_identifiers() { |
681 | return FORMAT_QUOTE_FOR_IDENTIFIERS;
|
||
682 | 43020 | jjdelcerro | } |
683 | 44198 | jjdelcerro | |
684 | 43020 | jjdelcerro | @Override
|
685 | 44198 | jjdelcerro | public String quote_for_strings() { |
686 | return FORMAT_QUOTE_FOR_STRINGS;
|
||
687 | 43020 | jjdelcerro | } |
688 | 44198 | jjdelcerro | |
689 | 43020 | jjdelcerro | @Override
|
690 | public String string(String s) { |
||
691 | 44198 | jjdelcerro | String quote = this.quote_for_strings(); |
692 | 43034 | jjdelcerro | // No se porque no esta disponible wrapIfMissing
|
693 | // return StringUtils.wrapIfMissing(s,quote);
|
||
694 | 43020 | jjdelcerro | if (s.startsWith(quote)) {
|
695 | return s;
|
||
696 | } |
||
697 | 44198 | jjdelcerro | return quote + StringUtils.replace(s,quote,quote+quote) + quote;
|
698 | 43020 | jjdelcerro | } |
699 | 43093 | jjdelcerro | |
700 | 43020 | jjdelcerro | @Override
|
701 | public String identifier(String id) { |
||
702 | 44198 | jjdelcerro | String quote = this.quote_for_identifiers(); |
703 | 43034 | jjdelcerro | // No se porque no esta disponible wrapIfMissing
|
704 | // return StringUtils.wrapIfMissing(id,quote);
|
||
705 | 43020 | jjdelcerro | if (id.startsWith(quote)) {
|
706 | return id;
|
||
707 | } |
||
708 | return quote + id + quote;
|
||
709 | } |
||
710 | |||
711 | @Override
|
||
712 | 44006 | jjdelcerro | public String bytearray_hex(byte[] data) { |
713 | 43020 | jjdelcerro | StringBuilder builder = new StringBuilder(); |
714 | for (byte abyte : data) { |
||
715 | int v = abyte & 0xff; |
||
716 | builder.append(String.format("%02x", v)); |
||
717 | } |
||
718 | return builder.toString();
|
||
719 | } |
||
720 | |||
721 | 44006 | jjdelcerro | @Override
|
722 | public String bytearray_0x(byte[] data) { |
||
723 | 43355 | jjdelcerro | return "0x" + bytearray_hex(data); |
724 | } |
||
725 | |||
726 | 44006 | jjdelcerro | @Override
|
727 | public String bytearray_x(byte[] data) { |
||
728 | 43355 | jjdelcerro | return "x'" + bytearray_hex(data) + "'"; |
729 | 43302 | jjdelcerro | } |
730 | |||
731 | 43093 | jjdelcerro | |
732 | 43020 | jjdelcerro | @Override
|
733 | 44198 | jjdelcerro | public Constant bytearray(byte[] data) { |
734 | 44644 | jjdelcerro | return new ConstantBase(this, data); |
735 | 44198 | jjdelcerro | } |
736 | |||
737 | @Override
|
||
738 | 43020 | jjdelcerro | public Variable variable(String name) { |
739 | 44644 | jjdelcerro | return new VariableBase(this, name); |
740 | 43020 | jjdelcerro | } |
741 | |||
742 | @Override
|
||
743 | public Variable column(String name) { |
||
744 | 44644 | jjdelcerro | return new VariableBase(this, name); |
745 | 43020 | jjdelcerro | } |
746 | 43739 | jjdelcerro | |
747 | 43020 | jjdelcerro | @Override
|
748 | 43093 | jjdelcerro | public Parameter parameter(String name) { |
749 | 44198 | jjdelcerro | List<Parameter> parameters = this.parameters(); |
750 | for (Parameter parameter : parameters) {
|
||
751 | if( StringUtils.equalsIgnoreCase(name, parameter.name()) ) {
|
||
752 | return parameter;
|
||
753 | } |
||
754 | 43093 | jjdelcerro | } |
755 | 44198 | jjdelcerro | Parameter parameter = this.parameter();
|
756 | 43093 | jjdelcerro | parameter.name(name); |
757 | return parameter;
|
||
758 | 43020 | jjdelcerro | } |
759 | 43093 | jjdelcerro | |
760 | 43687 | jjdelcerro | @Override
|
761 | 43093 | jjdelcerro | public Parameter parameter() {
|
762 | return new ParameterBase(); |
||
763 | } |
||
764 | |||
765 | 43020 | jjdelcerro | @Override
|
766 | public Constant constant(Object value) { |
||
767 | 44644 | jjdelcerro | return new ConstantBase(this, value); |
768 | 43020 | jjdelcerro | } |
769 | |||
770 | @Override
|
||
771 | public Group group(Value value) { |
||
772 | return new GroupBase(value); |
||
773 | } |
||
774 | 43093 | jjdelcerro | |
775 | 43020 | jjdelcerro | @Override
|
776 | public Custom custom(Object value) { |
||
777 | return new CustomBase(value); |
||
778 | } |
||
779 | |||
780 | 44198 | jjdelcerro | @Override
|
781 | public Method method(Value instance, String name, Value... values) { |
||
782 | MethodBase method = new MethodBase(instance, name);
|
||
783 | for (Value theValue : values) {
|
||
784 | method.parameter(theValue); |
||
785 | } |
||
786 | return method;
|
||
787 | } |
||
788 | |||
789 | @Override
|
||
790 | 44020 | jjdelcerro | public Function function(String name, Value... values) { |
791 | FunctionBase func = new FunctionBase(name);
|
||
792 | for (Value theValue : values) {
|
||
793 | func.parameter(theValue); |
||
794 | } |
||
795 | return func;
|
||
796 | } |
||
797 | |||
798 | public Function builtin_function(String name, String format, Value... values) { |
||
799 | 43093 | jjdelcerro | FunctionBase func = new FunctionBase(name, format);
|
800 | 44006 | jjdelcerro | for (Value theValue : values) {
|
801 | func.parameter(theValue); |
||
802 | 43020 | jjdelcerro | } |
803 | return func;
|
||
804 | } |
||
805 | 43093 | jjdelcerro | |
806 | 44198 | jjdelcerro | @Override
|
807 | public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand) { |
||
808 | return binaryOperator(name, null, leftOperand, rightOperand); |
||
809 | } |
||
810 | |||
811 | 43020 | jjdelcerro | public BinaryOperator binaryOperator(String name, String format, Value leftOperand, Value rightOperand) { |
812 | 43093 | jjdelcerro | BinaryOperator operator = new BinaryOperatorBase(name, format);
|
813 | 44198 | jjdelcerro | operator.left(leftOperand); |
814 | operator.right(rightOperand); |
||
815 | 43020 | jjdelcerro | return operator;
|
816 | } |
||
817 | 43093 | jjdelcerro | |
818 | 43020 | jjdelcerro | @Override
|
819 | 44198 | jjdelcerro | public List<Variable> variables() { |
820 | 43020 | jjdelcerro | final Set<Variable> vars = new HashSet<>(); |
821 | this.accept(new Visitor() { |
||
822 | @Override
|
||
823 | public void visit(Visitable value) { |
||
824 | 44198 | jjdelcerro | if( !vars.contains((Variable)value) ) {
|
825 | vars.add((Variable)value); |
||
826 | } |
||
827 | 43020 | jjdelcerro | } |
828 | 43093 | jjdelcerro | }, new ClassVisitorFilter(Variable.class));
|
829 | 43020 | jjdelcerro | List<Variable> lvars = new ArrayList<>(vars); |
830 | Collections.sort(lvars);
|
||
831 | return lvars;
|
||
832 | } |
||
833 | 43093 | jjdelcerro | |
834 | 43020 | jjdelcerro | @Override
|
835 | 44198 | jjdelcerro | public List<Parameter> parameters() { |
836 | final List<Parameter> params = new ArrayList<>(); |
||
837 | 43020 | jjdelcerro | this.accept(new Visitor() { |
838 | @Override
|
||
839 | public void visit(Visitable value) { |
||
840 | 43093 | jjdelcerro | params.add((Parameter) value); |
841 | 43020 | jjdelcerro | } |
842 | 43093 | jjdelcerro | }, new ClassVisitorFilter(Parameter.class));
|
843 | 43020 | jjdelcerro | return params;
|
844 | } |
||
845 | 44198 | jjdelcerro | |
846 | 43020 | jjdelcerro | @Override
|
847 | 44198 | jjdelcerro | public List<String> parameters_names() { |
848 | List<String> params = new ArrayList<>(); |
||
849 | for (Parameter param : parameters()) {
|
||
850 | Object theValue = param.value();
|
||
851 | String s;
|
||
852 | switch(param.type()) {
|
||
853 | 44644 | jjdelcerro | case PARAMETER_TYPE_CONSTANT:
|
854 | 44198 | jjdelcerro | if( theValue==null ) { |
855 | s = "NULL";
|
||
856 | } else if( theValue instanceof String ) { |
||
857 | s = "'" + (String)theValue + "'"; |
||
858 | |||
859 | } else if( theValue instanceof byte[] ) { |
||
860 | s = bytearray_0x((byte[]) theValue); |
||
861 | |||
862 | } else {
|
||
863 | s = theValue.toString(); |
||
864 | } |
||
865 | break;
|
||
866 | 44644 | jjdelcerro | case PARAMETER_TYPE_VARIABLE:
|
867 | 44198 | jjdelcerro | default:
|
868 | s = "\"" + param.name() + "\""; |
||
869 | } |
||
870 | // if( !params.contains(s) ) { // Ojo que deben ir todos, incluso duplicados.
|
||
871 | params.add(s); |
||
872 | // }
|
||
873 | } |
||
874 | // Collections.sort(params); Ojo, no deben ordenarse.
|
||
875 | return params;
|
||
876 | 43020 | jjdelcerro | } |
877 | 44198 | jjdelcerro | |
878 | @Override
|
||
879 | public List<String> variables_names() { |
||
880 | List<String> vars = new ArrayList<>(); |
||
881 | for (Variable var : this.variables()) { |
||
882 | vars.add(var.name()); |
||
883 | } |
||
884 | Collections.sort(vars);
|
||
885 | return vars;
|
||
886 | } |
||
887 | |||
888 | @Override
|
||
889 | 43020 | jjdelcerro | public ExpressionBuilder set(Value value) {
|
890 | this.value = value;
|
||
891 | return this; |
||
892 | } |
||
893 | |||
894 | @Override
|
||
895 | public ExpressionBuilder and(Value value) {
|
||
896 | 43093 | jjdelcerro | if (this.value == null) { |
897 | 43020 | jjdelcerro | return this.set(value); |
898 | } |
||
899 | 44198 | jjdelcerro | BinaryOperator operator = binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, this.value, value);
|
900 | 43020 | jjdelcerro | this.value = operator;
|
901 | return this; |
||
902 | } |
||
903 | |||
904 | @Override
|
||
905 | public ExpressionBuilder or(Value value) {
|
||
906 | 43093 | jjdelcerro | if (this.value == null) { |
907 | 43020 | jjdelcerro | return this.set(value); |
908 | } |
||
909 | 44198 | jjdelcerro | BinaryOperator operator = binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, this.value, value);
|
910 | 43020 | jjdelcerro | this.value = operator;
|
911 | return this; |
||
912 | } |
||
913 | |||
914 | @Override
|
||
915 | 44198 | jjdelcerro | public Function is_null(Value value) {
|
916 | return builtin_function("IS NULL", FORMAT_ISNULL, value); |
||
917 | 43020 | jjdelcerro | } |
918 | |||
919 | @Override
|
||
920 | 44198 | jjdelcerro | public Function not_is_null(Value value) {
|
921 | 44361 | jjdelcerro | return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value); |
922 | 43020 | jjdelcerro | } |
923 | |||
924 | @Override
|
||
925 | public Function not(Value value) {
|
||
926 | 44198 | jjdelcerro | return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
|
927 | 43020 | jjdelcerro | } |
928 | |||
929 | @Override
|
||
930 | public BinaryOperator and(Value leftOperand, Value rightOperand) {
|
||
931 | 44198 | jjdelcerro | return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
|
932 | 43020 | jjdelcerro | } |
933 | |||
934 | @Override
|
||
935 | 44274 | jjdelcerro | public BinaryOperator and(Expression leftOperand, Expression rightOperand) { |
936 | return binaryOperator(
|
||
937 | OPERATOR_AND, |
||
938 | FORMAT_OPERATOR_AND, |
||
939 | leftOperand.getCode().toValue(), |
||
940 | rightOperand.getCode().toValue() |
||
941 | ); |
||
942 | } |
||
943 | |||
944 | @Override
|
||
945 | public BinaryOperator and(Expression leftOperand, Value rightOperand) { |
||
946 | return binaryOperator(
|
||
947 | OPERATOR_AND, |
||
948 | FORMAT_OPERATOR_AND, |
||
949 | leftOperand.getCode().toValue(), |
||
950 | rightOperand |
||
951 | ); |
||
952 | } |
||
953 | |||
954 | @Override
|
||
955 | 43020 | jjdelcerro | public BinaryOperator or(Value leftOperand, Value rightOperand) {
|
956 | 44198 | jjdelcerro | return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
|
957 | 43020 | jjdelcerro | } |
958 | |||
959 | @Override
|
||
960 | public BinaryOperator eq(Value leftOperand, Value rightOperand) {
|
||
961 | 44198 | jjdelcerro | return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand); |
962 | 43020 | jjdelcerro | } |
963 | 43093 | jjdelcerro | |
964 | 43020 | jjdelcerro | @Override
|
965 | public BinaryOperator ne(Value leftOperand, Value rightOperand) {
|
||
966 | 44198 | jjdelcerro | return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand); |
967 | 43093 | jjdelcerro | } |
968 | 43020 | jjdelcerro | |
969 | @Override
|
||
970 | public BinaryOperator gt(Value op1, Value op2) {
|
||
971 | 44198 | jjdelcerro | return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2); |
972 | 43020 | jjdelcerro | } |
973 | |||
974 | @Override
|
||
975 | public BinaryOperator ge(Value op1, Value op2) {
|
||
976 | 44198 | jjdelcerro | return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2); |
977 | 43020 | jjdelcerro | } |
978 | |||
979 | @Override
|
||
980 | public BinaryOperator lt(Value op1, Value op2) {
|
||
981 | 44198 | jjdelcerro | return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2); |
982 | 43020 | jjdelcerro | } |
983 | |||
984 | @Override
|
||
985 | public BinaryOperator le(Value op1, Value op2) {
|
||
986 | 44198 | jjdelcerro | return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2); |
987 | 43020 | jjdelcerro | } |
988 | |||
989 | @Override
|
||
990 | public BinaryOperator like(Value op1, Value op2) {
|
||
991 | 44198 | jjdelcerro | return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
|
992 | 43020 | jjdelcerro | } |
993 | |||
994 | @Override
|
||
995 | public BinaryOperator ilike(Value op1, Value op2) {
|
||
996 | 44198 | jjdelcerro | return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
|
997 | 43020 | jjdelcerro | } |
998 | |||
999 | @Override
|
||
1000 | public BinaryOperator add(Value op1, Value op2) {
|
||
1001 | 44198 | jjdelcerro | return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
|
1002 | 43020 | jjdelcerro | } |
1003 | |||
1004 | @Override
|
||
1005 | public BinaryOperator subst(Value op1, Value op2) {
|
||
1006 | 44198 | jjdelcerro | return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
|
1007 | 43020 | jjdelcerro | } |
1008 | |||
1009 | @Override
|
||
1010 | public BinaryOperator mult(Value op1, Value op2) {
|
||
1011 | 44198 | jjdelcerro | return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
|
1012 | 43020 | jjdelcerro | } |
1013 | |||
1014 | @Override
|
||
1015 | public BinaryOperator div(Value op1, Value op2) {
|
||
1016 | 44198 | jjdelcerro | return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
|
1017 | 43020 | jjdelcerro | } |
1018 | |||
1019 | @Override
|
||
1020 | public BinaryOperator concat(Value op1, Value op2) {
|
||
1021 | 44198 | jjdelcerro | return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, op1, op2);
|
1022 | 43020 | jjdelcerro | } |
1023 | 44051 | omartinez | |
1024 | @Override
|
||
1025 | 44038 | jjdelcerro | public Function iif(Value condition, Value iftrue, Value iffalse) {
|
1026 | 44198 | jjdelcerro | return function(FUNCTION_IIF, condition, iftrue, iffalse);
|
1027 | 44038 | jjdelcerro | } |
1028 | |||
1029 | 44051 | omartinez | @Override
|
1030 | 44038 | jjdelcerro | public Function ifnull(Value value, Value iftrue, Value iffalse) {
|
1031 | 44198 | jjdelcerro | return function(FUNCTION_IFNULL, value, iftrue, iffalse);
|
1032 | 44038 | jjdelcerro | } |
1033 | 44051 | omartinez | |
1034 | @Override
|
||
1035 | public Function left(Value str, Value size) {
|
||
1036 | 44198 | jjdelcerro | return function(FUNCTION_LEFT, str, size);
|
1037 | 44051 | omartinez | } |
1038 | |||
1039 | @Override
|
||
1040 | public Function right(Value str, Value len) {
|
||
1041 | 44198 | jjdelcerro | return function(FUNCTION_RIGHT, str, len);
|
1042 | 44051 | omartinez | } |
1043 | |||
1044 | @Override
|
||
1045 | public Function locate(Value search, Value str, Value start) {
|
||
1046 | 44198 | jjdelcerro | return function(FUNCTION_LOCATE, search, str, start);
|
1047 | 44051 | omartinez | } |
1048 | |||
1049 | @Override
|
||
1050 | public Function position(Value search, Value str) {
|
||
1051 | 44198 | jjdelcerro | return function(FUNCTION_POSITION, search, str);
|
1052 | 44051 | omartinez | } |
1053 | |||
1054 | @Override
|
||
1055 | public Function lpad(Value str, Value len, Value padstr) {
|
||
1056 | 44198 | jjdelcerro | return function(FUNCTION_LPAD, str, len, padstr);
|
1057 | 44051 | omartinez | } |
1058 | |||
1059 | @Override
|
||
1060 | public Function rpad(Value str, Value len, Value padstr) {
|
||
1061 | 44198 | jjdelcerro | return function(FUNCTION_RPAD, str, len, padstr);
|
1062 | 44051 | omartinez | } |
1063 | |||
1064 | @Override
|
||
1065 | public Function ltrim(Value str) {
|
||
1066 | 44198 | jjdelcerro | return function(FUNCTION_LTRIM, str);
|
1067 | 44051 | omartinez | } |
1068 | |||
1069 | @Override
|
||
1070 | public Function rtrim(Value str) {
|
||
1071 | 44198 | jjdelcerro | return function(FUNCTION_RTRIM, str);
|
1072 | 44051 | omartinez | } |
1073 | |||
1074 | @Override
|
||
1075 | public Function trim(Value str) {
|
||
1076 | 44198 | jjdelcerro | return function(FUNCTION_TRIM, str);
|
1077 | 44051 | omartinez | } |
1078 | |||
1079 | @Override
|
||
1080 | public Function repeat(Value str, Value size) {
|
||
1081 | 44198 | jjdelcerro | return function(FUNCTION_REPEAT, str, size);
|
1082 | 44051 | omartinez | } |
1083 | |||
1084 | @Override
|
||
1085 | public Function replace(Value str, Value search, Value replstr) {
|
||
1086 | 44198 | jjdelcerro | return function(FUNCTION_REPLACE, str, search, replstr);
|
1087 | 44051 | omartinez | } |
1088 | |||
1089 | @Override
|
||
1090 | public Function ascii(Value str) {
|
||
1091 | 44198 | jjdelcerro | return function(FUNCTION_ASCII, str);
|
1092 | 44051 | omartinez | } |
1093 | |||
1094 | @Override
|
||
1095 | public Function lenght(Value str) {
|
||
1096 | 44198 | jjdelcerro | return function(FUNCTION_LENGHT, str);
|
1097 | 44051 | omartinez | } |
1098 | |||
1099 | @Override
|
||
1100 | public Function instr(Value str, Value search, Value start) {
|
||
1101 | 44198 | jjdelcerro | return function(FUNCTION_INSTR, str, search, start);
|
1102 | 44051 | omartinez | } |
1103 | |||
1104 | @Override
|
||
1105 | public Function lower(Value str) {
|
||
1106 | 44198 | jjdelcerro | return function(FUNCTION_LOWER, str);
|
1107 | 44051 | omartinez | } |
1108 | |||
1109 | @Override
|
||
1110 | public Function upper(Value str) {
|
||
1111 | 44198 | jjdelcerro | return function(FUNCTION_UPPER, str);
|
1112 | 44051 | omartinez | } |
1113 | |||
1114 | @Override
|
||
1115 | public Function space(Value size) {
|
||
1116 | 44198 | jjdelcerro | return function(FUNCTION_SPACE, size);
|
1117 | 44051 | omartinez | } |
1118 | |||
1119 | @Override
|
||
1120 | public Function substring(Value str, Value start, Value len) {
|
||
1121 | 44198 | jjdelcerro | return function(FUNCTION_SUBSTRING, str, start, len);
|
1122 | 44051 | omartinez | } |
1123 | |||
1124 | @Override
|
||
1125 | public Function acos(Value num) {
|
||
1126 | 44198 | jjdelcerro | return function(FUNCTION_ACOS, num);
|
1127 | 44051 | omartinez | } |
1128 | |||
1129 | @Override
|
||
1130 | public Function asin(Value num) {
|
||
1131 | 44198 | jjdelcerro | return function(FUNCTION_ASIN, num);
|
1132 | 44051 | omartinez | } |
1133 | |||
1134 | @Override
|
||
1135 | public Function atan(Value num) {
|
||
1136 | 44198 | jjdelcerro | return function(FUNCTION_ATAN, num);
|
1137 | 44051 | omartinez | } |
1138 | |||
1139 | @Override
|
||
1140 | public Function cos(Value num) {
|
||
1141 | 44198 | jjdelcerro | return function(FUNCTION_COS, num);
|
1142 | 44051 | omartinez | } |
1143 | |||
1144 | @Override
|
||
1145 | public Function cosh(Value num) {
|
||
1146 | 44198 | jjdelcerro | return function(FUNCTION_COSH, num);
|
1147 | 44051 | omartinez | } |
1148 | |||
1149 | @Override
|
||
1150 | public Function cot(Value num) {
|
||
1151 | 44198 | jjdelcerro | return function(FUNCTION_COT, num);
|
1152 | 44051 | omartinez | } |
1153 | |||
1154 | @Override
|
||
1155 | public Function bitand(Value num1, Value num2) {
|
||
1156 | 44198 | jjdelcerro | return function(FUNCTION_BITAND, num1, num2);
|
1157 | 44051 | omartinez | } |
1158 | |||
1159 | @Override
|
||
1160 | public Function bitor(Value num1, Value num2) {
|
||
1161 | 44198 | jjdelcerro | return function(FUNCTION_BITOR, num1, num2);
|
1162 | 44051 | omartinez | } |
1163 | |||
1164 | @Override
|
||
1165 | public Function bitxor(Value num1, Value num2) {
|
||
1166 | 44198 | jjdelcerro | return function(FUNCTION_BITXOR, num1, num2);
|
1167 | 44051 | omartinez | } |
1168 | |||
1169 | @Override
|
||
1170 | public Function ceil(Value num) {
|
||
1171 | 44198 | jjdelcerro | return function(FUNCTION_CEIL, num);
|
1172 | 44051 | omartinez | } |
1173 | |||
1174 | @Override
|
||
1175 | public Function degrees(Value num) {
|
||
1176 | 44198 | jjdelcerro | return function(FUNCTION_DEGREES, num);
|
1177 | 44051 | omartinez | } |
1178 | |||
1179 | @Override
|
||
1180 | public Function exp(Value num) {
|
||
1181 | 44198 | jjdelcerro | return function(FUNCTION_EXP, num);
|
1182 | 44051 | omartinez | } |
1183 | |||
1184 | @Override
|
||
1185 | public Function floor(Value num) {
|
||
1186 | 44198 | jjdelcerro | return function(FUNCTION_FLOOR, num);
|
1187 | 44051 | omartinez | } |
1188 | |||
1189 | @Override
|
||
1190 | public Function log(Value num) {
|
||
1191 | 44198 | jjdelcerro | return function(FUNCTION_LOG, num);
|
1192 | 44051 | omartinez | } |
1193 | |||
1194 | @Override
|
||
1195 | public Function log10(Value num) {
|
||
1196 | 44198 | jjdelcerro | return function(FUNCTION_LOG10, num);
|
1197 | 44051 | omartinez | } |
1198 | |||
1199 | @Override
|
||
1200 | 44644 | jjdelcerro | public Function pi() {
|
1201 | return function(FUNCTION_PI);
|
||
1202 | 44051 | omartinez | } |
1203 | |||
1204 | @Override
|
||
1205 | 44644 | jjdelcerro | public Function abs(Value num) {
|
1206 | return function(FUNCTION_ABS, num);
|
||
1207 | } |
||
1208 | |||
1209 | @Override
|
||
1210 | 44051 | omartinez | public Function power(Value num) {
|
1211 | 44198 | jjdelcerro | return function(FUNCTION_POWER, num);
|
1212 | 44051 | omartinez | } |
1213 | |||
1214 | @Override
|
||
1215 | public Function radians(Value num) {
|
||
1216 | 44198 | jjdelcerro | return function(FUNCTION_RADIANS, num);
|
1217 | 44051 | omartinez | } |
1218 | |||
1219 | @Override
|
||
1220 | public Function rand(Value num) {
|
||
1221 | 44198 | jjdelcerro | return function(FUNCTION_RAND, num);
|
1222 | 44051 | omartinez | } |
1223 | |||
1224 | @Override
|
||
1225 | public Function round(Value num) {
|
||
1226 | 44198 | jjdelcerro | return function(FUNCTION_ROUND, num);
|
1227 | 44051 | omartinez | } |
1228 | |||
1229 | @Override
|
||
1230 | public Function sqrt(Value num) {
|
||
1231 | 44198 | jjdelcerro | return function(FUNCTION_SQRT, num);
|
1232 | 44051 | omartinez | } |
1233 | |||
1234 | @Override
|
||
1235 | public Function sign(Value num) {
|
||
1236 | 44198 | jjdelcerro | return function(FUNCTION_SIGN, num);
|
1237 | 44051 | omartinez | } |
1238 | |||
1239 | @Override
|
||
1240 | public Function sin(Value num) {
|
||
1241 | 44198 | jjdelcerro | return function(FUNCTION_SIN, num);
|
1242 | 44051 | omartinez | } |
1243 | |||
1244 | @Override
|
||
1245 | public Function sinh(Value num) {
|
||
1246 | 44198 | jjdelcerro | return function(FUNCTION_SINH, num);
|
1247 | 44051 | omartinez | } |
1248 | |||
1249 | @Override
|
||
1250 | public Function tan(Value num) {
|
||
1251 | 44198 | jjdelcerro | return function(FUNCTION_TAN, num);
|
1252 | 44051 | omartinez | } |
1253 | @Override
|
||
1254 | public Function tanh(Value num) {
|
||
1255 | 44198 | jjdelcerro | return function(FUNCTION_TANH, num);
|
1256 | 44051 | omartinez | } |
1257 | |||
1258 | @Override
|
||
1259 | public Function zero() {
|
||
1260 | 44198 | jjdelcerro | return function(FUNCTION_ZERO);
|
1261 | 44051 | omartinez | } |
1262 | 44053 | omartinez | |
1263 | @Override
|
||
1264 | public Function chr(Value num) {
|
||
1265 | 44198 | jjdelcerro | return function(FUNCTION_CHR, num);
|
1266 | } |
||
1267 | |||
1268 | @Override
|
||
1269 | public Function cast(Value object, Value typeName) {
|
||
1270 | return function(FUNCTION_CAST, object, typeName);
|
||
1271 | } |
||
1272 | |||
1273 | @Override
|
||
1274 | public Function decode(Value value, Value format) {
|
||
1275 | return function(FUNCTION_DECODE, value, format);
|
||
1276 | } |
||
1277 | |||
1278 | @Override
|
||
1279 | public Function toDouble(Value num) {
|
||
1280 | return function(FUNCTION_TODOUBLE, num);
|
||
1281 | } |
||
1282 | |||
1283 | @Override
|
||
1284 | public Function toFloat(Value num) {
|
||
1285 | return function(FUNCTION_TOFLOAT, num);
|
||
1286 | } |
||
1287 | |||
1288 | @Override
|
||
1289 | public Function toLong(Value num) {
|
||
1290 | return function(FUNCTION_TOLONG, num);
|
||
1291 | } |
||
1292 | |||
1293 | @Override
|
||
1294 | public Function toInteger(Value num) {
|
||
1295 | return function(FUNCTION_TOINTEGER, num);
|
||
1296 | } |
||
1297 | |||
1298 | @Override
|
||
1299 | public Function toStr(Value object) {
|
||
1300 | return function(FUNCTION_TOSTR, object);
|
||
1301 | } |
||
1302 | |||
1303 | 44253 | jjdelcerro | @Override
|
1304 | 44262 | jjdelcerro | public Function list() {
|
1305 | return function(FUNCTION_LIST);
|
||
1306 | } |
||
1307 | 44376 | jjdelcerro | |
1308 | @Override
|
||
1309 | public Function tuple() {
|
||
1310 | return function(FUNCTION_TUPLE);
|
||
1311 | } |
||
1312 | |||
1313 | @Override
|
||
1314 | public Function tuple(Constant... values) {
|
||
1315 | Function fn = function(FUNCTION_TUPLE); |
||
1316 | for (Value theValue : values) {
|
||
1317 | fn.parameter(this.constant(theValue));
|
||
1318 | } |
||
1319 | return fn;
|
||
1320 | } |
||
1321 | |||
1322 | 44644 | jjdelcerro | @Override
|
1323 | public String repr(Object value) { |
||
1324 | return this.manager.getReprMethod(value).repr(value); |
||
1325 | } |
||
1326 | 44376 | jjdelcerro | |
1327 | 43020 | jjdelcerro | } |