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

History | View | Annotate | Download (44.3 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 org.gvsig.tools.ToolsLocator;
26
import org.gvsig.tools.dataTypes.Coercion;
27
import org.gvsig.tools.dataTypes.DataTypesManager;
28

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

    
35
    private static final String FORMAT_TRUE = "TRUE";
36
    private static final String FORMAT_FALSE = "FALSE";
37

    
38
    private static final String FORMAT_GROUP = "( {0} )";
39

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

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

    
60
    public class GroupBase extends AbstractValue implements Group {
61

    
62
        protected Value value;
63

    
64
        public GroupBase(Value value) {
65
            this.value = value;
66
        }
67

    
68
        @Override
69
        public Value value() {
70
            return value;
71
        }
72

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

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

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

    
102
    public class VariableBase extends AbstractValue implements Variable {
103

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

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

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

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

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

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

    
151
    public class ParameterBase extends AbstractValue implements Parameter {
152

    
153
        protected String name;
154
        protected Object value;
155
        protected int type;
156

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

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

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

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

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

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

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

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

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

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

    
266
    public class ConstantBase extends AbstractValue implements Constant {
267

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

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

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

    
313
    public class CustomBase extends AbstractValue implements Custom {
314

    
315
        protected Object value;
316

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

    
321
        public CustomBase(Object value) {
322
            this.value = value;
323
        }
324

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

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

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

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

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

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

    
387
    public class FunctionBase extends AbstractValue implements Function {
388

    
389
        protected String name;
390
        protected String format;
391
        protected List<Value> parameters;
392

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

    
398
        public FunctionBase(String name) {
399
            this(name,null);
400
        }
401

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

    
410
        @Override
411
        public Function format(String format) {
412
          this.format = format;
413
          return this;
414
        }
415

    
416
        @Override
417
        public Function parameter(Value parameter) {
418
            this.parameters().add(parameter);
419
            return this;
420
        }
421

    
422
        @Override
423
        public String name() {
424
            return this.name;
425
        }
426

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

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

    
494
    public class MethodBase extends FunctionBase implements Method {
495

    
496
        private Value instance;
497
        
498
        public MethodBase(Value instance, String name) {
499
            super(name);
500
            this.instance = instance;
501
        }
502

    
503
        @Override
504
        public Value instance() {
505
            return this.instance;
506
        }
507

    
508
        @Override
509
        public void accept(Visitor visitor, VisitorFilter filter) {
510
            this.instance.accept(visitor, filter);
511
            super.accept(visitor, filter);
512
        }
513

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

    
550
    public class BinaryOperatorBase extends AbstractValue implements BinaryOperator {
551

    
552
        protected String name;
553
        protected String format;
554
        protected Value left;
555
        protected Value right;
556

    
557
        public BinaryOperatorBase(String name, String format) {
558
            this.name = name;
559
            this.format = format;
560
        }
561

    
562
        @Override
563
        public String name() {
564
            return this.name;
565
        }
566

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

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

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

    
600
        @Override
601
        public Value left() {
602
            return this.left;
603
        }
604

    
605
        @Override
606
        public Value right() {
607
            return this.right;
608
        }
609

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

    
640
    protected Value value;
641
    protected ExpressionEvaluatorManager manager;
642
    protected Formatter<ExpressionBuilder.Value> formatter;
643

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

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

    
666
    @Override
667
    public Value value() {
668
        return this.value;
669
    }
670

    
671
    @Override
672
    public ExpressionBuilder value(Value value) {
673
        this.value = value;
674
        return this;
675
    }
676

    
677
    @Override
678
    public String toString() {
679
        if (this.value == null) {
680
            return "";
681
        }
682
        return this.value.toString();
683
    }
684

    
685
    @Override
686
    public String toString(Formatter<Value> formatter) {
687
        if (this.value == null) {
688
            return "";
689
        }
690
        return this.value.toString(formatter);
691
    }
692
    
693
    @Override
694
    public String build() {
695
        if (this.value == null) {
696
            return null;
697
        }
698
        return this.value.toString();
699
    }
700
    
701
    @Override
702
    public String build(Formatter<Value> formatter) {
703
        if (this.value == null) {
704
            return null;
705
        }
706
        return this.value.toString(formatter);
707
    }
708

    
709
    @Override
710
    public Value toValue(String expression) {
711
        try {
712
            Code code = ExpressionUtils.compile(expression);
713
            return code.toValue(this);
714
        } catch(Throwable ex) {
715
            return custom(expression);
716
        }
717
    }
718

    
719
    @Override
720
    public void accept(Visitor visitor, VisitorFilter filter) {
721
        if( this.value == null) {
722
            return;
723
        }
724
        this.value.accept(visitor, filter);
725
    }
726

    
727
    @Override
728
    public String quote_for_identifiers() {
729
        return FORMAT_QUOTE_FOR_IDENTIFIERS;
730
    }
731
    
732
    @Override
733
    public String quote_for_strings() {
734
        return FORMAT_QUOTE_FOR_STRINGS;
735
    }
736
       
737
    @Override
738
    public String string(String s) {
739
        String quote = this.quote_for_strings();
740
//        No se porque no esta disponible wrapIfMissing
741
//        return StringUtils.wrapIfMissing(s,quote);
742
        if (s.startsWith(quote)) {
743
            return s;
744
        }
745
        return quote + StringUtils.replace(s,quote,quote+quote) + quote;
746
    }
747

    
748
    @Override
749
    public String identifier(String id) {
750
        String quote = this.quote_for_identifiers();
751
//        No se porque no esta disponible wrapIfMissing
752
//        return StringUtils.wrapIfMissing(id,quote);
753
        if (id.startsWith(quote)) {
754
            return id;
755
        }
756
        return quote + id + quote;
757
    }
758

    
759
    @Override
760
    public String bytearray_hex(byte[] data) {
761
        StringBuilder builder = new StringBuilder();
762
        for (byte abyte : data) {
763
            int v = abyte & 0xff;
764
            builder.append(String.format("%02x", v));
765
        }
766
        return builder.toString();
767
    }
768

    
769
    @Override
770
    public String bytearray_0x(byte[] data) {
771
        return "0x" + bytearray_hex(data);
772
    }
773

    
774
    @Override
775
    public String bytearray_x(byte[] data) {
776
        return "x'" + bytearray_hex(data) + "'";
777
    }
778
    
779

    
780
    @Override
781
    public Constant bytearray(byte[] data) {
782
        return new ConstantBase(this, data);
783
    }
784
    
785
    @Override
786
    public Variable variable(String name) {
787
        return new VariableBase(this, name);
788
    }
789

    
790
    @Override
791
    public Variable column(String name) {
792
        return new VariableBase(this, name);
793
    }
794

    
795
    @Override
796
    public Value column(String tableName, String columnName) {
797
      return getattr(tableName,columnName);
798
    }
799

    
800
    @Override
801
    public Parameter parameter(String name) {
802
        List<Parameter> parameters = this.parameters();
803
        for (Parameter parameter : parameters) {
804
            if( StringUtils.equalsIgnoreCase(name, parameter.name()) ) {
805
                return parameter;
806
            }
807
        }
808
        Parameter parameter = this.parameter();
809
        parameter.name(name);
810
        return parameter;
811
    }
812
    
813
    @Override
814
    public Parameter parameter() {
815
        return new ParameterBase();
816
    }
817
    
818
    @Override
819
    public Constant constant(Object value) {
820
        return new ConstantBase(this, value);
821
    }
822

    
823
    @Override
824
    public Constant constant(Object value, Class theClass) {
825
      try {
826
        DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
827
        Coercion coercion = dataTypeManager.getDataType(theClass).getCoercion();
828
        return this.constant(coercion.coerce(value));
829
      } catch (Exception ex) {
830
        throw new RuntimeException("Can't coerce value ("+Objects.toString(value)+") to "+theClass.getSimpleName()+".", ex);
831
      }
832
    }
833

    
834
    @Override
835
    public Constant constant(Object value, int type) {
836
      try {
837
        DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
838
        Coercion coercion = dataTypeManager.getCoercion(type);
839
        return this.constant(coercion.coerce(value));
840
      } catch (Exception ex) {
841
        throw new RuntimeException("Can't coerce value ("+Objects.toString(value)+") to "+type+".", ex);
842
      }
843
    }
844
  
845
    @Override
846
    public Group group(Value value) {
847
        return new GroupBase(value);
848
    }
849

    
850
    @Override
851
    public Custom custom(Object value) {
852
        return new CustomBase(value);
853
    }
854

    
855
    @Override
856
    public Method method(Value instance, String name, Value... values) {
857
        MethodBase method = new MethodBase(instance, name);
858
        for (Value theValue : values) {
859
            method.parameter(theValue);
860
        }
861
        return method;
862
    }
863
    
864
    @Override
865
    public Function function(String name, Value... values) {
866
        FunctionBase func = new FunctionBase(name);
867
        for (Value theValue : values) {
868
            func.parameter(theValue);
869
        }
870
        return func;
871
    }
872

    
873
    public Function builtin_function(String name, String format, Value... values) {
874
        FunctionBase func = new FunctionBase(name, format);
875
        for (Value theValue : values) {
876
            func.parameter(theValue);
877
        }
878
        return func;
879
    }
880

    
881
    @Override
882
    public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand) {
883
        return binaryOperator(name, null, leftOperand, rightOperand);
884
    }
885
    
886
    public BinaryOperator binaryOperator(String name, String format, Value leftOperand, Value rightOperand) {
887
        BinaryOperator operator = new BinaryOperatorBase(name, format);
888
        operator.left(leftOperand);
889
        operator.right(rightOperand);
890
        return operator;
891
    }
892

    
893
    @Override
894
    public List<Variable> variables() {
895
        final Set<Variable> vars = new HashSet<>();
896
        this.accept((Visitable value1) -> {
897
          if (!vars.contains((Variable) value1)) {
898
            vars.add((Variable) value1);
899
          }
900
        }, new ClassVisitorFilter(Variable.class));
901
        List<Variable> lvars = new ArrayList<>(vars);
902
        Collections.sort(lvars);
903
        return lvars;
904
    }
905

    
906
    @Override
907
    public List<Parameter> parameters() {
908
        final List<Parameter>  params = new ArrayList<>();
909
        this.accept((Visitable value1) -> {
910
          params.add((Parameter) value1);
911
        }, new ClassVisitorFilter(Parameter.class));
912
        return params;
913
    }
914
    
915
    @Override
916
    public List<String> parameters_names() {
917
        List<String> params = new ArrayList<>();
918
        for (Parameter param : parameters()) {
919
            Object theValue = param.value();
920
            String s;
921
            switch(param.type()) {
922
                case PARAMETER_TYPE_CONSTANT:
923
                    if( theValue==null ) {
924
                        s = "NULL";
925
                    } else if( theValue instanceof String ) {
926
                        s = "'" + (String)theValue + "'";
927
                        
928
                    } else if( theValue instanceof byte[] ) {
929
                        s = bytearray_0x((byte[]) theValue);
930
                        
931
                    } else {
932
                        s = theValue.toString();
933
                    }    
934
                    break;
935
                case PARAMETER_TYPE_VARIABLE:
936
                default:
937
                    s = "\"" + param.name() + "\"";
938
            }
939
//            if( !params.contains(s) ) { // Ojo que deben ir todos, incluso duplicados.
940
                params.add(s);
941
//            }
942
        }
943
        // Collections.sort(params); Ojo, no deben ordenarse.
944
        return params;
945
    }
946
    
947
    @Override
948
    public List<String> variables_names() {
949
        List<String> vars = new ArrayList<>();
950
        for (Variable var : this.variables()) {
951
            vars.add(var.name());
952
        }
953
        Collections.sort(vars);
954
        return vars;
955
    }
956
    
957
    @Override
958
    public ExpressionBuilder set(Value value) {
959
        this.value = value;
960
        return this;
961
    }
962

    
963
    @Override
964
    public ExpressionBuilder and(Value value) {
965
        if (this.value == null) {
966
            return this.set(value);
967
        }
968
        BinaryOperator operator = binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, this.value, value);
969
        this.value = operator;
970
        return this;
971
    }
972

    
973
    @Override
974
    public ExpressionBuilder or(Value value) {
975
        if (this.value == null) {
976
            return this.set(value);
977
        }
978
        BinaryOperator operator = binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, this.value, value);
979
        this.value = operator;
980
        return this;
981
    }
982

    
983
    @Override
984
    public Function is_null(Value value) {
985
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
986
    }
987

    
988
    @Override
989
    public Function not_is_null(Value value) {
990
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
991
    }
992

    
993
    @Override
994
    public Function not(Value value) {
995
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
996
    }
997

    
998
    @Override
999
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
1000
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
1001
    }
1002

    
1003
    @Override
1004
    public BinaryOperator and(Expression leftOperand, Expression rightOperand) {
1005
        return binaryOperator(
1006
                OPERATOR_AND, 
1007
                FORMAT_OPERATOR_AND, 
1008
                leftOperand.getCode().toValue(), 
1009
                rightOperand.getCode().toValue()
1010
        );
1011
    }
1012

    
1013
    @Override
1014
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
1015
        return binaryOperator(
1016
                OPERATOR_AND, 
1017
                FORMAT_OPERATOR_AND, 
1018
                leftOperand.getCode().toValue(), 
1019
                rightOperand
1020
        );
1021
    }
1022

    
1023
    @Override
1024
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
1025
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
1026
    }
1027

    
1028
    @Override
1029
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
1030
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
1031
    }
1032

    
1033
    @Override
1034
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
1035
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
1036
    }
1037

    
1038
    @Override
1039
    public BinaryOperator gt(Value op1, Value op2) {
1040
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
1041
    }
1042

    
1043
    @Override
1044
    public BinaryOperator ge(Value op1, Value op2) {
1045
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
1046
    }
1047

    
1048
    @Override
1049
    public BinaryOperator lt(Value op1, Value op2) {
1050
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
1051
    }
1052

    
1053
    @Override
1054
    public BinaryOperator le(Value op1, Value op2) {
1055
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
1056
    }
1057

    
1058
    @Override
1059
    public BinaryOperator like(Value op1, Value op2) {
1060
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
1061
    }
1062

    
1063
    @Override
1064
    public BinaryOperator ilike(Value op1, Value op2) {
1065
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
1066
    }
1067

    
1068
    @Override
1069
    public BinaryOperator add(Value op1, Value op2) {
1070
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1071
    }
1072

    
1073
    @Override
1074
    public BinaryOperator subst(Value op1, Value op2) {
1075
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1076
    }
1077

    
1078
    @Override
1079
    public BinaryOperator mult(Value op1, Value op2) {
1080
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1081
    }
1082

    
1083
    @Override
1084
    public BinaryOperator div(Value op1, Value op2) {
1085
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1086
    }
1087

    
1088
    @Override
1089
    public BinaryOperator concat(Value op1, Value op2) {
1090
        return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, op1, op2);
1091
    }
1092
    
1093
    @Override
1094
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1095
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1096
    }
1097

    
1098
    @Override
1099
    public Function ifnull(Value value, Value iftrue, Value iffalse) {
1100
        return function(FUNCTION_IFNULL, value, iftrue, iffalse);
1101
    }
1102
    
1103
    @Override
1104
    public Function left(Value str, Value size) {
1105
       return function(FUNCTION_LEFT, str, size);
1106
    }
1107
    
1108
    @Override
1109
    public Function right(Value str, Value len) {
1110
       return function(FUNCTION_RIGHT, str, len);
1111
    }
1112
    
1113
    @Override
1114
    public Function locate(Value search, Value str, Value start) {
1115
       return function(FUNCTION_LOCATE, search, str, start);
1116
    }
1117
    
1118
    @Override
1119
    public Function position(Value search, Value str) {
1120
       return function(FUNCTION_POSITION, search, str);
1121
    }
1122
    
1123
    @Override
1124
    public Function lpad(Value str, Value len, Value padstr) {
1125
       return function(FUNCTION_LPAD, str, len, padstr);
1126
    }
1127
    
1128
    @Override
1129
    public Function rpad(Value str, Value len, Value padstr) {
1130
       return function(FUNCTION_RPAD, str, len, padstr);
1131
    }
1132
    
1133
    @Override
1134
    public Function ltrim(Value str) {
1135
       return function(FUNCTION_LTRIM, str);
1136
    }
1137
    
1138
    @Override
1139
    public Function rtrim(Value str) {
1140
       return function(FUNCTION_RTRIM, str);
1141
    }
1142
    
1143
    @Override
1144
    public Function trim(Value str) {
1145
       return function(FUNCTION_TRIM, str);
1146
    }
1147
    
1148
    @Override
1149
    public Function repeat(Value str, Value size) {
1150
       return function(FUNCTION_REPEAT, str, size);
1151
    }
1152
    
1153
    @Override
1154
    public Function replace(Value str, Value search, Value replstr) {
1155
       return function(FUNCTION_REPLACE, str, search, replstr);
1156
    }
1157
    
1158
    @Override
1159
    public Function ascii(Value str) {
1160
       return function(FUNCTION_ASCII, str);
1161
    }
1162
    
1163
    @Override
1164
    public Function lenght(Value str) {
1165
       return function(FUNCTION_LENGHT, str);
1166
    }
1167

    
1168
    @Override
1169
    public Function instr(Value str, Value search, Value start) {
1170
       return function(FUNCTION_INSTR, str, search, start);
1171
    }
1172
    
1173
    @Override
1174
    public Function lower(Value str) {
1175
       return function(FUNCTION_LOWER, str);
1176
    }
1177
    
1178
    @Override
1179
    public Function upper(Value str) {
1180
       return function(FUNCTION_UPPER, str);
1181
    }
1182
    
1183
    @Override
1184
    public Function space(Value size) {
1185
       return function(FUNCTION_SPACE, size);
1186
    }
1187
    
1188
    @Override
1189
    public Function substring(Value str, Value start, Value len) {
1190
       return function(FUNCTION_SUBSTRING, str, start, len);
1191
    }
1192
    
1193
    @Override
1194
    public Function acos(Value num) {
1195
       return function(FUNCTION_ACOS, num);
1196
    } 
1197
    
1198
    @Override
1199
    public Function asin(Value num) {
1200
       return function(FUNCTION_ASIN, num);
1201
    }
1202
    
1203
    @Override
1204
    public Function atan(Value num) {
1205
       return function(FUNCTION_ATAN, num);
1206
    }
1207
    
1208
    @Override
1209
    public Function cos(Value num) {
1210
       return function(FUNCTION_COS, num);
1211
    }
1212
    
1213
    @Override
1214
    public Function cosh(Value num) {
1215
       return function(FUNCTION_COSH, num);
1216
    }
1217
    
1218
    @Override
1219
    public Function cot(Value num) {
1220
       return function(FUNCTION_COT, num);
1221
    }  
1222
    
1223
    @Override
1224
    public Function bitand(Value num1, Value num2) {
1225
       return function(FUNCTION_BITAND, num1, num2);
1226
    } 
1227
    
1228
    @Override
1229
    public Function bitor(Value num1, Value num2) {
1230
       return function(FUNCTION_BITOR, num1, num2);
1231
    }
1232
    
1233
    @Override
1234
    public Function bitxor(Value num1, Value num2) {
1235
       return function(FUNCTION_BITXOR, num1, num2);
1236
    }
1237
    
1238
    @Override
1239
    public Function ceil(Value num) {
1240
       return function(FUNCTION_CEIL, num);
1241
    }
1242
    
1243
    @Override
1244
    public Function degrees(Value num) {
1245
       return function(FUNCTION_DEGREES, num);
1246
    }  
1247
    
1248
    @Override
1249
    public Function exp(Value num) {
1250
       return function(FUNCTION_EXP, num);
1251
    }  
1252
    
1253
    @Override
1254
    public Function floor(Value num) {
1255
       return function(FUNCTION_FLOOR, num);
1256
    }  
1257
    
1258
    @Override
1259
    public Function log(Value num) {
1260
       return function(FUNCTION_LOG, num);
1261
    }  
1262
    
1263
    @Override
1264
    public Function log10(Value num) {
1265
       return function(FUNCTION_LOG10, num);
1266
    }  
1267
    
1268
    @Override
1269
    public Function pi() {
1270
       return function(FUNCTION_PI);
1271
    }
1272
    
1273
    @Override
1274
    public Function abs(Value num) {
1275
       return function(FUNCTION_ABS, num);
1276
    }
1277
    
1278
    @Override
1279
    public Function power(Value num) {
1280
       return function(FUNCTION_POWER, num);
1281
    }
1282
    
1283
    @Override
1284
    public Function radians(Value num) {
1285
       return function(FUNCTION_RADIANS, num);
1286
    }
1287
    
1288
    @Override
1289
    public Function rand(Value num) {
1290
       return function(FUNCTION_RAND, num);
1291
    }
1292
    
1293
    @Override
1294
    public Function round(Value num) {
1295
       return function(FUNCTION_ROUND, num);
1296
    }
1297
    
1298
    @Override
1299
    public Function sqrt(Value num) {
1300
       return function(FUNCTION_SQRT, num);
1301
    }
1302
    
1303
    @Override
1304
    public Function sign(Value num) {
1305
       return function(FUNCTION_SIGN, num);
1306
    }
1307
    
1308
    @Override
1309
    public Function sin(Value num) {
1310
       return function(FUNCTION_SIN, num);
1311
    }
1312
    
1313
    @Override
1314
    public Function sinh(Value num) {
1315
       return function(FUNCTION_SINH, num);
1316
    }
1317
    
1318
    @Override
1319
    public Function tan(Value num) {
1320
       return function(FUNCTION_TAN, num);
1321
    }
1322
    @Override
1323
    public Function tanh(Value num) {
1324
       return function(FUNCTION_TANH, num);
1325
    }  
1326
    
1327
    @Override
1328
    public Function zero() {
1329
       return function(FUNCTION_ZERO);
1330
    }
1331
    
1332
    @Override
1333
    public Function chr(Value num) {
1334
       return function(FUNCTION_CHR, num);
1335
    }    
1336

    
1337
    @Override
1338
    public Function cast(Value object, Value typeName) {
1339
       return function(FUNCTION_CAST, object, typeName);
1340
    }    
1341

    
1342
    @Override
1343
    public Function decode(Value value, Value format) {
1344
       return function(FUNCTION_DECODE, value, format);
1345
    }    
1346

    
1347
    @Override
1348
    public Function toDouble(Value num) {
1349
       return function(FUNCTION_TODOUBLE, num);
1350
    }    
1351

    
1352
    @Override
1353
    public Function toFloat(Value num) {
1354
       return function(FUNCTION_TOFLOAT, num);
1355
    }    
1356

    
1357
    @Override
1358
    public Function toLong(Value num) {
1359
       return function(FUNCTION_TOLONG, num);
1360
    }    
1361

    
1362
    @Override
1363
    public Function toInteger(Value num) {
1364
       return function(FUNCTION_TOINTEGER, num);
1365
    }    
1366

    
1367
    @Override
1368
    public Function toStr(Value object) {
1369
       return function(FUNCTION_TOSTR, object);
1370
    }    
1371

    
1372
    @Override
1373
    public Function list() {
1374
        return function(FUNCTION_LIST);
1375
    }
1376

    
1377
    @Override
1378
    public Function tuple() {
1379
        return function(FUNCTION_TUPLE);
1380
    }
1381

    
1382
    @Override
1383
    public Function tuple(Object... values) {
1384
        Function fn = function(FUNCTION_TUPLE);
1385
        for (Object theValue : values) {
1386
            if( theValue instanceof ExpressionBuilder.Value ) {
1387
              fn.parameter((Value) theValue);
1388
            } else {
1389
              fn.parameter(constant(theValue));
1390
            }
1391
        }
1392
        return fn;
1393
    }
1394
    
1395
    @Override
1396
    public String repr(Object value) {
1397
        return this.manager.getReprMethod(value).repr(value);
1398
    }
1399

    
1400
  @Override
1401
  public Function getattr(String objectId, String attributeId) {
1402
        Function fn = function(FUNCTION_GETATTR);
1403
        fn.parameter(variable(objectId));
1404
        fn.parameter(variable(attributeId));
1405
        return fn;
1406
  }
1407

    
1408
  @Override
1409
  public Function date(Date date) {
1410
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1411
    return function(FUNCTION_DATE, constant(df.format(date)));
1412
  }
1413

    
1414
  @Override
1415
  public Function time(Date time) {
1416
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1417
    return function(FUNCTION_TIME, constant(df.format(time)));
1418
  }
1419

    
1420
  @Override
1421
  public Function timestamp(Date timestamp) {
1422
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1423
    return function(FUNCTION_TIMESTAMP, constant(df.format(timestamp)));
1424
  }
1425

    
1426
  @Override
1427
  public Function date(String date) {
1428
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1429
    Date d;
1430
    try {
1431
      d = df.parse(date);
1432
    } catch (ParseException ex) {
1433
      throw new IllegalArgumentException("Can't parse argument '"+date+"' as date.", ex);
1434
    }
1435
    return function(FUNCTION_DATE, constant(df.format(d)));
1436
  }
1437

    
1438
  @Override
1439
  public Function time(String time) {
1440
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1441
    Date t;
1442
    try {
1443
      t = df.parse(time);
1444
    } catch (ParseException ex) {
1445
      throw new IllegalArgumentException("Can't parse argument '"+time+"' as date.", ex);
1446
    }
1447
    return function(FUNCTION_TIME, constant(df.format(t)));
1448
  }
1449

    
1450
  @Override
1451
  public Function timestamp(String timestamp) {
1452
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1453
    Date ts;
1454
    try {
1455
      ts = df.parse(timestamp);
1456
    } catch (ParseException ex) {
1457
      throw new IllegalArgumentException("Can't parse argument '"+timestamp+"' as date.", ex);
1458
    }
1459
    return function(FUNCTION_TIMESTAMP, constant(df.format(ts)));
1460
  }
1461

    
1462
  @Override
1463
  public Function date(Value date) {
1464
    return function(FUNCTION_DATE, date);
1465
  }
1466

    
1467
  @Override
1468
  public Function time(Value time) {
1469
    return function(FUNCTION_TIME, time);
1470
  }
1471

    
1472
  @Override
1473
  public Function timestamp(Value timestamp) {
1474
    return function(FUNCTION_TIMESTAMP, timestamp);
1475
  }
1476

    
1477
  @Override
1478
  public Function current_date() {
1479
    return function(FUNCTION_CURRENT_DATE);
1480
  }
1481

    
1482
  @Override
1483
  public Function current_time() {
1484
    return function(FUNCTION_CURRENT_TIME);
1485
  }
1486

    
1487
  @Override
1488
  public Function current_timestamp() {
1489
    return function(FUNCTION_CURRENT_TIMESTAMP);
1490
  }
1491

    
1492
  @Override
1493
  public Function date_add(Value datefield, Value valueToAdd, Value date) {
1494
    return function(FUNCTION_DATEADD, datefield, valueToAdd, date);
1495
  }
1496

    
1497
  @Override
1498
  public Function date_diff(Value datefield, Value valueToSubst, Value date) {
1499
    return function(FUNCTION_DATEDIFF, datefield, valueToSubst, date);
1500
  }
1501

    
1502
  @Override
1503
  public Function to_date(Value date, Value format) {
1504
    return function(FUNCTION_TO_DATE, date, format);
1505
  }
1506

    
1507
  @Override
1508
  public Function to_timestamp(Value timestamp, Value format) {
1509
    return function(FUNCTION_TO_TIMESTAMP, timestamp, format);
1510
  }
1511

    
1512
  @Override
1513
  public Function extract(Value datefield, Value source) {
1514
    return function(FUNCTION_EXTRACT, datefield, source);
1515
  }
1516
  
1517
}