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

View differences:

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