Statistics
| Revision:

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 / DefaultCodeBuilder.java @ 44592

History | View | Annotate | Download (23.3 KB)

1 43512 jjdelcerro
package org.gvsig.expressionevaluator.impl;
2
3
import java.util.ArrayList;
4 44139 jjdelcerro
import java.util.Collections;
5 43512 jjdelcerro
import java.util.Iterator;
6
import java.util.List;
7 44389 jjdelcerro
import org.apache.commons.lang3.ObjectUtils;
8 43519 jjdelcerro
import org.apache.commons.lang3.StringUtils;
9 43512 jjdelcerro
import org.gvsig.expressionevaluator.Code;
10
import static org.gvsig.expressionevaluator.Code.CALLER;
11
import static org.gvsig.expressionevaluator.Code.CONSTANT;
12 44006 jjdelcerro
import static org.gvsig.expressionevaluator.Code.IDENTIFIER;
13
import static org.gvsig.expressionevaluator.Code.UNDEFINED;
14 44198 jjdelcerro
import static org.gvsig.expressionevaluator.Code.CODES;
15 43512 jjdelcerro
import org.gvsig.expressionevaluator.Code.Caller;
16
import org.gvsig.expressionevaluator.Code.Constant;
17 44198 jjdelcerro
import static org.gvsig.expressionevaluator.Code.EMPTY_FORMATTER;
18 43512 jjdelcerro
import org.gvsig.expressionevaluator.Code.Identifier;
19 43939 jjdelcerro
import org.gvsig.expressionevaluator.Code.Method;
20 44243 jjdelcerro
//import org.gvsig.expressionevaluator.Code.Method;
21 43512 jjdelcerro
import org.gvsig.expressionevaluator.CodeBuilder;
22 44139 jjdelcerro
import org.gvsig.expressionevaluator.Codes;
23 44198 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionBuilder;
24 44207 jjdelcerro
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_ADD;
25
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_AND;
26
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_CONCAT;
27
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_DIV;
28
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_EQ;
29
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_GE;
30
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_GT;
31
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_ILIKE;
32
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_IS;
33
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_LE;
34
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_LIKE;
35
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_LT;
36
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_MOD;
37
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_MULT;
38
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_NE;
39
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_NEGATE;
40
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_NOT;
41
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_OR;
42
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_REGEXP;
43
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_SUBST;
44 44198 jjdelcerro
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
45
import org.gvsig.expressionevaluator.ExpressionUtils;
46
import org.gvsig.expressionevaluator.Formatter;
47 43512 jjdelcerro
import org.gvsig.expressionevaluator.Function;
48 43521 jjdelcerro
import org.gvsig.expressionevaluator.Interpreter;
49 44198 jjdelcerro
import org.gvsig.expressionevaluator.SymbolTable;
50 44243 jjdelcerro
import org.gvsig.expressionevaluator.impl.function.programming.CallMethodFunction;
51 44139 jjdelcerro
import org.gvsig.expressionevaluator.impl.function.programming.GetattrFunction;
52
import org.gvsig.expressionevaluator.impl.function.programming.GetitemFunction;
53 44009 jjdelcerro
import org.gvsig.fmap.geom.Geometry;
54 44389 jjdelcerro
import org.gvsig.tools.dynobject.DynObject;
55
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
56 43512 jjdelcerro
import org.gvsig.tools.exception.BaseException;
57 44389 jjdelcerro
import org.gvsig.tools.script.Script;
58 43512 jjdelcerro
import org.gvsig.tools.visitor.Visitor;
59
60 44009 jjdelcerro
@SuppressWarnings("UseSpecificCatch")
61 44198 jjdelcerro
public class DefaultCodeBuilder implements CodeBuilder {
62 43512 jjdelcerro
63 44198 jjdelcerro
    public abstract class BaseCode implements Code {
64 43512 jjdelcerro
65
        @Override
66
        public int code() {
67
            return UNDEFINED;
68
        }
69
70
        @Override
71
        public void accept(Visitor visitor) throws BaseException {
72
            visitor.visit(this);
73
        }
74
75 44198 jjdelcerro
        @Override
76
        public Value toValue(ExpressionBuilder builder) {
77
            return null;
78
        }
79
80
        @Override
81
        public Value toValue() {
82
            ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
83
            return this.toValue(builder);
84
        }
85
86
        @Override
87
        public void link(SymbolTable symbolTable) {
88
            if( this.code() == Code.CALLER ) {
89
                Caller caller = (Caller) this;
90
                if( caller.function() == null ) {
91
                    caller.function(symbolTable.function(caller.name()));
92
                }
93
                if( caller.parameters() != null ) {
94
                    for( Code arg : caller.parameters() ) {
95
                        arg.link(symbolTable);
96
                    }
97
                }
98
            }
99
        }
100 43512 jjdelcerro
    }
101
102
    class BaseConstant extends BaseCode implements Constant {
103
104 44211 jjdelcerro
        private Object value;
105 43512 jjdelcerro
106
        public BaseConstant(Object value) {
107
            this.value = value;
108
        }
109
110
        @Override
111
        public int code() {
112
            return CONSTANT;
113
        }
114
115
        @Override
116
        public Object value() {
117
            return this.value;
118
        }
119
120 44211 jjdelcerro
        public void value(Object v) {
121
            this.value = v;
122
        }
123
124 43521 jjdelcerro
        @Override
125 44198 jjdelcerro
        public Value toValue(ExpressionBuilder builder) {
126
            return builder.constant(this.value);
127
        }
128
129
        @Override
130 43521 jjdelcerro
        public String toString() {
131 44198 jjdelcerro
            return this.toString(EMPTY_FORMATTER);
132
        }
133
134
        @Override
135
        public String toString(Formatter<Code> formatter) {
136
            if( formatter.canApply(this) ) {
137
                return formatter.format(this);
138
            }
139 43521 jjdelcerro
            StringBuilder builder = new StringBuilder();
140
            Object v = this.value();
141 44139 jjdelcerro
            if( v == null ) {
142
                builder.append("NULL");
143
            } else if( v instanceof CharSequence ) {
144
                if( StringUtils.isEmpty((CharSequence)v) ) {
145
                    builder.append("''");
146
                } else {
147 44198 jjdelcerro
                    v = "'" + StringUtils.replace(v.toString(), "'", "''") + "'";
148 44139 jjdelcerro
                    builder.append(v);
149
                }
150 44009 jjdelcerro
151 44139 jjdelcerro
            } else if( v instanceof Boolean ) {
152
                builder.append(((Boolean)v).toString().toUpperCase());
153
154 44009 jjdelcerro
            } else if( v instanceof Geometry ) {
155
                try {
156
                    builder.append("'");
157
                    builder.append(((Geometry) v).convertToWKT());
158
                    builder.append("'::geometry");
159
                } catch (Exception ex) {
160
                    builder.append("'UNKNOW'::geometry");
161
                }
162
163
            } else {
164
                builder.append(v);
165 43521 jjdelcerro
            }
166
            return builder.toString();
167
        }
168
169 43512 jjdelcerro
    }
170
171 44154 jjdelcerro
    public interface RecursionControlSupport {
172
173
        public boolean enterCode(int max);
174
175
        public void exitCode();
176
177
        public void resetRecursionState();
178
    }
179
180
    private class RecursionSupport implements RecursionControlSupport {
181
182
        private int counter;
183
184
        public RecursionSupport() {
185
            this.counter = 0;
186
        }
187 43512 jjdelcerro
188 44154 jjdelcerro
        @Override
189
        public boolean enterCode(int max) {
190
            this.counter += 1;
191
            return this.counter < max;
192
        }
193 43512 jjdelcerro
194 44154 jjdelcerro
        @Override
195
        public void exitCode() {
196
            this.counter -= 1;
197
        }
198
199
        @Override
200
        public void resetRecursionState() {
201
            this.counter = 0;
202
        }
203
204
    }
205
206
    public class BaseIdentifier extends BaseCode implements Identifier, RecursionControlSupport {
207
208 44198 jjdelcerro
        private final String name;
209
        private final RecursionSupport recursionSupport;
210 44154 jjdelcerro
211 43512 jjdelcerro
        public BaseIdentifier(String name) {
212
            this.name = name;
213 44154 jjdelcerro
            this.recursionSupport = new RecursionSupport();
214 43512 jjdelcerro
        }
215
216
        @Override
217
        public int code() {
218
            return IDENTIFIER;
219
        }
220
221
        @Override
222
        public String name() {
223
            return this.name;
224
        }
225
226 43521 jjdelcerro
        @Override
227 44198 jjdelcerro
        public Value toValue(ExpressionBuilder builder) {
228
            return builder.variable(this.name);
229
        }
230
231
        @Override
232 43521 jjdelcerro
        public String toString() {
233 44198 jjdelcerro
            return this.toString(EMPTY_FORMATTER);
234
        }
235
236
        @Override
237
        public String toString(Formatter<Code> formatter) {
238
            if( formatter.canApply(this) ) {
239
                return formatter.format(this);
240
            }
241 43521 jjdelcerro
            StringBuilder builder = new StringBuilder();
242 44006 jjdelcerro
            builder.append("\"");
243 43521 jjdelcerro
            builder.append(this.name());
244 44006 jjdelcerro
            builder.append("\"");
245 43521 jjdelcerro
            return builder.toString();
246
        }
247
248 44154 jjdelcerro
        @Override
249
        public boolean enterCode(int max) {
250
            return this.recursionSupport.enterCode(max);
251
        }
252
253
        @Override
254
        public void exitCode() {
255
            this.recursionSupport.exitCode();
256
        }
257
258
        @Override
259
        public void resetRecursionState() {
260
            this.recursionSupport.resetRecursionState();
261
        }
262
263 43512 jjdelcerro
    }
264
265 44139 jjdelcerro
    public class BaseCodes implements Codes {
266 43512 jjdelcerro
267 44139 jjdelcerro
        private final List<Code> codes;
268 43512 jjdelcerro
269 44139 jjdelcerro
        public BaseCodes() {
270
            this.codes = new ArrayList<>();
271 43512 jjdelcerro
        }
272
273
        @Override
274 44198 jjdelcerro
        public int code() {
275
            return CODES;
276
        }
277
278
        @Override
279 44139 jjdelcerro
        public int size() {
280
            if( codes == null ) {
281 43512 jjdelcerro
                return 0;
282
            }
283 44139 jjdelcerro
            return this.codes.size();
284 43512 jjdelcerro
        }
285
286
        public void add(Code arg) {
287 44139 jjdelcerro
            this.codes.add(arg);
288 43512 jjdelcerro
        }
289
290 44243 jjdelcerro
        public void insert(int pos, Code arg) {
291
            this.codes.add(pos, arg);
292
        }
293
294 43512 jjdelcerro
        @Override
295
        public Iterator<Code> iterator() {
296 44139 jjdelcerro
            return this.codes.iterator();
297 43512 jjdelcerro
        }
298
299
        @Override
300
        public Code get(int n) {
301 44139 jjdelcerro
            return this.codes.get(n);
302 43512 jjdelcerro
        }
303
304
        @Override
305 44139 jjdelcerro
        public boolean isEmpty() {
306
            return this.codes.isEmpty();
307
        }
308
309
        @Override
310
        public List<Code> toList() {
311
            return Collections.unmodifiableList(this.codes);
312
        }
313
314
        @Override
315 43512 jjdelcerro
        public void accept(Visitor visitor) throws BaseException {
316 44139 jjdelcerro
            for( Code arg : this.codes ) {
317 44190 jjdelcerro
                arg.accept(visitor);
318 43512 jjdelcerro
            }
319
        }
320
321 43521 jjdelcerro
        @Override
322
        public String toString() {
323 44198 jjdelcerro
            return this.toString(EMPTY_FORMATTER);
324
        }
325
326
        @Override
327
        public Value toValue(ExpressionBuilder builder) {
328
            throw new UnsupportedOperationException();
329
        }
330
331
        @Override
332
        public Value toValue() {
333
            throw new UnsupportedOperationException();
334
        }
335
336
        @Override
337
        public String toString(Formatter<Code> formatter) {
338
            if( formatter.canApply(this) ) {
339
                return formatter.format(this);
340
            }
341 44139 jjdelcerro
            if( codes != null ) {
342 43521 jjdelcerro
                StringBuilder builder = new StringBuilder();
343
                boolean skipcoma = true;
344 44139 jjdelcerro
                for( Code code : codes ) {
345
                    if( code == null ) {
346
                        continue;
347
                    }
348 43521 jjdelcerro
                    if( skipcoma ) {
349
                        skipcoma = false;
350
                    } else {
351
                        builder.append(", ");
352
                    }
353 44198 jjdelcerro
                    builder.append(code.toString(formatter));
354 43521 jjdelcerro
                }
355
                return builder.toString();
356
            }
357
            return "";
358
        }
359
360 44198 jjdelcerro
        @Override
361
        public void link(SymbolTable symbolTable) {
362
            for (Code code : this.codes) {
363
                code.link(symbolTable);
364
            }
365
        }
366
367 43512 jjdelcerro
    }
368
369 44154 jjdelcerro
    public class BaseCaller extends BaseCode implements Caller, RecursionControlSupport {
370 43512 jjdelcerro
371
        private final String name;
372 44139 jjdelcerro
        private final Codes args;
373 43512 jjdelcerro
        private Function function;
374
        private final int type;
375 44198 jjdelcerro
        private final RecursionSupport recursionSupport;
376 43512 jjdelcerro
377 44139 jjdelcerro
        public BaseCaller(String name, int type, Codes args) {
378 43512 jjdelcerro
            this.name = name;
379
            this.args = args;
380
            this.type = type;
381
            this.function = null;
382 44154 jjdelcerro
            this.recursionSupport = new RecursionSupport();
383 43512 jjdelcerro
        }
384
385
        @Override
386
        public int code() {
387
            return CALLER;
388
        }
389
390
        @Override
391 43521 jjdelcerro
        public Object call(Interpreter interpreter, Object[] args) throws Exception {
392
            return this.function.call(interpreter, args);
393 43512 jjdelcerro
        }
394
395
        @Override
396
        public String name() {
397
            return this.name;
398
        }
399
400
        @Override
401
        public Function function() {
402
            return this.function;
403
        }
404
405
        @Override
406
        public Function function(Function function) {
407
            this.function = function;
408
            return this.function;
409
        }
410
411
        @Override
412 44198 jjdelcerro
        public Codes parameters() {
413 43512 jjdelcerro
            return this.args;
414
        }
415
416
        @Override
417
        public int type() {
418
            return this.type;
419
        }
420
421
        @Override
422
        public void accept(Visitor visitor) throws BaseException {
423
            visitor.visit(this);
424 44052 omartinez
            if(this.args!=null) {
425
                this.args.accept(visitor);
426
            }
427 43512 jjdelcerro
        }
428
429 43521 jjdelcerro
        @Override
430 44198 jjdelcerro
        public Value toValue(ExpressionBuilder builder) {
431
            switch(this.type) {
432
                case UNARY_OPERATOR:
433
                    return builder.function(
434 44207 jjdelcerro
                            OPERATOR_NEGATE.equalsIgnoreCase(this.name())?
435 44198 jjdelcerro
                                "-" :
436
                                this.name(),
437
                            this.parameters().get(0).toValue(builder)
438
                    );
439
                case BINARY_OPERATOR:
440
                    return builder.binaryOperator(
441
                            this.name(),
442
                            this.parameters().get(0).toValue(builder),
443
                            this.parameters().get(1).toValue(builder)
444
                    );
445
                case FUNCTION:
446
                default:
447
                    ExpressionBuilder.Function f = builder.function(this.name());
448
                    if( this.parameters()!=null ) {
449
                        for (Code parameter : this.parameters()) {
450
                            f.parameter(parameter.toValue(builder));
451
                        }
452
453
                    }
454
                    return f;
455
456
            }
457
        }
458
459
        @Override
460 43521 jjdelcerro
        public String toString() {
461 44198 jjdelcerro
            return this.toString(EMPTY_FORMATTER);
462
        }
463
464
        @Override
465
        public String toString(Formatter<Code> formatter) {
466
            if( formatter.canApply(this) ) {
467
                return formatter.format(this);
468
            }
469 44379 jjdelcerro
            Code code;
470 43521 jjdelcerro
            StringBuilder builder = new StringBuilder();
471 44198 jjdelcerro
            switch(this.type) {
472
                case UNARY_OPERATOR:
473 44207 jjdelcerro
                    if( OPERATOR_NEGATE.equalsIgnoreCase(this.name()) ) {
474 44198 jjdelcerro
                        builder.append("-");
475
                    } else {
476
                        builder.append(this.name());
477
                    }
478
                    builder.append("(");
479
                    builder.append(this.parameters().get(0).toString(formatter));
480
                    builder.append(")");
481
                    break;
482
                case BINARY_OPERATOR:
483
                    builder.append("(");
484 44379 jjdelcerro
                    code = this.parameters().get(0);
485
                    if( code == null ) {
486
                        builder.append("?NULL?");
487
                    } else {
488
                        builder.append(code.toString(formatter));
489
                    }
490 44198 jjdelcerro
                    builder.append(" ");
491
                    builder.append(this.name());
492
                    builder.append(" ");
493 44379 jjdelcerro
                    code = this.parameters().get(1);
494
                    if( code == null ) {
495
                        builder.append("?NULL?");
496
                    } else {
497
                        builder.append(code.toString(formatter));
498
                    }
499 44198 jjdelcerro
                    builder.append(")");
500
                    break;
501
                case FUNCTION:
502
                default:
503
                    builder.append(this.name());
504
                    builder.append("(");
505
                    if( this.parameters()!=null ) {
506
                        builder.append(this.parameters().toString(formatter));
507
                    }
508
                    builder.append(")");
509 43521 jjdelcerro
            }
510
            return builder.toString();
511
        }
512
513 44154 jjdelcerro
        @Override
514
        public boolean enterCode(int max) {
515
            return this.recursionSupport.enterCode(max);
516
        }
517
518
        @Override
519
        public void exitCode() {
520
            this.recursionSupport.exitCode();
521
        }
522
523
        @Override
524
        public void resetRecursionState() {
525
            this.recursionSupport.resetRecursionState();
526
        }
527 43512 jjdelcerro
    }
528
529 44243 jjdelcerro
    public class BaseMethod extends BaseCode implements Method {
530 43939 jjdelcerro
531 44243 jjdelcerro
        private final Code instance;
532 43939 jjdelcerro
        private final String methodname;
533 44243 jjdelcerro
        private final Codes args;
534 43939 jjdelcerro
535 44243 jjdelcerro
        public BaseMethod(Code instance, String methodname, Codes args) {
536
            this.instance = instance;
537 43939 jjdelcerro
            this.methodname = methodname;
538 44243 jjdelcerro
            this.args = args;
539 43939 jjdelcerro
        }
540
541
        @Override
542
        public int code() {
543
            return METHOD;
544
        }
545
546
        @Override
547
        public String methodname() {
548
            return this.methodname;
549
        }
550
551
        @Override
552 44243 jjdelcerro
        public Code instance() {
553
            return this.instance;
554 43939 jjdelcerro
        }
555
556
        @Override
557 44243 jjdelcerro
        public Codes parameters() {
558
            return this.args;
559
        }
560
561
        @Override
562
        public Object call(Interpreter interpreter, Object[] args) throws Exception {
563
            Object theInstance = interpreter.run(instance);
564 44389 jjdelcerro
            if( theInstance instanceof SimpleScript ) {
565
                try {
566
                    return ((SimpleScript)theInstance).invokeFunction(methodname, args);
567
                } catch(NoSuchMethodException ex) {
568
                    // Ignore... continue calling instance method
569
                }
570
            } else if( theInstance instanceof DynObject ) {
571
                DynObject dynobj = (DynObject) theInstance;
572
                try {
573
                    return dynobj.invokeDynMethod(methodname, args);
574
                } catch(DynMethodNotSupportedException ex) {
575
                    // Ignore... continue calling instance method
576
                }
577
            }
578 44243 jjdelcerro
            return InstanceUtils.callmethod(theInstance, methodname, args);
579
        }
580
581
        @Override
582 43939 jjdelcerro
        public String toString() {
583 44198 jjdelcerro
            return this.toString(EMPTY_FORMATTER);
584
        }
585
586
        @Override
587
        public Value toValue(ExpressionBuilder builder) {
588 44243 jjdelcerro
            ExpressionBuilder.Method m = builder.method(this.instance.toValue(builder), this.methodname);
589 44198 jjdelcerro
            if( this.parameters()!=null ) {
590
                for (Code parameter : this.parameters()) {
591
                    m.parameter(parameter.toValue(builder));
592
                }
593
            }
594
            return m;
595
        }
596
597
        @Override
598
        public String toString(Formatter<Code> formatter) {
599
            if( formatter.canApply(this) ) {
600
                return formatter.format(this);
601
            }
602 43939 jjdelcerro
            StringBuilder builder = new StringBuilder();
603 44243 jjdelcerro
            builder.append(this.instance.toString(formatter));
604 43939 jjdelcerro
            builder.append("->");
605
            builder.append(this.methodname());
606
            builder.append("(");
607 44198 jjdelcerro
            if( this.parameters()!=null ) {
608
                builder.append(this.parameters().toString(formatter));
609 43939 jjdelcerro
            }
610
            builder.append(")");
611
            return builder.toString();
612
        }
613 44243 jjdelcerro
614
615 43939 jjdelcerro
    }
616
617 43512 jjdelcerro
    @Override
618 43809 jjdelcerro
    public CodeBuilder clone() throws CloneNotSupportedException {
619
        // This implementation of CodeBuilder does not maintain state, so
620
        // we only call the super class.
621
        DefaultCodeBuilder other = (DefaultCodeBuilder) super.clone();
622
        return other;
623
    }
624
625
    @Override
626 43512 jjdelcerro
    public Constant constant(Object value) {
627
        return new BaseConstant(value);
628
    }
629
630
    @Override
631
    public Identifier identifier(String name) {
632
        return new BaseIdentifier(name);
633
    }
634
635
    @Override
636 44139 jjdelcerro
    public BaseCodes args() {
637
        return new BaseCodes();
638 43512 jjdelcerro
    }
639
640
    @Override
641 44139 jjdelcerro
    public Caller function(String name, int type, Codes args) {
642 43512 jjdelcerro
        return new BaseCaller(name, type, args);
643
    }
644
645
    @Override
646 44139 jjdelcerro
    public Caller function(String name, Codes args) {
647 43512 jjdelcerro
        return function(name, Caller.FUNCTION, args);
648
    }
649 43939 jjdelcerro
650 43512 jjdelcerro
    @Override
651 44243 jjdelcerro
    public Code method(Code instance, String methodname, Codes methodargs) {
652
        Method m = new BaseMethod(instance, methodname, methodargs);
653 43939 jjdelcerro
        return m;
654
    }
655
656
    @Override
657 43512 jjdelcerro
    public Caller operator(String name, Code arg1) {
658 44139 jjdelcerro
        BaseCodes args = args();
659
        args.add(arg1);
660 43512 jjdelcerro
        return function(name, Caller.UNARY_OPERATOR, args);
661
    }
662
663
    @Override
664
    public Caller operator(String name, Code arg1, Code arg2) {
665 44139 jjdelcerro
        BaseCodes args = args();
666
        args.add(arg1);
667
        args.add(arg2);
668 43512 jjdelcerro
        return function(name, Caller.BINARY_OPERATOR, args);
669
    }
670 44198 jjdelcerro
671 43512 jjdelcerro
    @Override
672
    public Code not(Code op1) {
673 44207 jjdelcerro
        return operator(OPERATOR_NOT, op1);
674 43512 jjdelcerro
    }
675
676
    @Override
677 44098 jjdelcerro
    public Code negate(Code op1) {
678 44207 jjdelcerro
        return operator(OPERATOR_NEGATE, op1);
679 44098 jjdelcerro
    }
680
681
    @Override
682 44139 jjdelcerro
    public Code concat(Code op1, Code op2) {
683 44207 jjdelcerro
        return operator(OPERATOR_CONCAT, op1, op2);
684 44139 jjdelcerro
    }
685
686
    @Override
687 43512 jjdelcerro
    public Code add(Code op1, Code op2) {
688 44207 jjdelcerro
        return operator(OPERATOR_ADD, op1, op2);
689 43512 jjdelcerro
    }
690
691
    @Override
692
    public Code subst(Code op1, Code op2) {
693 44207 jjdelcerro
        return operator(OPERATOR_SUBST, op1, op2);
694 43512 jjdelcerro
    }
695
696
    @Override
697
    public Code mult(Code op1, Code op2) {
698 44207 jjdelcerro
        return operator(OPERATOR_MULT, op1, op2);
699 43512 jjdelcerro
    }
700
701
    @Override
702
    public Code div(Code op1, Code op2) {
703 44207 jjdelcerro
        return operator(OPERATOR_DIV, op1, op2);
704 43512 jjdelcerro
    }
705
706
    @Override
707
    public Code mod(Code op1, Code op2) {
708 44207 jjdelcerro
        return operator(OPERATOR_MOD, op1, op2);
709 43512 jjdelcerro
    }
710
711
    @Override
712
    public Code or(Code op1, Code op2) {
713 44207 jjdelcerro
        return operator(OPERATOR_OR, op1, op2);
714 43512 jjdelcerro
    }
715
716
    @Override
717
    public Code and(Code op1, Code op2) {
718 44207 jjdelcerro
        return operator(OPERATOR_AND, op1, op2);
719 43512 jjdelcerro
    }
720
721
    @Override
722
    public Code like(Code op1, Code op2) {
723 44207 jjdelcerro
        return operator(OPERATOR_LIKE, op1, op2);
724 43512 jjdelcerro
    }
725
726
    @Override
727
    public Code ilike(Code op1, Code op2) {
728 44207 jjdelcerro
        return operator(OPERATOR_ILIKE, op1, op2);
729 43512 jjdelcerro
    }
730
731
    @Override
732 43532 jjdelcerro
    public Code regexp(Code op1, Code op2) {
733 44207 jjdelcerro
        return operator(OPERATOR_REGEXP, op1, op2);
734 43532 jjdelcerro
    }
735
736
    @Override
737 43512 jjdelcerro
    public Code lt(Code op1, Code op2) {
738 44207 jjdelcerro
        return operator(OPERATOR_LT, op1, op2);
739 43512 jjdelcerro
    }
740
741
    @Override
742
    public Code gt(Code op1, Code op2) {
743 44207 jjdelcerro
        return operator(OPERATOR_GT, op1, op2);
744 43512 jjdelcerro
    }
745
746
    @Override
747
    public Code le(Code op1, Code op2) {
748 44207 jjdelcerro
        return operator(OPERATOR_LE, op1, op2);
749 43512 jjdelcerro
    }
750
751
    @Override
752
    public Code ge(Code op1, Code op2) {
753 44207 jjdelcerro
        return operator(OPERATOR_GE, op1, op2);
754 43512 jjdelcerro
    }
755
756
    @Override
757
    public Code eq(Code op1, Code op2) {
758 44207 jjdelcerro
        return operator(OPERATOR_EQ, op1, op2);
759 43512 jjdelcerro
    }
760
761
    @Override
762
    public Code ne(Code op1, Code op2) {
763 44207 jjdelcerro
        return operator(OPERATOR_NE, op1, op2);
764 43512 jjdelcerro
    }
765
766
    @Override
767
    public Code is(Code op1, Code op2) {
768 44207 jjdelcerro
        return operator(OPERATOR_IS, op1, op2);
769 43512 jjdelcerro
    }
770
771 43939 jjdelcerro
    @Override
772
    public Code getattr(Code obj, String attrname) {
773 44139 jjdelcerro
        BaseCodes args = args();
774
        args.add(obj);
775
        args.add(constant(attrname));
776
        return function(GetattrFunction.NAME, args);
777 43939 jjdelcerro
    }
778
779 44139 jjdelcerro
    @Override
780
    public Code getitem(Code obj, Code index) {
781
        BaseCodes args = args();
782
        args.add(obj);
783
        args.add(index);
784
        return function(GetitemFunction.NAME, args);
785
    }
786
787
788 44198 jjdelcerro
789 43512 jjdelcerro
}