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

History | View | Annotate | Download (42.5 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

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

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

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

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

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

    
57
    public class GroupBase extends AbstractValue implements Group {
58

    
59
        protected Value value;
60

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

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

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

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

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

    
99
    public class VariableBase extends AbstractValue implements Variable {
100

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

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

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

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

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

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

    
148
    public class ParameterBase extends AbstractValue implements Parameter {
149

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

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

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

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

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

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

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

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

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

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

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

    
263
    public class ConstantBase extends AbstractValue implements Constant {
264

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

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

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

    
310
    public class CustomBase extends AbstractValue implements Custom {
311

    
312
        protected Object value;
313

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

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

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

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

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

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

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

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

    
384
    public class FunctionBase extends AbstractValue implements Function {
385

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

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

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

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

    
407
        @Override
408
        public Function format(String format) {
409
          this.format = format;
410
          return this;
411
        }
412

    
413
        @Override
414
        public Function parameter(Value parameter) {
415
            this.parameters().add(parameter);
416
            return this;
417
        }
418

    
419
        @Override
420
        public String name() {
421
            return this.name;
422
        }
423

    
424
        @Override
425
        public void accept(Visitor visitor, VisitorFilter filter) {
426
            super.accept(visitor, filter);
427
            if( this.parameters!=null ) {
428
                for (Value argument : this.parameters) {
429
                    if( argument!=null ) {
430
                        argument.accept(visitor, filter);
431
                    }
432
                }
433
            }
434
        }
435

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

    
491
    public class MethodBase extends FunctionBase implements Method {
492

    
493
        private Value instance;
494
        
495
        public MethodBase(Value instance, String name) {
496
            super(name);
497
            this.instance = instance;
498
        }
499

    
500
        @Override
501
        public Value instance() {
502
            return this.instance;
503
        }
504

    
505
        @Override
506
        public void accept(Visitor visitor, VisitorFilter filter) {
507
            this.instance.accept(visitor, filter);
508
            super.accept(visitor, filter);
509
        }
510

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

    
547
    public class BinaryOperatorBase extends AbstractValue implements BinaryOperator {
548

    
549
        protected String name;
550
        protected String format;
551
        protected Value left;
552
        protected Value right;
553

    
554
        public BinaryOperatorBase(String name, String format) {
555
            this.name = name;
556
            this.format = format;
557
        }
558

    
559
        @Override
560
        public String name() {
561
            return this.name;
562
        }
563

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

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

    
591
        @Override
592
        public BinaryOperator right(Value operand) {
593
            this.right = operand;
594
            return this;
595
        }
596

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

    
602
        @Override
603
        public Value right() {
604
            return this.right;
605
        }
606

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

    
637
    protected Value value;
638
    protected ExpressionEvaluatorManager manager;
639
    protected Formatter<ExpressionBuilder.Value> formatter;
640

    
641
    public DefaultExpressionBuilder(ExpressionEvaluatorManager manager) {
642
        this.manager = manager;
643
    }
644
    
645
    @Override
646
    public Formatter<ExpressionBuilder.Value> formatter() {
647
      if( this.formatter == null ) {
648
        this.formatter = this.manager.getExpressionBuilderFormatter();
649
      }
650
      return this.formatter;
651
    }
652

    
653
    @Override
654
    public boolean isEmpty() {
655
        return value == null;
656
    }
657
    
658
    @Override
659
    public ExpressionBuilder createExpressionBuilder() {
660
        return new DefaultExpressionBuilder(this.manager);
661
    }
662

    
663
    @Override
664
    public Value value() {
665
        return this.value;
666
    }
667

    
668
    @Override
669
    public ExpressionBuilder value(Value value) {
670
        this.value = value;
671
        return this;
672
    }
673

    
674
    @Override
675
    public String toString() {
676
        return this.value.toString();
677
    }
678

    
679
    @Override
680
    public String toString(Formatter<Value> formatter) {
681
        return this.value.toString(formatter);
682
    }
683

    
684
    @Override
685
    public Value toValue(String expression) {
686
        try {
687
            Code code = ExpressionUtils.compile(expression);
688
            return code.toValue(this);
689
        } catch(Throwable ex) {
690
            return custom(expression);
691
        }
692
    }
693

    
694
    @Override
695
    public void accept(Visitor visitor, VisitorFilter filter) {
696
        if( this.value == null) {
697
            return;
698
        }
699
        this.value.accept(visitor, filter);
700
    }
701

    
702
    @Override
703
    public String quote_for_identifiers() {
704
        return FORMAT_QUOTE_FOR_IDENTIFIERS;
705
    }
706
    
707
    @Override
708
    public String quote_for_strings() {
709
        return FORMAT_QUOTE_FOR_STRINGS;
710
    }
711
       
712
    @Override
713
    public String string(String s) {
714
        String quote = this.quote_for_strings();
715
//        No se porque no esta disponible wrapIfMissing
716
//        return StringUtils.wrapIfMissing(s,quote);
717
        if (s.startsWith(quote)) {
718
            return s;
719
        }
720
        return quote + StringUtils.replace(s,quote,quote+quote) + quote;
721
    }
722

    
723
    @Override
724
    public String identifier(String id) {
725
        String quote = this.quote_for_identifiers();
726
//        No se porque no esta disponible wrapIfMissing
727
//        return StringUtils.wrapIfMissing(id,quote);
728
        if (id.startsWith(quote)) {
729
            return id;
730
        }
731
        return quote + id + quote;
732
    }
733

    
734
    @Override
735
    public String bytearray_hex(byte[] data) {
736
        StringBuilder builder = new StringBuilder();
737
        for (byte abyte : data) {
738
            int v = abyte & 0xff;
739
            builder.append(String.format("%02x", v));
740
        }
741
        return builder.toString();
742
    }
743

    
744
    @Override
745
    public String bytearray_0x(byte[] data) {
746
        return "0x" + bytearray_hex(data);
747
    }
748

    
749
    @Override
750
    public String bytearray_x(byte[] data) {
751
        return "x'" + bytearray_hex(data) + "'";
752
    }
753
    
754

    
755
    @Override
756
    public Constant bytearray(byte[] data) {
757
        return new ConstantBase(this, data);
758
    }
759
    
760
    @Override
761
    public Variable variable(String name) {
762
        return new VariableBase(this, name);
763
    }
764

    
765
    @Override
766
    public Variable column(String name) {
767
        return new VariableBase(this, name);
768
    }
769
    
770
    @Override
771
    public Parameter parameter(String name) {
772
        List<Parameter> parameters = this.parameters();
773
        for (Parameter parameter : parameters) {
774
            if( StringUtils.equalsIgnoreCase(name, parameter.name()) ) {
775
                return parameter;
776
            }
777
        }
778
        Parameter parameter = this.parameter();
779
        parameter.name(name);
780
        return parameter;
781
    }
782
    
783
    @Override
784
    public Parameter parameter() {
785
        return new ParameterBase();
786
    }
787
    
788
    @Override
789
    public Constant constant(Object value) {
790
        return new ConstantBase(this, value);
791
    }
792

    
793
    @Override
794
    public Group group(Value value) {
795
        return new GroupBase(value);
796
    }
797

    
798
    @Override
799
    public Custom custom(Object value) {
800
        return new CustomBase(value);
801
    }
802

    
803
    @Override
804
    public Method method(Value instance, String name, Value... values) {
805
        MethodBase method = new MethodBase(instance, name);
806
        for (Value theValue : values) {
807
            method.parameter(theValue);
808
        }
809
        return method;
810
    }
811
    
812
    @Override
813
    public Function function(String name, Value... values) {
814
        FunctionBase func = new FunctionBase(name);
815
        for (Value theValue : values) {
816
            func.parameter(theValue);
817
        }
818
        return func;
819
    }
820

    
821
    public Function builtin_function(String name, String format, Value... values) {
822
        FunctionBase func = new FunctionBase(name, format);
823
        for (Value theValue : values) {
824
            func.parameter(theValue);
825
        }
826
        return func;
827
    }
828

    
829
    @Override
830
    public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand) {
831
        return binaryOperator(name, null, leftOperand, rightOperand);
832
    }
833
    
834
    public BinaryOperator binaryOperator(String name, String format, Value leftOperand, Value rightOperand) {
835
        BinaryOperator operator = new BinaryOperatorBase(name, format);
836
        operator.left(leftOperand);
837
        operator.right(rightOperand);
838
        return operator;
839
    }
840

    
841
    @Override
842
    public List<Variable> variables() {
843
        final Set<Variable> vars = new HashSet<>();
844
        this.accept((Visitable value1) -> {
845
          if (!vars.contains((Variable) value1)) {
846
            vars.add((Variable) value1);
847
          }
848
        }, new ClassVisitorFilter(Variable.class));
849
        List<Variable> lvars = new ArrayList<>(vars);
850
        Collections.sort(lvars);
851
        return lvars;
852
    }
853

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

    
911
    @Override
912
    public ExpressionBuilder and(Value value) {
913
        if (this.value == null) {
914
            return this.set(value);
915
        }
916
        BinaryOperator operator = binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, this.value, value);
917
        this.value = operator;
918
        return this;
919
    }
920

    
921
    @Override
922
    public ExpressionBuilder or(Value value) {
923
        if (this.value == null) {
924
            return this.set(value);
925
        }
926
        BinaryOperator operator = binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, this.value, value);
927
        this.value = operator;
928
        return this;
929
    }
930

    
931
    @Override
932
    public Function is_null(Value value) {
933
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
934
    }
935

    
936
    @Override
937
    public Function not_is_null(Value value) {
938
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
939
    }
940

    
941
    @Override
942
    public Function not(Value value) {
943
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
944
    }
945

    
946
    @Override
947
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
948
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
949
    }
950

    
951
    @Override
952
    public BinaryOperator and(Expression leftOperand, Expression rightOperand) {
953
        return binaryOperator(
954
                OPERATOR_AND, 
955
                FORMAT_OPERATOR_AND, 
956
                leftOperand.getCode().toValue(), 
957
                rightOperand.getCode().toValue()
958
        );
959
    }
960

    
961
    @Override
962
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
963
        return binaryOperator(
964
                OPERATOR_AND, 
965
                FORMAT_OPERATOR_AND, 
966
                leftOperand.getCode().toValue(), 
967
                rightOperand
968
        );
969
    }
970

    
971
    @Override
972
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
973
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
974
    }
975

    
976
    @Override
977
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
978
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
979
    }
980

    
981
    @Override
982
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
983
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
984
    }
985

    
986
    @Override
987
    public BinaryOperator gt(Value op1, Value op2) {
988
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
989
    }
990

    
991
    @Override
992
    public BinaryOperator ge(Value op1, Value op2) {
993
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
994
    }
995

    
996
    @Override
997
    public BinaryOperator lt(Value op1, Value op2) {
998
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
999
    }
1000

    
1001
    @Override
1002
    public BinaryOperator le(Value op1, Value op2) {
1003
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
1004
    }
1005

    
1006
    @Override
1007
    public BinaryOperator like(Value op1, Value op2) {
1008
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
1009
    }
1010

    
1011
    @Override
1012
    public BinaryOperator ilike(Value op1, Value op2) {
1013
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
1014
    }
1015

    
1016
    @Override
1017
    public BinaryOperator add(Value op1, Value op2) {
1018
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1019
    }
1020

    
1021
    @Override
1022
    public BinaryOperator subst(Value op1, Value op2) {
1023
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1024
    }
1025

    
1026
    @Override
1027
    public BinaryOperator mult(Value op1, Value op2) {
1028
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1029
    }
1030

    
1031
    @Override
1032
    public BinaryOperator div(Value op1, Value op2) {
1033
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1034
    }
1035

    
1036
    @Override
1037
    public BinaryOperator concat(Value op1, Value op2) {
1038
        return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, op1, op2);
1039
    }
1040
    
1041
    @Override
1042
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1043
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1044
    }
1045

    
1046
    @Override
1047
    public Function ifnull(Value value, Value iftrue, Value iffalse) {
1048
        return function(FUNCTION_IFNULL, value, iftrue, iffalse);
1049
    }
1050
    
1051
    @Override
1052
    public Function left(Value str, Value size) {
1053
       return function(FUNCTION_LEFT, str, size);
1054
    }
1055
    
1056
    @Override
1057
    public Function right(Value str, Value len) {
1058
       return function(FUNCTION_RIGHT, str, len);
1059
    }
1060
    
1061
    @Override
1062
    public Function locate(Value search, Value str, Value start) {
1063
       return function(FUNCTION_LOCATE, search, str, start);
1064
    }
1065
    
1066
    @Override
1067
    public Function position(Value search, Value str) {
1068
       return function(FUNCTION_POSITION, search, str);
1069
    }
1070
    
1071
    @Override
1072
    public Function lpad(Value str, Value len, Value padstr) {
1073
       return function(FUNCTION_LPAD, str, len, padstr);
1074
    }
1075
    
1076
    @Override
1077
    public Function rpad(Value str, Value len, Value padstr) {
1078
       return function(FUNCTION_RPAD, str, len, padstr);
1079
    }
1080
    
1081
    @Override
1082
    public Function ltrim(Value str) {
1083
       return function(FUNCTION_LTRIM, str);
1084
    }
1085
    
1086
    @Override
1087
    public Function rtrim(Value str) {
1088
       return function(FUNCTION_RTRIM, str);
1089
    }
1090
    
1091
    @Override
1092
    public Function trim(Value str) {
1093
       return function(FUNCTION_TRIM, str);
1094
    }
1095
    
1096
    @Override
1097
    public Function repeat(Value str, Value size) {
1098
       return function(FUNCTION_REPEAT, str, size);
1099
    }
1100
    
1101
    @Override
1102
    public Function replace(Value str, Value search, Value replstr) {
1103
       return function(FUNCTION_REPLACE, str, search, replstr);
1104
    }
1105
    
1106
    @Override
1107
    public Function ascii(Value str) {
1108
       return function(FUNCTION_ASCII, str);
1109
    }
1110
    
1111
    @Override
1112
    public Function lenght(Value str) {
1113
       return function(FUNCTION_LENGHT, str);
1114
    }
1115

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

    
1285
    @Override
1286
    public Function cast(Value object, Value typeName) {
1287
       return function(FUNCTION_CAST, object, typeName);
1288
    }    
1289

    
1290
    @Override
1291
    public Function decode(Value value, Value format) {
1292
       return function(FUNCTION_DECODE, value, format);
1293
    }    
1294

    
1295
    @Override
1296
    public Function toDouble(Value num) {
1297
       return function(FUNCTION_TODOUBLE, num);
1298
    }    
1299

    
1300
    @Override
1301
    public Function toFloat(Value num) {
1302
       return function(FUNCTION_TOFLOAT, num);
1303
    }    
1304

    
1305
    @Override
1306
    public Function toLong(Value num) {
1307
       return function(FUNCTION_TOLONG, num);
1308
    }    
1309

    
1310
    @Override
1311
    public Function toInteger(Value num) {
1312
       return function(FUNCTION_TOINTEGER, num);
1313
    }    
1314

    
1315
    @Override
1316
    public Function toStr(Value object) {
1317
       return function(FUNCTION_TOSTR, object);
1318
    }    
1319

    
1320
    @Override
1321
    public Function list() {
1322
        return function(FUNCTION_LIST);
1323
    }
1324

    
1325
    @Override
1326
    public Function tuple() {
1327
        return function(FUNCTION_TUPLE);
1328
    }
1329

    
1330
    @Override
1331
    public Function tuple(Constant... values) {
1332
        Function fn = function(FUNCTION_TUPLE);
1333
        for (Value theValue : values) {
1334
            fn.parameter(this.constant(theValue));
1335
        }
1336
        return fn;
1337
    }
1338
    
1339
    @Override
1340
    public String repr(Object value) {
1341
        return this.manager.getReprMethod(value).repr(value);
1342
    }
1343

    
1344
  @Override
1345
  public Function getattr(String objectId, String attributeId) {
1346
        Function fn = function(FUNCTION_GETATTR);
1347
        fn.parameter(variable(objectId));
1348
        fn.parameter(variable(attributeId));
1349
        return fn;
1350
  }
1351

    
1352
  @Override
1353
  public Function date(Date date) {
1354
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1355
    return function(FUNCTION_DATE, constant(df.format(date)));
1356
  }
1357

    
1358
  @Override
1359
  public Function time(Date time) {
1360
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1361
    return function(FUNCTION_TIME, constant(df.format(time)));
1362
  }
1363

    
1364
  @Override
1365
  public Function timestamp(Date timestamp) {
1366
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1367
    return function(FUNCTION_TIMESTAMP, constant(df.format(timestamp)));
1368
  }
1369

    
1370
  @Override
1371
  public Function date(String date) {
1372
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1373
    Date d;
1374
    try {
1375
      d = df.parse(date);
1376
    } catch (ParseException ex) {
1377
      throw new IllegalArgumentException("Can't parse argument '"+date+"' as date.", ex);
1378
    }
1379
    return function(FUNCTION_DATE, constant(df.format(d)));
1380
  }
1381

    
1382
  @Override
1383
  public Function time(String time) {
1384
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1385
    Date t;
1386
    try {
1387
      t = df.parse(time);
1388
    } catch (ParseException ex) {
1389
      throw new IllegalArgumentException("Can't parse argument '"+time+"' as date.", ex);
1390
    }
1391
    return function(FUNCTION_TIME, constant(df.format(t)));
1392
  }
1393

    
1394
  @Override
1395
  public Function timestamp(String timestamp) {
1396
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1397
    Date ts;
1398
    try {
1399
      ts = df.parse(timestamp);
1400
    } catch (ParseException ex) {
1401
      throw new IllegalArgumentException("Can't parse argument '"+timestamp+"' as date.", ex);
1402
    }
1403
    return function(FUNCTION_TIMESTAMP, constant(df.format(ts)));
1404
  }
1405

    
1406
  @Override
1407
  public Function date(Value date) {
1408
    return function(FUNCTION_DATE, date);
1409
  }
1410

    
1411
  @Override
1412
  public Function time(Value time) {
1413
    return function(FUNCTION_TIME, time);
1414
  }
1415

    
1416
  @Override
1417
  public Function timestamp(Value timestamp) {
1418
    return function(FUNCTION_TIMESTAMP, timestamp);
1419
  }
1420

    
1421
  @Override
1422
  public Function current_date() {
1423
    return function(FUNCTION_CURRENT_DATE);
1424
  }
1425

    
1426
  @Override
1427
  public Function current_time() {
1428
    return function(FUNCTION_CURRENT_TIME);
1429
  }
1430

    
1431
  @Override
1432
  public Function current_timestamp() {
1433
    return function(FUNCTION_CURRENT_TIMESTAMP);
1434
  }
1435

    
1436
  @Override
1437
  public Function date_add(Value datefield, Value valueToAdd, Value date) {
1438
    return function(FUNCTION_DATEADD, datefield, valueToAdd, date);
1439
  }
1440

    
1441
  @Override
1442
  public Function date_diff(Value datefield, Value valueToSubst, Value date) {
1443
    return function(FUNCTION_DATEDIFF, datefield, valueToSubst, date);
1444
  }
1445

    
1446
  @Override
1447
  public Function to_date(Value date, Value format) {
1448
    return function(FUNCTION_TO_DATE, date, format);
1449
  }
1450

    
1451
  @Override
1452
  public Function to_timestamp(Value timestamp, Value format) {
1453
    return function(FUNCTION_TO_TIMESTAMP, timestamp, format);
1454
  }
1455

    
1456
  @Override
1457
  public Function extract(Value datefield, Value source) {
1458
    return function(FUNCTION_EXTRACT, datefield, source);
1459
  }
1460
  
1461
}