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 @ 44750

History | View | Annotate | Download (40.2 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.ExpressionEvaluatorManager;
19
import org.gvsig.expressionevaluator.ExpressionUtils;
20
import org.gvsig.expressionevaluator.Formatter;
21

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

    
28
    private static final String FORMAT_TRUE = "TRUE";
29
    private static final String FORMAT_FALSE = "FALSE";
30

    
31
    private static final String FORMAT_GROUP = "( {0} )";
32

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

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

    
53
    public static class GroupBase extends AbstractValue implements Group {
54

    
55
        protected Value value;
56

    
57
        public GroupBase(Value value) {
58
            this.value = value;
59
        }
60

    
61
        @Override
62
        public Value value() {
63
            return value;
64
        }
65

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

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

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

    
95
    public static class VariableBase extends AbstractValue implements Variable {
96

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

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

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

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

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

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

    
144
    public static class ParameterBase extends AbstractValue implements Parameter {
145

    
146
        protected String name;
147
        protected Object value;
148
        protected int type;
149

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

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

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

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

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

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

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

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

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

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

    
259
    public static class ConstantBase extends AbstractValue implements Constant {
260

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

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

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

    
304
    public static class CustomBase extends AbstractValue implements Custom {
305

    
306
        protected Object value;
307

    
308
        // Esto es para permitir declarar parametros y columnas en una seccion
309
        // custom.
310
        protected List<Value> values;
311

    
312
        public CustomBase(Object value) {
313
            this.value = value;
314
        }
315

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

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

    
341
        @Override
342
        public Object value() {
343
            return this.value;
344
        }
345

    
346
        @Override
347
        public Custom add(Variable variable) {
348
            if (this.values == null) {
349
                this.values = new ArrayList<>();
350
            }
351
            this.values.add(variable);
352
            return this;
353
        }
354

    
355
        @Override
356
        public Custom add(Parameter parameter) {
357
            if (this.values == null) {
358
                this.values = new ArrayList<>();
359
            }
360
            this.values.add(parameter);
361
            return this;
362
        }
363

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

    
378
    public static class FunctionBase extends AbstractValue implements Function {
379

    
380
        protected String name;
381
        protected String format;
382
        protected List<Value> parameters;
383

    
384
        public FunctionBase(String name, String format) {
385
            this.name = name;
386
            this.format = format;
387
        }
388

    
389
        public FunctionBase(String name) {
390
            this(name,null);
391
        }
392

    
393
        @Override
394
        public List<Value> parameters() {
395
            if (this.parameters == null) {
396
                this.parameters = new ArrayList<>();
397
            }
398
            return this.parameters;
399
        }
400

    
401
        @Override
402
        public Function parameter(Value parameter) {
403
            this.parameters().add(parameter);
404
            return this;
405
        }
406

    
407
        @Override
408
        public String name() {
409
            return this.name;
410
        }
411

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

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

    
479
    public class MethodBase extends FunctionBase implements Method {
480

    
481
        private Value instance;
482
        
483
        public MethodBase(Value instance, String name) {
484
            super(name);
485
            this.instance = instance;
486
        }
487

    
488
        @Override
489
        public Value instance() {
490
            return this.instance;
491
        }
492

    
493
        @Override
494
        public void accept(Visitor visitor, VisitorFilter filter) {
495
            this.instance.accept(visitor, filter);
496
            super.accept(visitor, filter);
497
        }
498

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

    
535
    public class BinaryOperatorBase extends AbstractValue implements BinaryOperator {
536

    
537
        protected String name;
538
        protected String format;
539
        protected Value left;
540
        protected Value right;
541

    
542
        public BinaryOperatorBase(String name, String format) {
543
            this.name = name;
544
            this.format = format;
545
        }
546

    
547
        @Override
548
        public String name() {
549
            return this.name;
550
        }
551

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

    
573
        @Override
574
        public BinaryOperator left(Value operand) {
575
            this.left = operand;
576
            return this;
577
        }
578

    
579
        @Override
580
        public BinaryOperator right(Value operand) {
581
            this.right = operand;
582
            return this;
583
        }
584

    
585
        @Override
586
        public Value left() {
587
            return this.left;
588
        }
589

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

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

    
625
    protected Value value;
626
    protected ExpressionEvaluatorManager manager;
627

    
628
    public DefaultExpressionBuilder(ExpressionEvaluatorManager manager) {
629
        this.manager = manager;
630
    }
631

    
632
    @Override
633
    public boolean isEmpty() {
634
        return value == null;
635
    }
636
    
637
    @Override
638
    public ExpressionBuilder createExpressionBuilder() {
639
        return new DefaultExpressionBuilder(this.manager);
640
    }
641

    
642
    @Override
643
    public Value value() {
644
        return this.value;
645
    }
646

    
647
    @Override
648
    public ExpressionBuilder value(Value value) {
649
        this.value = value;
650
        return this;
651
    }
652

    
653
    @Override
654
    public String toString() {
655
        return this.value.toString();
656
    }
657

    
658
    @Override
659
    public String toString(Formatter<Value> formatter) {
660
        return this.value.toString(formatter);
661
    }
662

    
663
    @Override
664
    public Value toValue(String expression) {
665
        try {
666
            Code code = ExpressionUtils.compile(expression);
667
            return code.toValue(this);
668
        } catch(Throwable ex) {
669
            return custom(expression);
670
        }
671
    }
672

    
673
    @Override
674
    public void accept(Visitor visitor, VisitorFilter filter) {
675
        if( this.value == null) {
676
            return;
677
        }
678
        this.value.accept(visitor, filter);
679
    }
680

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

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

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

    
723
    @Override
724
    public String bytearray_0x(byte[] data) {
725
        return "0x" + bytearray_hex(data);
726
    }
727

    
728
    @Override
729
    public String bytearray_x(byte[] data) {
730
        return "x'" + bytearray_hex(data) + "'";
731
    }
732
    
733

    
734
    @Override
735
    public Constant bytearray(byte[] data) {
736
        return new ConstantBase(this, data);
737
    }
738
    
739
    @Override
740
    public Variable variable(String name) {
741
        return new VariableBase(this, name);
742
    }
743

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

    
772
    @Override
773
    public Group group(Value value) {
774
        return new GroupBase(value);
775
    }
776

    
777
    @Override
778
    public Custom custom(Object value) {
779
        return new CustomBase(value);
780
    }
781

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

    
800
    public Function builtin_function(String name, String format, Value... values) {
801
        FunctionBase func = new FunctionBase(name, format);
802
        for (Value theValue : values) {
803
            func.parameter(theValue);
804
        }
805
        return func;
806
    }
807

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

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

    
833
    @Override
834
    public List<Parameter> parameters() {
835
        final List<Parameter>  params = new ArrayList<>();
836
        this.accept((Visitable value1) -> {
837
          params.add((Parameter) value1);
838
        }, new ClassVisitorFilter(Parameter.class));
839
        return params;
840
    }
841
    
842
    @Override
843
    public List<String> parameters_names() {
844
        List<String> params = new ArrayList<>();
845
        for (Parameter param : parameters()) {
846
            Object theValue = param.value();
847
            String s;
848
            switch(param.type()) {
849
                case PARAMETER_TYPE_CONSTANT:
850
                    if( theValue==null ) {
851
                        s = "NULL";
852
                    } else if( theValue instanceof String ) {
853
                        s = "'" + (String)theValue + "'";
854
                        
855
                    } else if( theValue instanceof byte[] ) {
856
                        s = bytearray_0x((byte[]) theValue);
857
                        
858
                    } else {
859
                        s = theValue.toString();
860
                    }    
861
                    break;
862
                case PARAMETER_TYPE_VARIABLE:
863
                default:
864
                    s = "\"" + param.name() + "\"";
865
            }
866
//            if( !params.contains(s) ) { // Ojo que deben ir todos, incluso duplicados.
867
                params.add(s);
868
//            }
869
        }
870
        // Collections.sort(params); Ojo, no deben ordenarse.
871
        return params;
872
    }
873
    
874
    @Override
875
    public List<String> variables_names() {
876
        List<String> vars = new ArrayList<>();
877
        for (Variable var : this.variables()) {
878
            vars.add(var.name());
879
        }
880
        Collections.sort(vars);
881
        return vars;
882
    }
883
    
884
    @Override
885
    public ExpressionBuilder set(Value value) {
886
        this.value = value;
887
        return this;
888
    }
889

    
890
    @Override
891
    public ExpressionBuilder and(Value value) {
892
        if (this.value == null) {
893
            return this.set(value);
894
        }
895
        BinaryOperator operator = binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, this.value, value);
896
        this.value = operator;
897
        return this;
898
    }
899

    
900
    @Override
901
    public ExpressionBuilder or(Value value) {
902
        if (this.value == null) {
903
            return this.set(value);
904
        }
905
        BinaryOperator operator = binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, this.value, value);
906
        this.value = operator;
907
        return this;
908
    }
909

    
910
    @Override
911
    public Function is_null(Value value) {
912
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
913
    }
914

    
915
    @Override
916
    public Function not_is_null(Value value) {
917
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
918
    }
919

    
920
    @Override
921
    public Function not(Value value) {
922
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
923
    }
924

    
925
    @Override
926
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
927
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
928
    }
929

    
930
    @Override
931
    public BinaryOperator and(Expression leftOperand, Expression rightOperand) {
932
        return binaryOperator(
933
                OPERATOR_AND, 
934
                FORMAT_OPERATOR_AND, 
935
                leftOperand.getCode().toValue(), 
936
                rightOperand.getCode().toValue()
937
        );
938
    }
939

    
940
    @Override
941
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
942
        return binaryOperator(
943
                OPERATOR_AND, 
944
                FORMAT_OPERATOR_AND, 
945
                leftOperand.getCode().toValue(), 
946
                rightOperand
947
        );
948
    }
949

    
950
    @Override
951
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
952
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
953
    }
954

    
955
    @Override
956
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
957
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
958
    }
959

    
960
    @Override
961
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
962
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
963
    }
964

    
965
    @Override
966
    public BinaryOperator gt(Value op1, Value op2) {
967
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
968
    }
969

    
970
    @Override
971
    public BinaryOperator ge(Value op1, Value op2) {
972
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
973
    }
974

    
975
    @Override
976
    public BinaryOperator lt(Value op1, Value op2) {
977
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
978
    }
979

    
980
    @Override
981
    public BinaryOperator le(Value op1, Value op2) {
982
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
983
    }
984

    
985
    @Override
986
    public BinaryOperator like(Value op1, Value op2) {
987
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
988
    }
989

    
990
    @Override
991
    public BinaryOperator ilike(Value op1, Value op2) {
992
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
993
    }
994

    
995
    @Override
996
    public BinaryOperator add(Value op1, Value op2) {
997
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
998
    }
999

    
1000
    @Override
1001
    public BinaryOperator subst(Value op1, Value op2) {
1002
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1003
    }
1004

    
1005
    @Override
1006
    public BinaryOperator mult(Value op1, Value op2) {
1007
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1008
    }
1009

    
1010
    @Override
1011
    public BinaryOperator div(Value op1, Value op2) {
1012
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1013
    }
1014

    
1015
    @Override
1016
    public BinaryOperator concat(Value op1, Value op2) {
1017
        return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, op1, op2);
1018
    }
1019
    
1020
    @Override
1021
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1022
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1023
    }
1024

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

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

    
1264
    @Override
1265
    public Function cast(Value object, Value typeName) {
1266
       return function(FUNCTION_CAST, object, typeName);
1267
    }    
1268

    
1269
    @Override
1270
    public Function decode(Value value, Value format) {
1271
       return function(FUNCTION_DECODE, value, format);
1272
    }    
1273

    
1274
    @Override
1275
    public Function toDouble(Value num) {
1276
       return function(FUNCTION_TODOUBLE, num);
1277
    }    
1278

    
1279
    @Override
1280
    public Function toFloat(Value num) {
1281
       return function(FUNCTION_TOFLOAT, num);
1282
    }    
1283

    
1284
    @Override
1285
    public Function toLong(Value num) {
1286
       return function(FUNCTION_TOLONG, num);
1287
    }    
1288

    
1289
    @Override
1290
    public Function toInteger(Value num) {
1291
       return function(FUNCTION_TOINTEGER, num);
1292
    }    
1293

    
1294
    @Override
1295
    public Function toStr(Value object) {
1296
       return function(FUNCTION_TOSTR, object);
1297
    }    
1298

    
1299
    @Override
1300
    public Function list() {
1301
        return function(FUNCTION_LIST);
1302
    }
1303

    
1304
    @Override
1305
    public Function tuple() {
1306
        return function(FUNCTION_TUPLE);
1307
    }
1308

    
1309
    @Override
1310
    public Function tuple(Constant... values) {
1311
        Function fn = function(FUNCTION_TUPLE);
1312
        for (Value theValue : values) {
1313
            fn.parameter(this.constant(theValue));
1314
        }
1315
        return fn;
1316
    }
1317
    
1318
    @Override
1319
    public String repr(Object value) {
1320
        return this.manager.getReprMethod(value).repr(value);
1321
    }
1322

    
1323
  @Override
1324
  public Function getattr(String objectId, String attributeId) {
1325
        Function fn = function(FUNCTION_GETATTR);
1326
        fn.parameter(variable(objectId));
1327
        fn.parameter(variable(attributeId));
1328
        return fn;
1329
  }
1330

    
1331
  @Override
1332
  public Function date(Value date) {
1333
    return function(FUNCTION_DATE, date);
1334
  }
1335

    
1336
  @Override
1337
  public Function time(Value time) {
1338
    return function(FUNCTION_TIME, time);
1339
  }
1340

    
1341
  @Override
1342
  public Function timestamp(Value timestamp) {
1343
    return function(FUNCTION_TIMESTAMP, timestamp);
1344
  }
1345

    
1346
  @Override
1347
  public Function current_date() {
1348
    return function(FUNCTION_CURRENT_DATE);
1349
  }
1350

    
1351
  @Override
1352
  public Function current_time() {
1353
    return function(FUNCTION_CURRENT_TIME);
1354
  }
1355

    
1356
  @Override
1357
  public Function current_timestamp() {
1358
    return function(FUNCTION_CURRENT_TIMESTAMP);
1359
  }
1360

    
1361
  @Override
1362
  public Function date_add(Value datefield, Value valueToAdd, Value date) {
1363
    return function(FUNCTION_DATEADD, datefield, valueToAdd, date);
1364
  }
1365

    
1366
  @Override
1367
  public Function date_diff(Value datefield, Value valueToSubst, Value date) {
1368
    return function(FUNCTION_DATEDIFF, datefield, valueToSubst, date);
1369
  }
1370

    
1371
  @Override
1372
  public Function to_date(Value date, Value format) {
1373
    return function(FUNCTION_TO_DATE, date, format);
1374
  }
1375

    
1376
  @Override
1377
  public Function to_timestamp(Value timestamp, Value format) {
1378
    return function(FUNCTION_TO_TIMESTAMP, timestamp, format);
1379
  }
1380

    
1381
  @Override
1382
  public Function extract(Value datefield, Value source) {
1383
    return function(FUNCTION_EXTRACT, datefield, source);
1384
  }
1385
  
1386
}