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

History | View | Annotate | Download (42.2 KB)

1
package org.gvsig.expressionevaluator.impl;
2

    
3
import java.text.MessageFormat;
4
import java.text.ParseException;
5
import java.text.SimpleDateFormat;
6
import java.util.ArrayList;
7
import java.util.Collections;
8
import java.util.Date;
9
import java.util.HashSet;
10
import java.util.List;
11
import java.util.Objects;
12
import java.util.Set;
13
import org.apache.commons.lang3.StringUtils;
14
import org.gvsig.expressionevaluator.Code;
15
import org.gvsig.expressionevaluator.Expression;
16

    
17
import org.gvsig.expressionevaluator.ExpressionBuilder;
18
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_CONSTANT;
19
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE;
20
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
21
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
22
import org.gvsig.expressionevaluator.ExpressionUtils;
23
import org.gvsig.expressionevaluator.Formatter;
24
import org.gvsig.expressionevaluator.ReprMethod;
25
import static org.gvsig.expressionevaluator.ExpressionBuilder.BASE_FORMATTER;
26

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

    
33
    private static final String FORMAT_TRUE = "TRUE";
34
    private static final String FORMAT_FALSE = "FALSE";
35

    
36
    private static final String FORMAT_GROUP = "( {0} )";
37

    
38
    private static final String FORMAT_ISNULL = "( ({0}) IS NULL )";
39
    private static final String FORMAT_NOTISNULL = "( ({0}) IS NOT NULL )";
40
    private static final String FORMAT_OPERATOR_NOT = "( NOT ({0}) )";
41

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

    
58
    public static class GroupBase extends AbstractValue implements Group {
59

    
60
        protected Value value;
61

    
62
        public GroupBase(Value value) {
63
            this.value = value;
64
        }
65

    
66
        @Override
67
        public Value value() {
68
            return value;
69
        }
70

    
71
        @Override
72
        public void accept(Visitor visitor, VisitorFilter filter) {
73
            super.accept(visitor, filter);
74
            this.value.accept(visitor, filter);
75
        }
76

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

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

    
100
    public static class VariableBase extends AbstractValue implements Variable {
101

    
102
        protected String name;
103
        protected ExpressionBuilder builder;
104
        
105
        public VariableBase(ExpressionBuilder builder, String name) {
106
            this.name = name;
107
            this.builder = builder;
108
        }
109

    
110
        @Override
111
        public String name() {
112
            return this.name;
113
        }
114

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

    
128
        @Override
129
        public int compareTo(Variable o) {
130
            return this.name.compareTo(o.name());
131
        }
132

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

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

    
149
    public static class ParameterBase extends AbstractValue implements Parameter {
150

    
151
        protected String name;
152
        protected Object value;
153
        protected int type;
154

    
155
        public ParameterBase() {
156
            this.type = PARAMETER_TYPE_CONSTANT;
157
            this.name = null;
158
            this.value = null;
159
        }
160

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

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

    
200
        @Override
201
        public int type() {
202
            return this.type;
203
        }
204

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

    
210
        @Override
211
        public boolean is_variable() {
212
            return this.type == PARAMETER_TYPE_VARIABLE;
213
        }
214

    
215
        @Override
216
        public Parameter value(Object value) {
217
            this.value = value;
218
            return this;
219
        }
220

    
221
        @Override
222
        public Parameter name(String name) {
223
            this.type = PARAMETER_TYPE_VARIABLE;
224
            this.name = name;
225
            return this;
226
        }
227

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

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

    
264
    public static class ConstantBase extends AbstractValue implements Constant {
265

    
266
        protected Object value;
267
        protected ExpressionBuilder builder;
268
        
269
        public ConstantBase(ExpressionBuilder builder, Object value) {
270
            this.value = value;
271
            this.builder = builder;
272
        }
273

    
274
        @Override
275
        public Object value() {
276
            return this.value;
277
        }
278

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

    
311
    public static class CustomBase extends AbstractValue implements Custom {
312

    
313
        protected Object value;
314

    
315
        // Esto es para permitir declarar parametros y columnas en una seccion
316
        // custom.
317
        protected List<Value> values;
318

    
319
        public CustomBase(Object value) {
320
            this.value = value;
321
        }
322

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

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

    
348
        @Override
349
        public Object value() {
350
            return this.value;
351
        }
352

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

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

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

    
385
    public static class FunctionBase extends AbstractValue implements Function {
386

    
387
        protected String name;
388
        protected String format;
389
        protected List<Value> parameters;
390

    
391
        public FunctionBase(String name, String format) {
392
            this.name = name;
393
            this.format = format;
394
        }
395

    
396
        public FunctionBase(String name) {
397
            this(name,null);
398
        }
399

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

    
408
        @Override
409
        public Function parameter(Value parameter) {
410
            this.parameters().add(parameter);
411
            return this;
412
        }
413

    
414
        @Override
415
        public String name() {
416
            return this.name;
417
        }
418

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

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

    
486
    public class MethodBase extends FunctionBase implements Method {
487

    
488
        private Value instance;
489
        
490
        public MethodBase(Value instance, String name) {
491
            super(name);
492
            this.instance = instance;
493
        }
494

    
495
        @Override
496
        public Value instance() {
497
            return this.instance;
498
        }
499

    
500
        @Override
501
        public void accept(Visitor visitor, VisitorFilter filter) {
502
            this.instance.accept(visitor, filter);
503
            super.accept(visitor, filter);
504
        }
505

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

    
542
    public class BinaryOperatorBase extends AbstractValue implements BinaryOperator {
543

    
544
        protected String name;
545
        protected String format;
546
        protected Value left;
547
        protected Value right;
548

    
549
        public BinaryOperatorBase(String name, String format) {
550
            this.name = name;
551
            this.format = format;
552
        }
553

    
554
        @Override
555
        public String name() {
556
            return this.name;
557
        }
558

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

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

    
586
        @Override
587
        public BinaryOperator right(Value operand) {
588
            this.right = operand;
589
            return this;
590
        }
591

    
592
        @Override
593
        public Value left() {
594
            return this.left;
595
        }
596

    
597
        @Override
598
        public Value right() {
599
            return this.right;
600
        }
601

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

    
632
    protected Value value;
633
    protected ExpressionEvaluatorManager manager;
634

    
635
    public DefaultExpressionBuilder(ExpressionEvaluatorManager manager) {
636
        this.manager = manager;
637
    }
638

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

    
649
    @Override
650
    public Value value() {
651
        return this.value;
652
    }
653

    
654
    @Override
655
    public ExpressionBuilder value(Value value) {
656
        this.value = value;
657
        return this;
658
    }
659

    
660
    @Override
661
    public String toString() {
662
        return this.value.toString();
663
    }
664

    
665
    @Override
666
    public String toString(Formatter<Value> formatter) {
667
        return this.value.toString(formatter);
668
    }
669

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

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

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

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

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

    
730
    @Override
731
    public String bytearray_0x(byte[] data) {
732
        return "0x" + bytearray_hex(data);
733
    }
734

    
735
    @Override
736
    public String bytearray_x(byte[] data) {
737
        return "x'" + bytearray_hex(data) + "'";
738
    }
739
    
740

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

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

    
779
    @Override
780
    public Group group(Value value) {
781
        return new GroupBase(value);
782
    }
783

    
784
    @Override
785
    public Custom custom(Object value) {
786
        return new CustomBase(value);
787
    }
788

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

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

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

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

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

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

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

    
917
    @Override
918
    public Function is_null(Value value) {
919
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
920
    }
921

    
922
    @Override
923
    public Function not_is_null(Value value) {
924
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
925
    }
926

    
927
    @Override
928
    public Function not(Value value) {
929
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
930
    }
931

    
932
    @Override
933
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
934
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
935
    }
936

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

    
947
    @Override
948
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
949
        return binaryOperator(
950
                OPERATOR_AND, 
951
                FORMAT_OPERATOR_AND, 
952
                leftOperand.getCode().toValue(), 
953
                rightOperand
954
        );
955
    }
956

    
957
    @Override
958
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
959
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
960
    }
961

    
962
    @Override
963
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
964
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
965
    }
966

    
967
    @Override
968
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
969
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
970
    }
971

    
972
    @Override
973
    public BinaryOperator gt(Value op1, Value op2) {
974
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
975
    }
976

    
977
    @Override
978
    public BinaryOperator ge(Value op1, Value op2) {
979
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
980
    }
981

    
982
    @Override
983
    public BinaryOperator lt(Value op1, Value op2) {
984
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
985
    }
986

    
987
    @Override
988
    public BinaryOperator le(Value op1, Value op2) {
989
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
990
    }
991

    
992
    @Override
993
    public BinaryOperator like(Value op1, Value op2) {
994
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
995
    }
996

    
997
    @Override
998
    public BinaryOperator ilike(Value op1, Value op2) {
999
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
1000
    }
1001

    
1002
    @Override
1003
    public BinaryOperator add(Value op1, Value op2) {
1004
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1005
    }
1006

    
1007
    @Override
1008
    public BinaryOperator subst(Value op1, Value op2) {
1009
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1010
    }
1011

    
1012
    @Override
1013
    public BinaryOperator mult(Value op1, Value op2) {
1014
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1015
    }
1016

    
1017
    @Override
1018
    public BinaryOperator div(Value op1, Value op2) {
1019
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1020
    }
1021

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

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

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

    
1271
    @Override
1272
    public Function cast(Value object, Value typeName) {
1273
       return function(FUNCTION_CAST, object, typeName);
1274
    }    
1275

    
1276
    @Override
1277
    public Function decode(Value value, Value format) {
1278
       return function(FUNCTION_DECODE, value, format);
1279
    }    
1280

    
1281
    @Override
1282
    public Function toDouble(Value num) {
1283
       return function(FUNCTION_TODOUBLE, num);
1284
    }    
1285

    
1286
    @Override
1287
    public Function toFloat(Value num) {
1288
       return function(FUNCTION_TOFLOAT, num);
1289
    }    
1290

    
1291
    @Override
1292
    public Function toLong(Value num) {
1293
       return function(FUNCTION_TOLONG, num);
1294
    }    
1295

    
1296
    @Override
1297
    public Function toInteger(Value num) {
1298
       return function(FUNCTION_TOINTEGER, num);
1299
    }    
1300

    
1301
    @Override
1302
    public Function toStr(Value object) {
1303
       return function(FUNCTION_TOSTR, object);
1304
    }    
1305

    
1306
    @Override
1307
    public Function list() {
1308
        return function(FUNCTION_LIST);
1309
    }
1310

    
1311
    @Override
1312
    public Function tuple() {
1313
        return function(FUNCTION_TUPLE);
1314
    }
1315

    
1316
    @Override
1317
    public Function tuple(Constant... values) {
1318
        Function fn = function(FUNCTION_TUPLE);
1319
        for (Value theValue : values) {
1320
            fn.parameter(this.constant(theValue));
1321
        }
1322
        return fn;
1323
    }
1324
    
1325
    @Override
1326
    public String repr(Object value) {
1327
        return this.manager.getReprMethod(value).repr(value);
1328
    }
1329

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

    
1338
  @Override
1339
  public Function date(Date date) {
1340
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1341
    return function(FUNCTION_DATE, constant(df.format(date)));
1342
  }
1343

    
1344
  @Override
1345
  public Function time(Date time) {
1346
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1347
    return function(FUNCTION_TIME, constant(df.format(time)));
1348
  }
1349

    
1350
  @Override
1351
  public Function timestamp(Date timestamp) {
1352
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1353
    return function(FUNCTION_TIMESTAMP, constant(df.format(timestamp)));
1354
  }
1355

    
1356
  @Override
1357
  public Function date(String date) {
1358
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1359
    Date d;
1360
    try {
1361
      d = df.parse(date);
1362
    } catch (ParseException ex) {
1363
      throw new IllegalArgumentException("Can't parse argument '"+date+"' as date.", ex);
1364
    }
1365
    return function(FUNCTION_DATE, constant(df.format(d)));
1366
  }
1367

    
1368
  @Override
1369
  public Function time(String time) {
1370
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1371
    Date t;
1372
    try {
1373
      t = df.parse(time);
1374
    } catch (ParseException ex) {
1375
      throw new IllegalArgumentException("Can't parse argument '"+time+"' as date.", ex);
1376
    }
1377
    return function(FUNCTION_TIME, constant(df.format(t)));
1378
  }
1379

    
1380
  @Override
1381
  public Function timestamp(String timestamp) {
1382
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1383
    Date ts;
1384
    try {
1385
      ts = df.parse(timestamp);
1386
    } catch (ParseException ex) {
1387
      throw new IllegalArgumentException("Can't parse argument '"+timestamp+"' as date.", ex);
1388
    }
1389
    return function(FUNCTION_TIMESTAMP, constant(df.format(ts)));
1390
  }
1391

    
1392
  @Override
1393
  public Function date(Value date) {
1394
    return function(FUNCTION_DATE, date);
1395
  }
1396

    
1397
  @Override
1398
  public Function time(Value time) {
1399
    return function(FUNCTION_TIME, time);
1400
  }
1401

    
1402
  @Override
1403
  public Function timestamp(Value timestamp) {
1404
    return function(FUNCTION_TIMESTAMP, timestamp);
1405
  }
1406

    
1407
  @Override
1408
  public Function current_date() {
1409
    return function(FUNCTION_CURRENT_DATE);
1410
  }
1411

    
1412
  @Override
1413
  public Function current_time() {
1414
    return function(FUNCTION_CURRENT_TIME);
1415
  }
1416

    
1417
  @Override
1418
  public Function current_timestamp() {
1419
    return function(FUNCTION_CURRENT_TIMESTAMP);
1420
  }
1421

    
1422
  @Override
1423
  public Function date_add(Value datefield, Value valueToAdd, Value date) {
1424
    return function(FUNCTION_DATEADD, datefield, valueToAdd, date);
1425
  }
1426

    
1427
  @Override
1428
  public Function date_diff(Value datefield, Value valueToSubst, Value date) {
1429
    return function(FUNCTION_DATEDIFF, datefield, valueToSubst, date);
1430
  }
1431

    
1432
  @Override
1433
  public Function to_date(Value date, Value format) {
1434
    return function(FUNCTION_TO_DATE, date, format);
1435
  }
1436

    
1437
  @Override
1438
  public Function to_timestamp(Value timestamp, Value format) {
1439
    return function(FUNCTION_TO_TIMESTAMP, timestamp, format);
1440
  }
1441

    
1442
  @Override
1443
  public Function extract(Value datefield, Value source) {
1444
    return function(FUNCTION_EXTRACT, datefield, source);
1445
  }
1446
  
1447
}