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 / DefaultExpressionBuilder.java @ 44759

History | View | Annotate | Download (40.5 KB)

1
package org.gvsig.expressionevaluator.impl;
2

    
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
import org.gvsig.expressionevaluator.Code;
12
import org.gvsig.expressionevaluator.Expression;
13

    
14
import org.gvsig.expressionevaluator.ExpressionBuilder;
15
import static org.gvsig.expressionevaluator.ExpressionBuilder.EMPTY_FORMATTER;
16
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_CONSTANT;
17
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE;
18
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
19
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
20
import org.gvsig.expressionevaluator.ExpressionUtils;
21
import org.gvsig.expressionevaluator.Formatter;
22
import org.gvsig.expressionevaluator.ReprMethod;
23

    
24
@SuppressWarnings({"UseSpecificCatch" ,"OverridableMethodCallInConstructor"})
25
public class DefaultExpressionBuilder implements ExpressionBuilder {
26
    
27
    private static final String FORMAT_QUOTE_FOR_STRINGS = "'";
28
    private static final String FORMAT_QUOTE_FOR_IDENTIFIERS = "\"";
29

    
30
    private static final String FORMAT_TRUE = "TRUE";
31
    private static final String FORMAT_FALSE = "FALSE";
32

    
33
    private static final String FORMAT_GROUP = "( {0} )";
34

    
35
    private static final String FORMAT_ISNULL = "( ({0}) IS NULL )";
36
    private static final String FORMAT_NOTISNULL = "( ({0}) IS NOT NULL )";
37
    private static final String FORMAT_OPERATOR_NOT = "( NOT ({0}) )";
38

    
39
    private static final String FORMAT_OPERATOR_AND = "({0} AND {1})";
40
    private static final String FORMAT_OPERATOR_OR = "{0} OR {1}";
41
    private static final String FORMAT_OPERATOR_EQ = "( ({0}) = ({1}) )";
42
    private static final String FORMAT_OPERATOR_NE = "( ({0}) <> ({1}) )";
43
    private static final String FORMAT_OPERATOR_GT = "( ({0}) > ({1}) )";
44
    private static final String FORMAT_OPERATOR_GE = "( ({0}) >= ({1}) )";
45
    private static final String FORMAT_OPERATOR_LT = "( ({0}) < ({1}) )";
46
    private static final String FORMAT_OPERATOR_LE = "( ({0}) <= ({1}) )";
47
    private static final String FORMAT_OPERATOR_LIKE = "( ({0}) LIKE ({1}) )";
48
    private static final String FORMAT_OPERATOR_ILIKE = "( ({0}) ILIKE ({1}) )";
49
    private static final String FORMAT_OPERATOR_ADD = "{0} + {1}";
50
    private static final String FORMAT_OPERATOR_SUBST = "{0} - {1}";
51
    private static final String FORMAT_OPERATOR_MULT = "({0} * {1})";
52
    private static final String FORMAT_OPERATOR_DIV = "({0} / {1})";
53
    private static final String FORMAT_OPERATOR_CONCAT = "{0} || {1}";
54

    
55
    public static class GroupBase extends AbstractValue implements Group {
56

    
57
        protected Value value;
58

    
59
        public GroupBase(Value value) {
60
            this.value = value;
61
        }
62

    
63
        @Override
64
        public Value value() {
65
            return value;
66
        }
67

    
68
        @Override
69
        public void accept(Visitor visitor, VisitorFilter filter) {
70
            super.accept(visitor, filter);
71
            this.value.accept(visitor, filter);
72
        }
73

    
74
        @Override
75
        public void replace(Value target, Value replacement) {
76
            if( this.value == target ) {
77
                this.value = replacement;
78
            } else {
79
                this.value.replace(target, replacement);
80
            }
81
        }
82

    
83
        @Override
84
        public String toString() {
85
            return this.toString(EMPTY_FORMATTER);
86
        }
87
        
88
        @Override
89
        public String toString(Formatter<Value> formatter) {
90
            if( formatter!=null && formatter.canApply(this) ) {
91
                return formatter.format(this);
92
            }
93
            return MessageFormat.format(FORMAT_GROUP, this.value.toString());
94
        }
95
    }
96

    
97
    public static class VariableBase extends AbstractValue implements Variable {
98

    
99
        protected String name;
100
        protected ExpressionBuilder builder;
101
        
102
        public VariableBase(ExpressionBuilder builder, String name) {
103
            this.name = name;
104
            this.builder = builder;
105
        }
106

    
107
        @Override
108
        public String name() {
109
            return this.name;
110
        }
111

    
112
        @Override
113
        public String toString() {
114
            return this.toString(EMPTY_FORMATTER);
115
        }
116
        
117
        @Override
118
        public String toString(Formatter<Value> formatter) {
119
            if( formatter!=null && formatter.canApply(this) ) {
120
                return formatter.format(this);
121
            }
122
            return this.builder.identifier(this.name);
123
        }
124

    
125
        @Override
126
        public int compareTo(Variable o) {
127
            return this.name.compareTo(o.name());
128
        }
129

    
130
        @Override
131
        public boolean equals(Object obj) {
132
            if (!(obj instanceof Variable)) {
133
                return false;
134
            }
135
            return this.name.equals(((Variable) obj).name());
136
        }
137

    
138
        @Override
139
        public int hashCode() {
140
            int hash = 7;
141
            hash = 37 * hash + Objects.hashCode(this.name);
142
            return hash;
143
        }
144
    }
145

    
146
    public static class ParameterBase extends AbstractValue implements Parameter {
147

    
148
        protected String name;
149
        protected Object value;
150
        protected int type;
151

    
152
        public ParameterBase() {
153
            this.type = PARAMETER_TYPE_CONSTANT;
154
            this.name = null;
155
            this.value = null;
156
        }
157

    
158
        @Override
159
        public Parameter as_constant() {
160
            this.type = PARAMETER_TYPE_CONSTANT;
161
            if (this.value == null && this.name != null) {
162
                this.value = this.name;
163
            }
164
            return this;
165
        }
166

    
167
        @Override
168
        public Parameter as_variable() {
169
            this.type = PARAMETER_TYPE_VARIABLE;
170
            if (this.value != null && this.name == null) {
171
                this.name = (String) this.value;
172
            }
173
            return this;
174
        }
175
        
176
        @Override
177
        public String name() {
178
            switch (this.type) {
179
                case PARAMETER_TYPE_VARIABLE:
180
                    return this.name;
181
                case PARAMETER_TYPE_CONSTANT:
182
                    if (this.value == null) {
183
                        return null;
184
                    }
185
                    return this.value.toString();
186
                default:
187
                    if (this.name != null) {
188
                        return this.name;
189
                    }
190
                    if (this.value != null) {
191
                        return this.value.toString();
192
                    }
193
                    return null;
194
            }
195
        }
196

    
197
        @Override
198
        public int type() {
199
            return this.type;
200
        }
201

    
202
        @Override
203
        public boolean is_constant() {
204
            return this.type == PARAMETER_TYPE_CONSTANT;
205
        }
206

    
207
        @Override
208
        public boolean is_variable() {
209
            return this.type == PARAMETER_TYPE_VARIABLE;
210
        }
211

    
212
        @Override
213
        public Parameter value(Object value) {
214
            this.value = value;
215
            return this;
216
        }
217

    
218
        @Override
219
        public Parameter name(String name) {
220
            this.type = PARAMETER_TYPE_VARIABLE;
221
            this.name = name;
222
            return this;
223
        }
224

    
225
        @Override
226
        public Object value() {
227
            try {
228
                switch (this.type) {
229
                    case PARAMETER_TYPE_CONSTANT:
230
                        return this.value;
231
                    case PARAMETER_TYPE_VARIABLE:
232
                    default:
233
                        return this.value;
234
                }
235
            } catch (Exception ex) {
236
                throw new RuntimeException("Can't get value from parameter.", ex);
237
            }
238
        }
239

    
240
        @Override
241
        public String toString() {
242
            return this.toString(EMPTY_FORMATTER);
243
        }
244
        
245
        @Override
246
        public String toString(Formatter<Value> formatter) {
247
            if( formatter!=null && formatter.canApply(this) ) {
248
                return formatter.format(this);
249
            }
250
            switch (this.type) {
251
                case PARAMETER_TYPE_CONSTANT:
252
                    return Objects.toString(this.value);
253
                    
254
                case PARAMETER_TYPE_VARIABLE:
255
                default:
256
                    return "?";
257
            }
258
        }
259
    }
260

    
261
    public static class ConstantBase extends AbstractValue implements Constant {
262

    
263
        protected Object value;
264
        protected ExpressionBuilder builder;
265
        
266
        public ConstantBase(ExpressionBuilder builder, Object value) {
267
            this.value = value;
268
            this.builder = builder;
269
        }
270

    
271
        @Override
272
        public Object value() {
273
            return this.value;
274
        }
275

    
276
        @Override
277
        public String toString() {
278
            return this.toString(EMPTY_FORMATTER);
279
        }
280
        
281
        @Override
282
        public String toString(Formatter<Value> formatter) {
283
            if( formatter!=null && formatter.canApply(this) ) {
284
                return formatter.format(this);
285
            }
286
            if( this.value==null ) {
287
                return "NULL";
288
            }
289
            if( this.value instanceof byte[] ) {
290
                return "DECODE('"+this.builder.bytearray_hex((byte[])this.value)+"','hex')";
291
            }
292
            if (this.value instanceof String) {
293
                return this.builder.string((String) this.value);
294
            }
295
            if (this.value instanceof Boolean) {
296
                if (((Boolean) this.value)) {
297
                    return FORMAT_TRUE;
298
                } else {
299
                    return FORMAT_FALSE;
300
                }
301
            }
302
            ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
303
            ReprMethod repr = manager.getReprMethod(this.value);            
304
            return repr.repr(value);
305
        }
306
    }
307

    
308
    public static class CustomBase extends AbstractValue implements Custom {
309

    
310
        protected Object value;
311

    
312
        // Esto es para permitir declarar parametros y columnas en una seccion
313
        // custom.
314
        protected List<Value> values;
315

    
316
        public CustomBase(Object value) {
317
            this.value = value;
318
        }
319

    
320
        @Override
321
        public void accept(Visitor visitor, VisitorFilter filter) {
322
            super.accept(visitor, filter);
323
            if (this.values != null) {
324
                for (Value theValue : values) {
325
                    theValue.accept(visitor, filter);
326
                }
327
            }
328
        }
329

    
330
        @Override
331
        public void replace(Value target, Value replacement) {
332
            if( this.values == null ) {
333
                return;
334
            }
335
            for (int i = 0; i < values.size(); i++) {
336
                Value theValue = values.get(i);
337
                if( target == theValue ) {
338
                    values.set(i, replacement);
339
                } else {
340
                    theValue.replace(target, replacement);
341
                }
342
            }
343
        }
344

    
345
        @Override
346
        public Object value() {
347
            return this.value;
348
        }
349

    
350
        @Override
351
        public Custom add(Variable variable) {
352
            if (this.values == null) {
353
                this.values = new ArrayList<>();
354
            }
355
            this.values.add(variable);
356
            return this;
357
        }
358

    
359
        @Override
360
        public Custom add(Parameter parameter) {
361
            if (this.values == null) {
362
                this.values = new ArrayList<>();
363
            }
364
            this.values.add(parameter);
365
            return this;
366
        }
367

    
368
        @Override
369
        public String toString() {
370
            return this.toString(EMPTY_FORMATTER);
371
        }
372
        
373
        @Override
374
        public String toString(Formatter<Value> formatter) {
375
            if( formatter!=null && formatter.canApply(this) ) {
376
                return formatter.format(this);
377
            }
378
            return Objects.toString(this.value, "");
379
        }
380
    }
381

    
382
    public static class FunctionBase extends AbstractValue implements Function {
383

    
384
        protected String name;
385
        protected String format;
386
        protected List<Value> parameters;
387

    
388
        public FunctionBase(String name, String format) {
389
            this.name = name;
390
            this.format = format;
391
        }
392

    
393
        public FunctionBase(String name) {
394
            this(name,null);
395
        }
396

    
397
        @Override
398
        public List<Value> parameters() {
399
            if (this.parameters == null) {
400
                this.parameters = new ArrayList<>();
401
            }
402
            return this.parameters;
403
        }
404

    
405
        @Override
406
        public Function parameter(Value parameter) {
407
            this.parameters().add(parameter);
408
            return this;
409
        }
410

    
411
        @Override
412
        public String name() {
413
            return this.name;
414
        }
415

    
416
        @Override
417
        public void accept(Visitor visitor, VisitorFilter filter) {
418
            super.accept(visitor, filter);
419
            if( this.parameters!=null ) {
420
                for (Value argument : this.parameters) {
421
                    if( argument!=null ) {
422
                        argument.accept(visitor, filter);
423
                    }
424
                }
425
            }
426
        }
427

    
428
        @Override
429
        public void replace(Value target, Value replacement) {
430
          if( this.parameters!=null ) {
431
            for (int i = 0; i < parameters.size(); i++) {
432
                Value argument = parameters.get(i);
433
                if( argument == target ) {
434
                    parameters.set(i, replacement);
435
                } else {
436
                    argument.replace(target, replacement);
437
                }
438
            }
439
          }
440
        }
441
        
442
        @Override
443
        public String toString() {
444
            return this.toString(EMPTY_FORMATTER);
445
        }
446
        
447
        @Override
448
        public String toString(Formatter<Value> formatter) {
449
            if( formatter!=null && formatter.canApply(this) ) {
450
                return formatter.format(this);
451
            }
452
            if( this.format==null ) {
453
                StringBuilder builder = new StringBuilder();
454
                builder.append(name);
455
                builder.append("(");
456
                if (this.parameters != null && !this.parameters.isEmpty()) {
457
                    boolean first = true;
458
                    for (Value argument : this.parameters) {
459
                        if( first ) {
460
                            first=false;
461
                            builder.append(argument.toString(formatter));
462
                        } else {
463
                            builder.append(", ");
464
                            builder.append(argument.toString(formatter));
465
                        }
466
                    }
467
                }
468
                builder.append(")");
469
                return builder.toString();
470
            }
471
            if (this.parameters != null && !this.parameters.isEmpty()) {
472
                List<String> values = new ArrayList<>();
473
                for (Value argument : this.parameters) {
474
                    values.add(argument.toString(formatter));
475
                }
476
                return MessageFormat.format(format, values.toArray());
477
            } else {
478
                return this.format;
479
            }
480
        }
481
    }
482

    
483
    public class MethodBase extends FunctionBase implements Method {
484

    
485
        private Value instance;
486
        
487
        public MethodBase(Value instance, String name) {
488
            super(name);
489
            this.instance = instance;
490
        }
491

    
492
        @Override
493
        public Value instance() {
494
            return this.instance;
495
        }
496

    
497
        @Override
498
        public void accept(Visitor visitor, VisitorFilter filter) {
499
            this.instance.accept(visitor, filter);
500
            super.accept(visitor, filter);
501
        }
502

    
503
        @Override
504
        public void replace(Value target, Value replacement) {
505
            if( this.instance == target ) {
506
                this.instance = replacement;
507
            } else {
508
                this.instance.replace(target, replacement);
509
            }
510
        }
511
        
512
        @Override
513
        public String toString(Formatter<Value> formatter) {
514
            if( formatter!=null && formatter.canApply(this) ) {
515
                return formatter.format(this);
516
            }
517
            StringBuilder builder = new StringBuilder();
518
            builder.append(this.instance.toString(formatter));
519
            builder.append("->");
520
            builder.append(this.name());
521
            builder.append("(");
522
            if (this.parameters != null && !this.parameters.isEmpty()) {
523
                boolean first = true;
524
                for (Value argument : this.parameters) {
525
                    if( first ) {
526
                        first=false;
527
                        builder.append(argument.toString(formatter));
528
                    } else {
529
                        builder.append(", ");
530
                        builder.append(argument.toString(formatter));
531
                    }
532
                }
533
            }
534
            builder.append(")");
535
            return builder.toString();
536
        }
537
    }
538

    
539
    public class BinaryOperatorBase extends AbstractValue implements BinaryOperator {
540

    
541
        protected String name;
542
        protected String format;
543
        protected Value left;
544
        protected Value right;
545

    
546
        public BinaryOperatorBase(String name, String format) {
547
            this.name = name;
548
            this.format = format;
549
        }
550

    
551
        @Override
552
        public String name() {
553
            return this.name;
554
        }
555

    
556
        @Override
557
        public void replace(Value target, Value replacement) {
558
            if( target == this.left ) {
559
                this.left = replacement;
560
            } else {
561
                this.left.replace(target, replacement);
562
            }
563
            if( target == this.right ) {
564
                this.right = replacement;
565
            } else {
566
                this.right.replace(target, replacement);
567
            }
568
        }
569
        
570
        @Override
571
        public void accept(Visitor visitor, VisitorFilter filter) {
572
            super.accept(visitor, filter);
573
            this.left.accept(visitor, filter);
574
            this.right.accept(visitor, filter);
575
        }
576

    
577
        @Override
578
        public BinaryOperator left(Value operand) {
579
            this.left = operand;
580
            return this;
581
        }
582

    
583
        @Override
584
        public BinaryOperator right(Value operand) {
585
            this.right = operand;
586
            return this;
587
        }
588

    
589
        @Override
590
        public Value left() {
591
            return this.left;
592
        }
593

    
594
        @Override
595
        public Value right() {
596
            return this.right;
597
        }
598

    
599
        @Override
600
        public String toString() {
601
            return this.toString(EMPTY_FORMATTER);
602
        }
603
        
604
        @Override
605
        public String toString(Formatter<Value> formatter) {
606
            if( formatter!=null && formatter.canApply(this) ) {
607
                return formatter.format(this);
608
            }
609
            if( this.format==null ) {
610
                StringBuilder builder = new StringBuilder();
611
                builder.append("(");
612
                builder.append(this.left.toString(formatter));
613
                builder.append(" ");
614
                builder.append(this.name);
615
                builder.append(" ");
616
                builder.append(this.right.toString(formatter));
617
                builder.append(")");
618
                return builder.toString();
619
            } else {
620
                return MessageFormat.format(
621
                        format,
622
                        this.left.toString(formatter),
623
                        this.right.toString(formatter)
624
                );
625
            }
626
        }
627
    }
628

    
629
    protected Value value;
630
    protected ExpressionEvaluatorManager manager;
631

    
632
    public DefaultExpressionBuilder(ExpressionEvaluatorManager manager) {
633
        this.manager = manager;
634
    }
635

    
636
    @Override
637
    public boolean isEmpty() {
638
        return value == null;
639
    }
640
    
641
    @Override
642
    public ExpressionBuilder createExpressionBuilder() {
643
        return new DefaultExpressionBuilder(this.manager);
644
    }
645

    
646
    @Override
647
    public Value value() {
648
        return this.value;
649
    }
650

    
651
    @Override
652
    public ExpressionBuilder value(Value value) {
653
        this.value = value;
654
        return this;
655
    }
656

    
657
    @Override
658
    public String toString() {
659
        return this.value.toString();
660
    }
661

    
662
    @Override
663
    public String toString(Formatter<Value> formatter) {
664
        return this.value.toString(formatter);
665
    }
666

    
667
    @Override
668
    public Value toValue(String expression) {
669
        try {
670
            Code code = ExpressionUtils.compile(expression);
671
            return code.toValue(this);
672
        } catch(Throwable ex) {
673
            return custom(expression);
674
        }
675
    }
676

    
677
    @Override
678
    public void accept(Visitor visitor, VisitorFilter filter) {
679
        if( this.value == null) {
680
            return;
681
        }
682
        this.value.accept(visitor, filter);
683
    }
684

    
685
    @Override
686
    public String quote_for_identifiers() {
687
        return FORMAT_QUOTE_FOR_IDENTIFIERS;
688
    }
689
    
690
    @Override
691
    public String quote_for_strings() {
692
        return FORMAT_QUOTE_FOR_STRINGS;
693
    }
694
       
695
    @Override
696
    public String string(String s) {
697
        String quote = this.quote_for_strings();
698
//        No se porque no esta disponible wrapIfMissing
699
//        return StringUtils.wrapIfMissing(s,quote);
700
        if (s.startsWith(quote)) {
701
            return s;
702
        }
703
        return quote + StringUtils.replace(s,quote,quote+quote) + quote;
704
    }
705

    
706
    @Override
707
    public String identifier(String id) {
708
        String quote = this.quote_for_identifiers();
709
//        No se porque no esta disponible wrapIfMissing
710
//        return StringUtils.wrapIfMissing(id,quote);
711
        if (id.startsWith(quote)) {
712
            return id;
713
        }
714
        return quote + id + quote;
715
    }
716

    
717
    @Override
718
    public String bytearray_hex(byte[] data) {
719
        StringBuilder builder = new StringBuilder();
720
        for (byte abyte : data) {
721
            int v = abyte & 0xff;
722
            builder.append(String.format("%02x", v));
723
        }
724
        return builder.toString();
725
    }
726

    
727
    @Override
728
    public String bytearray_0x(byte[] data) {
729
        return "0x" + bytearray_hex(data);
730
    }
731

    
732
    @Override
733
    public String bytearray_x(byte[] data) {
734
        return "x'" + bytearray_hex(data) + "'";
735
    }
736
    
737

    
738
    @Override
739
    public Constant bytearray(byte[] data) {
740
        return new ConstantBase(this, data);
741
    }
742
    
743
    @Override
744
    public Variable variable(String name) {
745
        return new VariableBase(this, name);
746
    }
747

    
748
    @Override
749
    public Variable column(String name) {
750
        return new VariableBase(this, name);
751
    }
752
    
753
    @Override
754
    public Parameter parameter(String name) {
755
        List<Parameter> parameters = this.parameters();
756
        for (Parameter parameter : parameters) {
757
            if( StringUtils.equalsIgnoreCase(name, parameter.name()) ) {
758
                return parameter;
759
            }
760
        }
761
        Parameter parameter = this.parameter();
762
        parameter.name(name);
763
        return parameter;
764
    }
765
    
766
    @Override
767
    public Parameter parameter() {
768
        return new ParameterBase();
769
    }
770
    
771
    @Override
772
    public Constant constant(Object value) {
773
        return new ConstantBase(this, value);
774
    }
775

    
776
    @Override
777
    public Group group(Value value) {
778
        return new GroupBase(value);
779
    }
780

    
781
    @Override
782
    public Custom custom(Object value) {
783
        return new CustomBase(value);
784
    }
785

    
786
    @Override
787
    public Method method(Value instance, String name, Value... values) {
788
        MethodBase method = new MethodBase(instance, name);
789
        for (Value theValue : values) {
790
            method.parameter(theValue);
791
        }
792
        return method;
793
    }
794
    
795
    @Override
796
    public Function function(String name, Value... values) {
797
        FunctionBase func = new FunctionBase(name);
798
        for (Value theValue : values) {
799
            func.parameter(theValue);
800
        }
801
        return func;
802
    }
803

    
804
    public Function builtin_function(String name, String format, Value... values) {
805
        FunctionBase func = new FunctionBase(name, format);
806
        for (Value theValue : values) {
807
            func.parameter(theValue);
808
        }
809
        return func;
810
    }
811

    
812
    @Override
813
    public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand) {
814
        return binaryOperator(name, null, leftOperand, rightOperand);
815
    }
816
    
817
    public BinaryOperator binaryOperator(String name, String format, Value leftOperand, Value rightOperand) {
818
        BinaryOperator operator = new BinaryOperatorBase(name, format);
819
        operator.left(leftOperand);
820
        operator.right(rightOperand);
821
        return operator;
822
    }
823

    
824
    @Override
825
    public List<Variable> variables() {
826
        final Set<Variable> vars = new HashSet<>();
827
        this.accept((Visitable value1) -> {
828
          if (!vars.contains((Variable) value1)) {
829
            vars.add((Variable) value1);
830
          }
831
        }, new ClassVisitorFilter(Variable.class));
832
        List<Variable> lvars = new ArrayList<>(vars);
833
        Collections.sort(lvars);
834
        return lvars;
835
    }
836

    
837
    @Override
838
    public List<Parameter> parameters() {
839
        final List<Parameter>  params = new ArrayList<>();
840
        this.accept((Visitable value1) -> {
841
          params.add((Parameter) value1);
842
        }, new ClassVisitorFilter(Parameter.class));
843
        return params;
844
    }
845
    
846
    @Override
847
    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
                case PARAMETER_TYPE_CONSTANT:
854
                    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
                case PARAMETER_TYPE_VARIABLE:
867
                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
    }
877
    
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
    public ExpressionBuilder set(Value value) {
890
        this.value = value;
891
        return this;
892
    }
893

    
894
    @Override
895
    public ExpressionBuilder and(Value value) {
896
        if (this.value == null) {
897
            return this.set(value);
898
        }
899
        BinaryOperator operator = binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, this.value, value);
900
        this.value = operator;
901
        return this;
902
    }
903

    
904
    @Override
905
    public ExpressionBuilder or(Value value) {
906
        if (this.value == null) {
907
            return this.set(value);
908
        }
909
        BinaryOperator operator = binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, this.value, value);
910
        this.value = operator;
911
        return this;
912
    }
913

    
914
    @Override
915
    public Function is_null(Value value) {
916
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
917
    }
918

    
919
    @Override
920
    public Function not_is_null(Value value) {
921
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
922
    }
923

    
924
    @Override
925
    public Function not(Value value) {
926
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
927
    }
928

    
929
    @Override
930
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
931
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
932
    }
933

    
934
    @Override
935
    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
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
956
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
957
    }
958

    
959
    @Override
960
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
961
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
962
    }
963

    
964
    @Override
965
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
966
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
967
    }
968

    
969
    @Override
970
    public BinaryOperator gt(Value op1, Value op2) {
971
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
972
    }
973

    
974
    @Override
975
    public BinaryOperator ge(Value op1, Value op2) {
976
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
977
    }
978

    
979
    @Override
980
    public BinaryOperator lt(Value op1, Value op2) {
981
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
982
    }
983

    
984
    @Override
985
    public BinaryOperator le(Value op1, Value op2) {
986
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
987
    }
988

    
989
    @Override
990
    public BinaryOperator like(Value op1, Value op2) {
991
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
992
    }
993

    
994
    @Override
995
    public BinaryOperator ilike(Value op1, Value op2) {
996
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
997
    }
998

    
999
    @Override
1000
    public BinaryOperator add(Value op1, Value op2) {
1001
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1002
    }
1003

    
1004
    @Override
1005
    public BinaryOperator subst(Value op1, Value op2) {
1006
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1007
    }
1008

    
1009
    @Override
1010
    public BinaryOperator mult(Value op1, Value op2) {
1011
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1012
    }
1013

    
1014
    @Override
1015
    public BinaryOperator div(Value op1, Value op2) {
1016
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1017
    }
1018

    
1019
    @Override
1020
    public BinaryOperator concat(Value op1, Value op2) {
1021
        return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, op1, op2);
1022
    }
1023
    
1024
    @Override
1025
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1026
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1027
    }
1028

    
1029
    @Override
1030
    public Function ifnull(Value value, Value iftrue, Value iffalse) {
1031
        return function(FUNCTION_IFNULL, value, iftrue, iffalse);
1032
    }
1033
    
1034
    @Override
1035
    public Function left(Value str, Value size) {
1036
       return function(FUNCTION_LEFT, str, size);
1037
    }
1038
    
1039
    @Override
1040
    public Function right(Value str, Value len) {
1041
       return function(FUNCTION_RIGHT, str, len);
1042
    }
1043
    
1044
    @Override
1045
    public Function locate(Value search, Value str, Value start) {
1046
       return function(FUNCTION_LOCATE, search, str, start);
1047
    }
1048
    
1049
    @Override
1050
    public Function position(Value search, Value str) {
1051
       return function(FUNCTION_POSITION, search, str);
1052
    }
1053
    
1054
    @Override
1055
    public Function lpad(Value str, Value len, Value padstr) {
1056
       return function(FUNCTION_LPAD, str, len, padstr);
1057
    }
1058
    
1059
    @Override
1060
    public Function rpad(Value str, Value len, Value padstr) {
1061
       return function(FUNCTION_RPAD, str, len, padstr);
1062
    }
1063
    
1064
    @Override
1065
    public Function ltrim(Value str) {
1066
       return function(FUNCTION_LTRIM, str);
1067
    }
1068
    
1069
    @Override
1070
    public Function rtrim(Value str) {
1071
       return function(FUNCTION_RTRIM, str);
1072
    }
1073
    
1074
    @Override
1075
    public Function trim(Value str) {
1076
       return function(FUNCTION_TRIM, str);
1077
    }
1078
    
1079
    @Override
1080
    public Function repeat(Value str, Value size) {
1081
       return function(FUNCTION_REPEAT, str, size);
1082
    }
1083
    
1084
    @Override
1085
    public Function replace(Value str, Value search, Value replstr) {
1086
       return function(FUNCTION_REPLACE, str, search, replstr);
1087
    }
1088
    
1089
    @Override
1090
    public Function ascii(Value str) {
1091
       return function(FUNCTION_ASCII, str);
1092
    }
1093
    
1094
    @Override
1095
    public Function lenght(Value str) {
1096
       return function(FUNCTION_LENGHT, str);
1097
    }
1098

    
1099
    @Override
1100
    public Function instr(Value str, Value search, Value start) {
1101
       return function(FUNCTION_INSTR, str, search, start);
1102
    }
1103
    
1104
    @Override
1105
    public Function lower(Value str) {
1106
       return function(FUNCTION_LOWER, str);
1107
    }
1108
    
1109
    @Override
1110
    public Function upper(Value str) {
1111
       return function(FUNCTION_UPPER, str);
1112
    }
1113
    
1114
    @Override
1115
    public Function space(Value size) {
1116
       return function(FUNCTION_SPACE, size);
1117
    }
1118
    
1119
    @Override
1120
    public Function substring(Value str, Value start, Value len) {
1121
       return function(FUNCTION_SUBSTRING, str, start, len);
1122
    }
1123
    
1124
    @Override
1125
    public Function acos(Value num) {
1126
       return function(FUNCTION_ACOS, num);
1127
    } 
1128
    
1129
    @Override
1130
    public Function asin(Value num) {
1131
       return function(FUNCTION_ASIN, num);
1132
    }
1133
    
1134
    @Override
1135
    public Function atan(Value num) {
1136
       return function(FUNCTION_ATAN, num);
1137
    }
1138
    
1139
    @Override
1140
    public Function cos(Value num) {
1141
       return function(FUNCTION_COS, num);
1142
    }
1143
    
1144
    @Override
1145
    public Function cosh(Value num) {
1146
       return function(FUNCTION_COSH, num);
1147
    }
1148
    
1149
    @Override
1150
    public Function cot(Value num) {
1151
       return function(FUNCTION_COT, num);
1152
    }  
1153
    
1154
    @Override
1155
    public Function bitand(Value num1, Value num2) {
1156
       return function(FUNCTION_BITAND, num1, num2);
1157
    } 
1158
    
1159
    @Override
1160
    public Function bitor(Value num1, Value num2) {
1161
       return function(FUNCTION_BITOR, num1, num2);
1162
    }
1163
    
1164
    @Override
1165
    public Function bitxor(Value num1, Value num2) {
1166
       return function(FUNCTION_BITXOR, num1, num2);
1167
    }
1168
    
1169
    @Override
1170
    public Function ceil(Value num) {
1171
       return function(FUNCTION_CEIL, num);
1172
    }
1173
    
1174
    @Override
1175
    public Function degrees(Value num) {
1176
       return function(FUNCTION_DEGREES, num);
1177
    }  
1178
    
1179
    @Override
1180
    public Function exp(Value num) {
1181
       return function(FUNCTION_EXP, num);
1182
    }  
1183
    
1184
    @Override
1185
    public Function floor(Value num) {
1186
       return function(FUNCTION_FLOOR, num);
1187
    }  
1188
    
1189
    @Override
1190
    public Function log(Value num) {
1191
       return function(FUNCTION_LOG, num);
1192
    }  
1193
    
1194
    @Override
1195
    public Function log10(Value num) {
1196
       return function(FUNCTION_LOG10, num);
1197
    }  
1198
    
1199
    @Override
1200
    public Function pi() {
1201
       return function(FUNCTION_PI);
1202
    }
1203
    
1204
    @Override
1205
    public Function abs(Value num) {
1206
       return function(FUNCTION_ABS, num);
1207
    }
1208
    
1209
    @Override
1210
    public Function power(Value num) {
1211
       return function(FUNCTION_POWER, num);
1212
    }
1213
    
1214
    @Override
1215
    public Function radians(Value num) {
1216
       return function(FUNCTION_RADIANS, num);
1217
    }
1218
    
1219
    @Override
1220
    public Function rand(Value num) {
1221
       return function(FUNCTION_RAND, num);
1222
    }
1223
    
1224
    @Override
1225
    public Function round(Value num) {
1226
       return function(FUNCTION_ROUND, num);
1227
    }
1228
    
1229
    @Override
1230
    public Function sqrt(Value num) {
1231
       return function(FUNCTION_SQRT, num);
1232
    }
1233
    
1234
    @Override
1235
    public Function sign(Value num) {
1236
       return function(FUNCTION_SIGN, num);
1237
    }
1238
    
1239
    @Override
1240
    public Function sin(Value num) {
1241
       return function(FUNCTION_SIN, num);
1242
    }
1243
    
1244
    @Override
1245
    public Function sinh(Value num) {
1246
       return function(FUNCTION_SINH, num);
1247
    }
1248
    
1249
    @Override
1250
    public Function tan(Value num) {
1251
       return function(FUNCTION_TAN, num);
1252
    }
1253
    @Override
1254
    public Function tanh(Value num) {
1255
       return function(FUNCTION_TANH, num);
1256
    }  
1257
    
1258
    @Override
1259
    public Function zero() {
1260
       return function(FUNCTION_ZERO);
1261
    }
1262
    
1263
    @Override
1264
    public Function chr(Value num) {
1265
       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
    @Override
1304
    public Function list() {
1305
        return function(FUNCTION_LIST);
1306
    }
1307

    
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
    @Override
1323
    public String repr(Object value) {
1324
        return this.manager.getReprMethod(value).repr(value);
1325
    }
1326

    
1327
  @Override
1328
  public Function getattr(String objectId, String attributeId) {
1329
        Function fn = function(FUNCTION_GETATTR);
1330
        fn.parameter(variable(objectId));
1331
        fn.parameter(variable(attributeId));
1332
        return fn;
1333
  }
1334

    
1335
  @Override
1336
  public Function date(Value date) {
1337
    return function(FUNCTION_DATE, date);
1338
  }
1339

    
1340
  @Override
1341
  public Function time(Value time) {
1342
    return function(FUNCTION_TIME, time);
1343
  }
1344

    
1345
  @Override
1346
  public Function timestamp(Value timestamp) {
1347
    return function(FUNCTION_TIMESTAMP, timestamp);
1348
  }
1349

    
1350
  @Override
1351
  public Function current_date() {
1352
    return function(FUNCTION_CURRENT_DATE);
1353
  }
1354

    
1355
  @Override
1356
  public Function current_time() {
1357
    return function(FUNCTION_CURRENT_TIME);
1358
  }
1359

    
1360
  @Override
1361
  public Function current_timestamp() {
1362
    return function(FUNCTION_CURRENT_TIMESTAMP);
1363
  }
1364

    
1365
  @Override
1366
  public Function date_add(Value datefield, Value valueToAdd, Value date) {
1367
    return function(FUNCTION_DATEADD, datefield, valueToAdd, date);
1368
  }
1369

    
1370
  @Override
1371
  public Function date_diff(Value datefield, Value valueToSubst, Value date) {
1372
    return function(FUNCTION_DATEDIFF, datefield, valueToSubst, date);
1373
  }
1374

    
1375
  @Override
1376
  public Function to_date(Value date, Value format) {
1377
    return function(FUNCTION_TO_DATE, date, format);
1378
  }
1379

    
1380
  @Override
1381
  public Function to_timestamp(Value timestamp, Value format) {
1382
    return function(FUNCTION_TO_TIMESTAMP, timestamp, format);
1383
  }
1384

    
1385
  @Override
1386
  public Function extract(Value datefield, Value source) {
1387
    return function(FUNCTION_EXTRACT, datefield, source);
1388
  }
1389
  
1390
}