Revision 44139 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/DefaultCodeBuilder.java
DefaultCodeBuilder.java | ||
---|---|---|
1 | 1 |
package org.gvsig.expressionevaluator.impl; |
2 | 2 |
|
3 | 3 |
import java.util.ArrayList; |
4 |
import java.util.Collections; |
|
4 | 5 |
import java.util.Iterator; |
5 | 6 |
import java.util.List; |
6 | 7 |
import org.apache.commons.lang3.StringUtils; |
... | ... | |
10 | 11 |
import static org.gvsig.expressionevaluator.Code.IDENTIFIER; |
11 | 12 |
import static org.gvsig.expressionevaluator.Code.UNDEFINED; |
12 | 13 |
import org.gvsig.expressionevaluator.Code.Caller; |
13 |
import org.gvsig.expressionevaluator.Code.Caller.Arguments; |
|
14 | 14 |
import org.gvsig.expressionevaluator.Code.Constant; |
15 | 15 |
import org.gvsig.expressionevaluator.Code.Identifier; |
16 | 16 |
import org.gvsig.expressionevaluator.Code.Method; |
17 | 17 |
import org.gvsig.expressionevaluator.CodeBuilder; |
18 |
import org.gvsig.expressionevaluator.Codes; |
|
18 | 19 |
import org.gvsig.expressionevaluator.Function; |
19 | 20 |
import org.gvsig.expressionevaluator.Interpreter; |
21 |
import org.gvsig.expressionevaluator.impl.function.operator.AddOperator; |
|
22 |
import org.gvsig.expressionevaluator.impl.function.operator.AndOperator; |
|
23 |
import org.gvsig.expressionevaluator.impl.function.operator.ConcatOperator; |
|
24 |
import org.gvsig.expressionevaluator.impl.function.operator.DivOperator; |
|
25 |
import org.gvsig.expressionevaluator.impl.function.operator.EqOperator; |
|
26 |
import org.gvsig.expressionevaluator.impl.function.operator.GeOperator; |
|
27 |
import org.gvsig.expressionevaluator.impl.function.operator.GtOperator; |
|
28 |
import org.gvsig.expressionevaluator.impl.function.operator.IsOperator; |
|
29 |
import org.gvsig.expressionevaluator.impl.function.operator.LeOperator; |
|
30 |
import org.gvsig.expressionevaluator.impl.function.operator.LtOperator; |
|
31 |
import org.gvsig.expressionevaluator.impl.function.operator.ModOperator; |
|
32 |
import org.gvsig.expressionevaluator.impl.function.operator.MulOperator; |
|
33 |
import org.gvsig.expressionevaluator.impl.function.operator.NeOperator; |
|
34 |
import org.gvsig.expressionevaluator.impl.function.operator.NegOperator; |
|
35 |
import org.gvsig.expressionevaluator.impl.function.operator.NotOperator; |
|
36 |
import org.gvsig.expressionevaluator.impl.function.operator.OrOperator; |
|
37 |
import org.gvsig.expressionevaluator.impl.function.operator.RegExpOperator; |
|
38 |
import org.gvsig.expressionevaluator.impl.function.operator.SubstOperator; |
|
39 |
import org.gvsig.expressionevaluator.impl.function.predicate.IlikeOperator; |
|
40 |
import org.gvsig.expressionevaluator.impl.function.predicate.LikeOperator; |
|
41 |
import org.gvsig.expressionevaluator.impl.function.programming.GetattrFunction; |
|
42 |
import org.gvsig.expressionevaluator.impl.function.programming.GetitemFunction; |
|
20 | 43 |
import org.gvsig.fmap.geom.Geometry; |
21 | 44 |
import org.gvsig.tools.exception.BaseException; |
22 | 45 |
import org.gvsig.tools.visitor.Visitor; |
... | ... | |
60 | 83 |
public String toString() { |
61 | 84 |
StringBuilder builder = new StringBuilder(); |
62 | 85 |
Object v = this.value(); |
63 |
if( v instanceof CharSequence ) { |
|
64 |
v = StringUtils.wrap(v.toString(), "'"); |
|
65 |
builder.append(v); |
|
86 |
if( v == null ) { |
|
87 |
builder.append("NULL"); |
|
88 |
} else if( v instanceof CharSequence ) { |
|
89 |
if( StringUtils.isEmpty((CharSequence)v) ) { |
|
90 |
builder.append("''"); |
|
91 |
} else { |
|
92 |
v = StringUtils.wrap(v.toString(), "'"); |
|
93 |
builder.append(v); |
|
94 |
} |
|
66 | 95 |
|
96 |
} else if( v instanceof Boolean ) { |
|
97 |
builder.append(((Boolean)v).toString().toUpperCase()); |
|
98 |
|
|
67 | 99 |
} else if( v instanceof Geometry ) { |
68 | 100 |
try { |
69 | 101 |
builder.append("'"); |
... | ... | |
110 | 142 |
|
111 | 143 |
} |
112 | 144 |
|
113 |
public class BaseArguments implements Arguments {
|
|
145 |
public class BaseCodes implements Codes {
|
|
114 | 146 |
|
115 |
private final List<Code> args;
|
|
147 |
private final List<Code> codes;
|
|
116 | 148 |
|
117 |
public BaseArguments() {
|
|
118 |
this.args = new ArrayList<>();
|
|
149 |
public BaseCodes() {
|
|
150 |
this.codes = new ArrayList<>();
|
|
119 | 151 |
} |
120 | 152 |
|
121 | 153 |
@Override |
122 |
public int count() {
|
|
123 |
if( args == null ) {
|
|
154 |
public int size() {
|
|
155 |
if( codes == null ) {
|
|
124 | 156 |
return 0; |
125 | 157 |
} |
126 |
return this.args.size();
|
|
158 |
return this.codes.size();
|
|
127 | 159 |
} |
128 | 160 |
|
129 | 161 |
public void add(Code arg) { |
130 |
this.args.add(arg);
|
|
162 |
this.codes.add(arg);
|
|
131 | 163 |
} |
132 | 164 |
|
133 | 165 |
@Override |
134 | 166 |
public Iterator<Code> iterator() { |
135 |
return this.args.iterator();
|
|
167 |
return this.codes.iterator();
|
|
136 | 168 |
} |
137 | 169 |
|
138 | 170 |
@Override |
139 | 171 |
public Code get(int n) { |
140 |
return this.args.get(n);
|
|
172 |
return this.codes.get(n);
|
|
141 | 173 |
} |
142 | 174 |
|
143 | 175 |
@Override |
176 |
public boolean isEmpty() { |
|
177 |
return this.codes.isEmpty(); |
|
178 |
} |
|
179 |
|
|
180 |
@Override |
|
181 |
public List<Code> toList() { |
|
182 |
return Collections.unmodifiableList(this.codes); |
|
183 |
} |
|
184 |
|
|
185 |
@Override |
|
144 | 186 |
public void accept(Visitor visitor) throws BaseException { |
145 |
for( Code arg : this.args ) {
|
|
187 |
for( Code arg : this.codes ) {
|
|
146 | 188 |
visitor.visit(arg); |
147 | 189 |
} |
148 | 190 |
} |
149 | 191 |
|
150 | 192 |
@Override |
151 | 193 |
public String toString() { |
152 |
if( args != null ) {
|
|
194 |
if( codes != null ) {
|
|
153 | 195 |
StringBuilder builder = new StringBuilder(); |
154 | 196 |
boolean skipcoma = true; |
155 |
for( Code arg : args ) { |
|
197 |
for( Code code : codes ) { |
|
198 |
if( code == null ) { |
|
199 |
continue; |
|
200 |
} |
|
156 | 201 |
if( skipcoma ) { |
157 | 202 |
skipcoma = false; |
158 | 203 |
} else { |
159 | 204 |
builder.append(", "); |
160 | 205 |
} |
161 |
builder.append(arg.toString());
|
|
206 |
builder.append(code.toString());
|
|
162 | 207 |
} |
163 | 208 |
return builder.toString(); |
164 | 209 |
} |
... | ... | |
170 | 215 |
public class BaseCaller extends BaseCode implements Caller { |
171 | 216 |
|
172 | 217 |
private final String name; |
173 |
private final Arguments args;
|
|
218 |
private final Codes args;
|
|
174 | 219 |
private Function function; |
175 | 220 |
private final int type; |
176 | 221 |
|
177 |
public BaseCaller(String name, int type, Arguments args) {
|
|
222 |
public BaseCaller(String name, int type, Codes args) {
|
|
178 | 223 |
this.name = name; |
179 | 224 |
this.args = args; |
180 | 225 |
this.type = type; |
... | ... | |
208 | 253 |
} |
209 | 254 |
|
210 | 255 |
@Override |
211 |
public Code.Caller.Arguments args() {
|
|
256 |
public Codes args() { |
|
212 | 257 |
return this.args; |
213 | 258 |
} |
214 | 259 |
|
... | ... | |
244 | 289 |
private final Code obj; |
245 | 290 |
private final String methodname; |
246 | 291 |
|
247 |
public BaseMethod(Code obj, String methodname, Arguments args) {
|
|
292 |
public BaseMethod(Code obj, String methodname, Codes args) {
|
|
248 | 293 |
super(methodname, FUNCTION, args); |
249 | 294 |
this.obj = obj; |
250 | 295 |
this.methodname = methodname; |
... | ... | |
299 | 344 |
} |
300 | 345 |
|
301 | 346 |
@Override |
302 |
public Caller.Arguments args() {
|
|
303 |
return new BaseArguments();
|
|
347 |
public BaseCodes args() {
|
|
348 |
return new BaseCodes();
|
|
304 | 349 |
} |
305 | 350 |
|
306 | 351 |
@Override |
307 |
public Caller function(String name, int type, Arguments args) {
|
|
352 |
public Caller function(String name, int type, Codes args) {
|
|
308 | 353 |
return new BaseCaller(name, type, args); |
309 | 354 |
} |
310 | 355 |
|
311 | 356 |
@Override |
312 |
public Caller function(String name, Arguments args) {
|
|
357 |
public Caller function(String name, Codes args) {
|
|
313 | 358 |
return function(name, Caller.FUNCTION, args); |
314 | 359 |
} |
315 | 360 |
|
316 | 361 |
@Override |
317 |
public Code method(Code obj, String methodname, Arguments methodargs) {
|
|
362 |
public Code method(Code obj, String methodname, Codes methodargs) {
|
|
318 | 363 |
Method m = new BaseMethod(obj, methodname, methodargs); |
319 | 364 |
return m; |
320 | 365 |
} |
321 | 366 |
|
322 | 367 |
@Override |
323 | 368 |
public Caller operator(String name, Code arg1) { |
324 |
Arguments args = args();
|
|
325 |
((BaseArguments)args).add(arg1);
|
|
369 |
BaseCodes args = args();
|
|
370 |
args.add(arg1);
|
|
326 | 371 |
return function(name, Caller.UNARY_OPERATOR, args); |
327 | 372 |
} |
328 | 373 |
|
329 | 374 |
@Override |
330 | 375 |
public Caller operator(String name, Code arg1, Code arg2) { |
331 |
Arguments args = args();
|
|
332 |
((BaseArguments)args).add(arg1);
|
|
333 |
((BaseArguments)args).add(arg2);
|
|
376 |
BaseCodes args = args();
|
|
377 |
args.add(arg1);
|
|
378 |
args.add(arg2);
|
|
334 | 379 |
return function(name, Caller.BINARY_OPERATOR, args); |
335 | 380 |
} |
336 | 381 |
|
337 | 382 |
@Override |
338 | 383 |
public Code not(Code op1) { |
339 |
return operator("not", op1);
|
|
384 |
return operator(NotOperator.NAME, op1);
|
|
340 | 385 |
} |
341 | 386 |
|
342 | 387 |
@Override |
343 | 388 |
public Code negate(Code op1) { |
344 |
return operator("negate", op1);
|
|
389 |
return operator(NegOperator.NAME, op1);
|
|
345 | 390 |
} |
346 | 391 |
|
347 | 392 |
@Override |
393 |
public Code concat(Code op1, Code op2) { |
|
394 |
return operator(ConcatOperator.NAME, op1, op2); |
|
395 |
} |
|
396 |
|
|
397 |
@Override |
|
348 | 398 |
public Code add(Code op1, Code op2) { |
349 |
return operator("+", op1, op2);
|
|
399 |
return operator(AddOperator.NAME, op1, op2);
|
|
350 | 400 |
} |
351 | 401 |
|
352 | 402 |
@Override |
353 | 403 |
public Code subst(Code op1, Code op2) { |
354 |
return operator("-", op1, op2);
|
|
404 |
return operator(SubstOperator.NAME, op1, op2);
|
|
355 | 405 |
} |
356 | 406 |
|
357 | 407 |
@Override |
358 | 408 |
public Code mult(Code op1, Code op2) { |
359 |
return operator("*", op1, op2);
|
|
409 |
return operator(MulOperator.NAME, op1, op2);
|
|
360 | 410 |
} |
361 | 411 |
|
362 | 412 |
@Override |
363 | 413 |
public Code div(Code op1, Code op2) { |
364 |
return operator("/", op1, op2);
|
|
414 |
return operator(DivOperator.NAME, op1, op2);
|
|
365 | 415 |
} |
366 | 416 |
|
367 | 417 |
@Override |
368 | 418 |
public Code mod(Code op1, Code op2) { |
369 |
return operator("%", op1, op2);
|
|
419 |
return operator(ModOperator.NAME, op1, op2);
|
|
370 | 420 |
} |
371 | 421 |
|
372 | 422 |
@Override |
373 | 423 |
public Code or(Code op1, Code op2) { |
374 |
return operator("or", op1, op2);
|
|
424 |
return operator(OrOperator.NAME, op1, op2);
|
|
375 | 425 |
} |
376 | 426 |
|
377 | 427 |
@Override |
378 | 428 |
public Code and(Code op1, Code op2) { |
379 |
return operator("and", op1, op2);
|
|
429 |
return operator(AndOperator.NAME, op1, op2);
|
|
380 | 430 |
} |
381 | 431 |
|
382 | 432 |
@Override |
383 | 433 |
public Code like(Code op1, Code op2) { |
384 |
return operator("like", op1, op2);
|
|
434 |
return operator(LikeOperator.NAME, op1, op2);
|
|
385 | 435 |
} |
386 | 436 |
|
387 | 437 |
@Override |
388 | 438 |
public Code ilike(Code op1, Code op2) { |
389 |
return operator("ilike", op1, op2);
|
|
439 |
return operator(IlikeOperator.NAME, op1, op2);
|
|
390 | 440 |
} |
391 | 441 |
|
392 | 442 |
@Override |
393 | 443 |
public Code regexp(Code op1, Code op2) { |
394 |
return operator("~", op1, op2);
|
|
444 |
return operator(RegExpOperator.NAME, op1, op2);
|
|
395 | 445 |
} |
396 | 446 |
|
397 | 447 |
@Override |
398 | 448 |
public Code lt(Code op1, Code op2) { |
399 |
return operator("<", op1, op2);
|
|
449 |
return operator(LtOperator.NAME, op1, op2);
|
|
400 | 450 |
} |
401 | 451 |
|
402 | 452 |
@Override |
403 | 453 |
public Code gt(Code op1, Code op2) { |
404 |
return operator(">", op1, op2);
|
|
454 |
return operator(GtOperator.NAME, op1, op2);
|
|
405 | 455 |
} |
406 | 456 |
|
407 | 457 |
@Override |
408 | 458 |
public Code le(Code op1, Code op2) { |
409 |
return operator("<=", op1, op2);
|
|
459 |
return operator(LeOperator.NAME, op1, op2);
|
|
410 | 460 |
} |
411 | 461 |
|
412 | 462 |
@Override |
413 | 463 |
public Code ge(Code op1, Code op2) { |
414 |
return operator(">=", op1, op2);
|
|
464 |
return operator(GeOperator.NAME, op1, op2);
|
|
415 | 465 |
} |
416 | 466 |
|
417 | 467 |
@Override |
418 | 468 |
public Code eq(Code op1, Code op2) { |
419 |
return operator("=", op1, op2);
|
|
469 |
return operator(EqOperator.NAME, op1, op2);
|
|
420 | 470 |
} |
421 | 471 |
|
422 | 472 |
@Override |
423 | 473 |
public Code ne(Code op1, Code op2) { |
424 |
return operator("<>", op1, op2);
|
|
474 |
return operator(NeOperator.NAME, op1, op2);
|
|
425 | 475 |
} |
426 | 476 |
|
427 | 477 |
@Override |
428 | 478 |
public Code is(Code op1, Code op2) { |
429 |
return operator("is", op1, op2);
|
|
479 |
return operator(IsOperator.NAME, op1, op2);
|
|
430 | 480 |
} |
431 | 481 |
|
432 | 482 |
@Override |
433 | 483 |
public Code getattr(Code obj, String attrname) { |
434 |
Arguments args = args();
|
|
435 |
((BaseArguments)args).add(obj);
|
|
436 |
((BaseArguments)args).add(constant(attrname));
|
|
437 |
return function("getattr", args);
|
|
484 |
BaseCodes args = args();
|
|
485 |
args.add(obj);
|
|
486 |
args.add(constant(attrname));
|
|
487 |
return function(GetattrFunction.NAME, args);
|
|
438 | 488 |
} |
439 | 489 |
|
490 |
@Override |
|
491 |
public Code getitem(Code obj, Code index) { |
|
492 |
BaseCodes args = args(); |
|
493 |
args.add(obj); |
|
494 |
args.add(index); |
|
495 |
return function(GetitemFunction.NAME, args); |
|
496 |
} |
|
497 |
|
|
498 |
|
|
440 | 499 |
} |
Also available in: Unified diff