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

History | View | Annotate | Download (49.1 KB)

1
package org.gvsig.expressionevaluator.impl;
2

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

    
19
import org.gvsig.expressionevaluator.ExpressionBuilder;
20
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_CONSTANT;
21
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE;
22
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
23
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
24
import org.gvsig.expressionevaluator.ExpressionUtils;
25
import org.gvsig.expressionevaluator.Formatter;
26
import org.gvsig.expressionevaluator.ReprMethod;
27
import org.gvsig.tools.ToolsLocator;
28
import org.gvsig.tools.dataTypes.Coercion;
29
import org.gvsig.tools.dataTypes.DataTypesManager;
30
import org.gvsig.tools.util.PropertiesSupportHelper;
31

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

    
38
    private static final String FORMAT_TRUE = "TRUE";
39
    private static final String FORMAT_FALSE = "FALSE";
40

    
41
    private static final String FORMAT_GROUP = "( {0} )";
42

    
43
    private static final String FORMAT_ISNULL = "( ({0}) IS NULL )";
44
    private static final String FORMAT_NOTISNULL = "( ({0}) IS NOT NULL )";
45
    private static final String FORMAT_OPERATOR_NOT = "( NOT ({0}) )";
46

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

    
66
    public class GroupBase extends AbstractValue implements Group {
67

    
68
        protected Value value;
69

    
70
        public GroupBase(Value value) {
71
            this.value = value;
72
        }
73
        
74
        @Override
75
       public GroupBase clone() throws CloneNotSupportedException {
76
            GroupBase other = (GroupBase) super.clone();
77
            other.value = value.clone();
78
            return other;
79
        }
80

    
81
        @Override
82
        public Value value() {
83
            return value;
84
        }
85

    
86
        @Override
87
        public void accept(Visitor visitor, VisitorFilter filter) {
88
            boolean visitChildren = true;
89
            if (filter==null || filter.accept(this)) {
90
                visitor.visit(this);
91
            } else {
92
                visitChildren = !filter.skipChildren();
93
            }
94
            if(visitChildren){
95
                this.value.accept(visitor, filter);
96
            }
97
        }
98

    
99
        @Override
100
        public void replace(Value target, Value replacement) {
101
            if( this.value == target ) {
102
                this.value = replacement;
103
            } else {
104
                this.value.replace(target, replacement);
105
            }
106
        }
107

    
108
        @Override
109
        public String toString() {
110
            return this.toString(formatter());
111
        }
112
        
113
        @Override
114
        public String toString(Formatter<Value> formatter) {
115
            if( formatter!=null && formatter.canApply(this) ) {
116
                return formatter.format(this);
117
            }
118
            return MessageFormat.format(FORMAT_GROUP, this.value.toString());
119
        }
120
    }
121

    
122
    public class VariableBase extends AbstractValue implements Variable {
123

    
124
        protected String name;
125
        protected ExpressionBuilder builder;
126
        
127
        public VariableBase(ExpressionBuilder builder, String name) {
128
            this.name = name;
129
            this.builder = builder;
130
        }
131
        
132
        public VariableBase clone() throws CloneNotSupportedException {
133
            VariableBase other = (VariableBase) super.clone();
134
            return other;
135
        }    
136

    
137
        @Override
138
        public String name() {
139
            return this.name;
140
        }
141

    
142
        @Override
143
        public String toString() {
144
            return this.toString(formatter());
145
        }
146
        
147
        @Override
148
        public String toString(Formatter<Value> formatter) {
149
            if( formatter!=null && formatter.canApply(this) ) {
150
                return formatter.format(this);
151
            }
152
            return this.builder.identifier(this.name);
153
        }
154

    
155
        @Override
156
        public int compareTo(Variable o) {
157
            return this.name.compareTo(o.name());
158
        }
159

    
160
        @Override
161
        public boolean equals(Object obj) {
162
            if (!(obj instanceof Variable)) {
163
                return false;
164
            }
165
            return this.name.equals(((Variable) obj).name());
166
        }
167

    
168
        @Override
169
        public int hashCode() {
170
            int hash = 7;
171
            hash = 37 * hash + Objects.hashCode(this.name);
172
            return hash;
173
        }
174
    }
175

    
176
    public class ParameterBase extends AbstractValue implements Parameter {
177

    
178
        protected String name;
179
        protected Object value;
180
        protected int type;
181

    
182
        public ParameterBase() {
183
            this.type = PARAMETER_TYPE_CONSTANT;
184
            this.name = null;
185
            this.value = null;
186
        }
187
        
188
        public ParameterBase clone() throws CloneNotSupportedException {
189
            ParameterBase other = (ParameterBase) super.clone();
190
            return other;
191
        }     
192

    
193
        @Override
194
        public Parameter as_constant() {
195
            this.type = PARAMETER_TYPE_CONSTANT;
196
            if (this.value == null && this.name != null) {
197
                this.value = this.name;
198
            }
199
            return this;
200
        }
201

    
202
        @Override
203
        public Parameter as_variable() {
204
            this.type = PARAMETER_TYPE_VARIABLE;
205
            if (this.value != null && this.name == null) {
206
                this.name = (String) this.value;
207
            }
208
            return this;
209
        }
210
        
211
        @Override
212
        public String name() {
213
            switch (this.type) {
214
                case PARAMETER_TYPE_VARIABLE:
215
                    return this.name;
216
                case PARAMETER_TYPE_CONSTANT:
217
                    if (this.value == null) {
218
                        return null;
219
                    }
220
                    return this.value.toString();
221
                default:
222
                    if (this.name != null) {
223
                        return this.name;
224
                    }
225
                    if (this.value != null) {
226
                        return this.value.toString();
227
                    }
228
                    return null;
229
            }
230
        }
231

    
232
        @Override
233
        public int type() {
234
            return this.type;
235
        }
236

    
237
        @Override
238
        public boolean is_constant() {
239
            return this.type == PARAMETER_TYPE_CONSTANT;
240
        }
241

    
242
        @Override
243
        public boolean is_variable() {
244
            return this.type == PARAMETER_TYPE_VARIABLE;
245
        }
246

    
247
        @Override
248
        public Parameter value(Object value) {
249
            this.value = value;
250
            return this;
251
        }
252

    
253
        @Override
254
        public Parameter name(String name) {
255
            this.type = PARAMETER_TYPE_VARIABLE;
256
            this.name = name;
257
            return this;
258
        }
259

    
260
        @Override
261
        public Object value() {
262
            try {
263
                switch (this.type) {
264
                    case PARAMETER_TYPE_CONSTANT:
265
                        return this.value;
266
                    case PARAMETER_TYPE_VARIABLE:
267
                    default:
268
                        return this.value;
269
                }
270
            } catch (Exception ex) {
271
                throw new RuntimeException("Can't get value from parameter.", ex);
272
            }
273
        }
274

    
275
        @Override
276
        public String toString() {
277
            return this.toString(formatter());
278
        }
279
        
280
        @Override
281
        public String toString(Formatter<Value> formatter) {
282
            if( formatter!=null && formatter.canApply(this) ) {
283
                return formatter.format(this);
284
            }
285
            switch (this.type) {
286
                case PARAMETER_TYPE_CONSTANT:
287
                    return Objects.toString(this.value);
288
                    
289
                case PARAMETER_TYPE_VARIABLE:
290
                default:
291
                    return "?";
292
            }
293
        }
294
    }
295

    
296
    public class ConstantBase extends AbstractValue implements Constant {
297

    
298
        protected Object value;
299
        protected ExpressionBuilder builder;
300
        
301
        public ConstantBase(ExpressionBuilder builder, Object value) {
302
            this.value = value;
303
            this.builder = builder;
304
        }
305

    
306
        public Constant clone() throws CloneNotSupportedException {
307
            ConstantBase other = (ConstantBase) super.clone();
308
            return other;
309
        }
310
        
311
        @Override
312
        public Object value() {
313
            return this.value;
314
        }
315

    
316
        @Override
317
        public String toString() {
318
            return this.toString(formatter());
319
        }
320
        
321
        @Override
322
        public String toString(Formatter<Value> formatter) {
323
            if( formatter!=null && formatter.canApply(this) ) {
324
                return formatter.format(this);
325
            }
326
            if( this.value==null ) {
327
                return "NULL";
328
            }
329
            if( this.value instanceof byte[] ) {
330
                return "DECODE('"+this.builder.bytearray_hex((byte[])this.value)+"','hex')";
331
            }
332
            if (this.value instanceof String) {
333
                return this.builder.string((String) this.value);
334
            }
335
            if (this.value instanceof Boolean) {
336
                if (((Boolean) this.value)) {
337
                    return FORMAT_TRUE;
338
                } else {
339
                    return FORMAT_FALSE;
340
                }
341
            }
342
            ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
343
            ReprMethod repr = manager.getReprMethod(this.value);            
344
            return repr.repr(value);
345
        }
346
        
347
        public ExpressionBuilder builder() {
348
            return this.builder; // Ojo, no esta en el API.
349
        }
350
        
351
    }
352

    
353
    public class CustomBase extends AbstractValue implements Custom {
354

    
355
        protected Object value;
356

    
357
        // Esto es para permitir declarar parametros y columnas en una seccion
358
        // custom.
359
        protected List<Value> values;
360

    
361
        public CustomBase(Object value) {
362
            this.value = value;
363
        }
364
        
365
        public Custom clone() throws CloneNotSupportedException {
366
            CustomBase other = (CustomBase) super.clone();
367
            if(other.values!=null) {
368
                for (int i = 0; i < values.size(); i++) {
369
                    Value v = (Value) values.get(i).clone();
370
                    other.values.set(i, v);
371
                }
372
            }
373
            
374
            return other;
375
        }
376

    
377
        @Override
378
        public void accept(Visitor visitor, VisitorFilter filter) {
379
            boolean visitChildren = true;
380
            if (filter==null || filter.accept(this)) {
381
                visitor.visit(this);
382
            } else {
383
                visitChildren = !filter.skipChildren();
384
            }
385
            if(visitChildren){
386
                if (this.values != null) {
387
                    for (Value theValue : values) {
388
                        theValue.accept(visitor, filter);
389
                    }
390
                }
391
            }
392
        }
393

    
394
        @Override
395
        public void replace(Value target, Value replacement) {
396
            if( this.values == null ) {
397
                return;
398
            }
399
            for (int i = 0; i < values.size(); i++) {
400
                Value theValue = values.get(i);
401
                if( target == theValue ) {
402
                    values.set(i, replacement);
403
                } else {
404
                    theValue.replace(target, replacement);
405
                }
406
            }
407
        }
408

    
409
        @Override
410
        public Object value() {
411
            return this.value;
412
        }
413

    
414
        @Override
415
        public Custom add(Variable variable) {
416
            if (this.values == null) {
417
                this.values = new ArrayList<>();
418
            }
419
            this.values.add(variable);
420
            return this;
421
        }
422

    
423
        @Override
424
        public Custom add(Parameter parameter) {
425
            if (this.values == null) {
426
                this.values = new ArrayList<>();
427
            }
428
            this.values.add(parameter);
429
            return this;
430
        }
431

    
432
        @Override
433
        public String toString() {
434
            return this.toString(formatter());
435
        }
436
        
437
        @Override
438
        public String toString(Formatter<Value> formatter) {
439
            if( formatter!=null && formatter.canApply(this) ) {
440
                return formatter.format(this);
441
            }
442
            return Objects.toString(this.value, "");
443
        }
444
    }
445

    
446
    public class FunctionBase extends AbstractValue implements Function {
447

    
448
        protected String name;
449
        protected String format;
450
        protected List<Value> parameters;
451

    
452
        public FunctionBase(String name, String format) {
453
            this.name = name;
454
            this.format = format;
455
        }
456
        
457
        public FunctionBase clone() throws CloneNotSupportedException {
458
            FunctionBase other = (FunctionBase) super.clone();
459
            if (other.parameters != null) {
460
                for (int i = 0; i < parameters.size(); i++) {
461
                    Value v = (Value) parameters.get(i).clone();
462
                    other.parameters.set(i, v);
463
                }
464
            }
465

    
466
            return other;
467
        }
468

    
469
        public FunctionBase(String name) {
470
            this(name,null);
471
        }
472

    
473
        @Override
474
        public List<Value> parameters() {
475
            if (this.parameters == null) {
476
                this.parameters = new ArrayList<>();
477
            }
478
            return this.parameters;
479
        }
480

    
481
        @Override
482
        public Function format(String format) {
483
          this.format = format;
484
          return this;
485
        }
486

    
487
        @Override
488
        public Function parameter(Value parameter) {
489
            this.parameters().add(parameter);
490
            return this;
491
        }
492

    
493
        @Override
494
        public String name() {
495
            return this.name;
496
        }
497

    
498
        @Override
499
        public void accept(Visitor visitor, VisitorFilter filter) {
500
            boolean visitChildren = true;
501
            if (filter==null || filter.accept(this)) {
502
                visitor.visit(this);
503
            } else {
504
                visitChildren = !filter.skipChildren();
505
            }
506
            if(visitChildren){
507
                if( this.parameters!=null ) {
508
                    for (Value argument : this.parameters) {
509
                        if( argument!=null ) {
510
                            argument.accept(visitor, filter);
511
                        }
512
                    }
513
                }
514
            }
515
        }
516

    
517
        @Override
518
        public void replace(Value target, Value replacement) {
519
          if( this.parameters!=null ) {
520
            for (int i = 0; i < parameters.size(); i++) {
521
                Value argument = parameters.get(i);
522
                if (argument != null) {
523
                    if( argument == target ) {
524
                        parameters.set(i, replacement);
525
                    } else {
526
                        argument.replace(target, replacement);
527
                    }
528
                }
529
            }
530
          }
531
        }
532
        
533
        @Override
534
        public String toString() {
535
            return this.toString(formatter());
536
        }
537
        
538
        @Override
539
        public String toString(Formatter<Value> formatter) {
540
            if( formatter!=null && formatter.canApply(this) ) {
541
                return formatter.format(this);
542
            }
543
            if( this.format==null ) {
544
                StringBuilder builder = new StringBuilder();
545
                builder.append(name);
546
                builder.append("(");
547
                if (this.parameters != null && !this.parameters.isEmpty()) {
548
                    boolean first = true;
549
                    for (Value argument : this.parameters) {
550
                        if( first ) {
551
                            first=false;
552
                            builder.append(argument.toString(formatter));
553
                        } else {
554
                            builder.append(", ");
555
                            builder.append(argument.toString(formatter));
556
                        }
557
                    }
558
                }
559
                builder.append(")");
560
                return builder.toString();
561
            }
562
            if (this.parameters != null && !this.parameters.isEmpty()) {
563
                List<String> values = new ArrayList<>();
564
                for (Value argument : this.parameters) {
565
                    values.add(argument.toString(formatter));
566
                }
567
                return MessageFormat.format(format, values.toArray());
568
            } else {
569
                return this.format;
570
            }
571
        }
572
    }
573

    
574
    public class MethodBase extends FunctionBase implements Method {
575

    
576
        private Value instance;
577
        
578
        public MethodBase(Value instance, String name) {
579
            super(name);
580
            this.instance = instance;
581
        }
582
        
583
        public MethodBase clone() throws CloneNotSupportedException {
584
            MethodBase other = (MethodBase) super.clone();
585
            other.instance = instance.clone();
586
            return other;
587
        }
588
        
589

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

    
595
        @Override
596
        public void accept(Visitor visitor, VisitorFilter filter) {
597
            boolean visitChildren = true;
598
            if (filter==null || filter.accept(this)) {
599
                visitor.visit(this);
600
            } else {
601
                visitChildren = !filter.skipChildren();
602
            }
603
            if(visitChildren){
604
                this.instance.accept(visitor, filter);
605
            }
606
        }
607

    
608
        @Override
609
        public void replace(Value target, Value replacement) {
610
            if( this.instance == target ) {
611
                this.instance = replacement;
612
            } else {
613
                this.instance.replace(target, replacement);
614
            }
615
        }
616
        
617
        @Override
618
        public String toString(Formatter<Value> formatter) {
619
            if( formatter!=null && formatter.canApply(this) ) {
620
                return formatter.format(this);
621
            }
622
            StringBuilder builder = new StringBuilder();
623
            builder.append(this.instance.toString(formatter));
624
            builder.append("->");
625
            builder.append(this.name());
626
            builder.append("(");
627
            if (this.parameters != null && !this.parameters.isEmpty()) {
628
                boolean first = true;
629
                for (Value argument : this.parameters) {
630
                    if( first ) {
631
                        first=false;
632
                        builder.append(argument.toString(formatter));
633
                    } else {
634
                        builder.append(", ");
635
                        builder.append(argument.toString(formatter));
636
                    }
637
                }
638
            }
639
            builder.append(")");
640
            return builder.toString();
641
        }
642
    }
643

    
644
    public class BinaryOperatorBase extends FunctionBase implements BinaryOperator {
645

    
646
        private static final int LEFT = 0;
647
        private static final int RIGHT = 1;
648
        
649
        public BinaryOperatorBase(String name, String format) {
650
            super(name, format);
651
            this.parameters = new ArrayList<>();
652
            this.parameters.add(null);
653
            this.parameters.add(null);
654
        }
655

    
656
        @Override
657
        public Function parameter(Value parameter) {
658
            throw new UnsupportedOperationException("BinaryOperator can support add parameters.");
659
        }
660
        
661
        @Override
662
        public String name() {
663
            return this.name;
664
        }
665

    
666
        @Override
667
        public BinaryOperator left(Value operand) {
668
            this.parameters.set(LEFT, operand);
669
            return this;
670
        }
671

    
672
        @Override
673
        public BinaryOperator right(Value operand) {
674
            this.parameters.set(RIGHT, operand);
675
            return this;
676
        }
677

    
678
        @Override
679
        public Value left() {
680
            return this.parameters.get(LEFT);
681
        }
682

    
683
        @Override
684
        public Value right() {
685
            return this.parameters.get(RIGHT);
686
        }
687

    
688
        @Override
689
        public String toString() {
690
            return this.toString(formatter());
691
        }
692
        
693
        @Override
694
        public String toString(Formatter<Value> formatter) {
695
            if( formatter!=null && formatter.canApply(this) ) {
696
                return formatter.format(this);
697
            }
698
            if( this.format==null ) {
699
                StringBuilder builder = new StringBuilder();
700
                builder.append("(");
701
                builder.append(this.left().toString(formatter));
702
                builder.append(" ");
703
                builder.append(this.name);
704
                builder.append(" ");
705
                builder.append(this.right().toString(formatter));
706
                builder.append(")");
707
                return builder.toString();
708
            } else {
709
                return MessageFormat.format(
710
                        format,
711
                        this.left().toString(formatter),
712
                        this.right().toString(formatter)
713
                );
714
            }
715
        }
716
    }
717

    
718
    protected Value value;
719
    protected ExpressionEvaluatorManager manager;
720
    protected Formatter<ExpressionBuilder.Value> formatter;
721

    
722
    public DefaultExpressionBuilder(ExpressionEvaluatorManager manager) {
723
        this.manager = manager;
724
        this.propertiesHelper = new PropertiesSupportHelper();
725
    }
726
    
727
        @Override
728
    public Object getProperty(String name) {
729
        return this.propertiesHelper.getProperty(name);
730
    }
731

    
732
    @Override
733
    public void setProperty(String name, Object value) {
734
        this.propertiesHelper.setProperty(name, value);
735
    }
736

    
737
    @Override
738
    public Map<String, Object> getProperties() {
739
        return this.propertiesHelper.getProperties();
740
    }
741
    
742
    @Override
743
    public void setProperties(Class filter, final Object... values) {
744
        for (int i = 0; i < values.length; i+=2) {
745
              propertiesHelper.setProperty((String) values[i], values[i+1]);
746
        }
747
        this.accept(new Visitor() {
748
            @Override
749
            public void visit(Visitable v) {
750
                for (int i = 0; i < values.length; i+=2) {
751
                    ((Value)v).setProperty((String) values[i], values[i+1]);
752
                }
753
            }
754
        }, new ClassVisitorFilter(filter) );
755
    }
756
    
757
    @Override
758
    public Formatter<ExpressionBuilder.Value> formatter() {
759
      if( this.formatter == null ) {
760
        this.formatter = this.manager.getExpressionBuilderFormatter();
761
      }
762
      return this.formatter;
763
    }
764

    
765
    @Override
766
    public boolean isEmpty() {
767
        return value == null;
768
    }
769
    
770
    @Override
771
    public ExpressionBuilder createExpressionBuilder() {
772
        return new DefaultExpressionBuilder(this.manager);
773
    }
774

    
775
    @Override
776
    public Value value() {
777
        return this.value;
778
    }
779

    
780
    @Override
781
    public ExpressionBuilder value(Value value) {
782
        this.value = value;
783
        return this;
784
    }
785

    
786
    @Override
787
    public String toString() {
788
        if (this.value == null) {
789
            return "";
790
        }
791
        return this.value.toString();
792
    }
793

    
794
    @Override
795
    public String toString(Formatter<Value> formatter) {
796
        if (this.value == null) {
797
            return "";
798
        }
799
        return this.value.toString(formatter);
800
    }
801
    
802
    @Override
803
    public String build() {
804
        if (this.value == null) {
805
            return null;
806
        }
807
        return this.value.toString();
808
    }
809
    
810
    @Override
811
    public String build(Formatter<Value> formatter) {
812
        if (this.value == null) {
813
            return null;
814
        }
815
        return this.value.toString(formatter);
816
    }
817

    
818
    @Override
819
    public Value toValue(String expression) {
820
        try {
821
            Code code = ExpressionUtils.compile(expression);
822
            code.link(ExpressionUtils.createSymbolTable());
823
            return code.toValue(this);
824
        } catch(Throwable ex) {
825
            return custom(expression);
826
        }
827
    }
828

    
829
    @Override
830
    public void accept(Visitor visitor, VisitorFilter filter) {
831
        if( this.value == null) {
832
            return;
833
        }
834
        this.value.accept(visitor, filter);
835
    }
836

    
837
    @Override
838
    public String quote_for_identifiers() {
839
        return FORMAT_QUOTE_FOR_IDENTIFIERS;
840
    }
841
    
842
    @Override
843
    public String quote_for_strings() {
844
        return FORMAT_QUOTE_FOR_STRINGS;
845
    }
846
       
847
    @Override
848
    public String string(String s) {
849
        String quote = this.quote_for_strings();
850
//        No se porque no esta disponible wrapIfMissing
851
//        return StringUtils.wrapIfMissing(s,quote);
852
        if (s.startsWith(quote)) {
853
            return s;
854
        }
855
        return quote + StringUtils.replace(s,quote,quote+quote) + quote;
856
    }
857

    
858
    @Override
859
    public String identifier(String id) {
860
        String quote = this.quote_for_identifiers();
861
//        No se porque no esta disponible wrapIfMissing
862
//        return StringUtils.wrapIfMissing(id,quote);
863
        if (id.startsWith(quote)) {
864
            return id;
865
        }
866
        return quote + id + quote;
867
    }
868

    
869
    @Override
870
    public String bytearray_hex(byte[] data) {
871
        StringBuilder builder = new StringBuilder();
872
        for (byte abyte : data) {
873
            int v = abyte & 0xff;
874
            builder.append(String.format("%02x", v));
875
        }
876
        return builder.toString();
877
    }
878

    
879
    @Override
880
    public String bytearray_0x(byte[] data) {
881
        return "0x" + bytearray_hex(data);
882
    }
883

    
884
    @Override
885
    public String bytearray_x(byte[] data) {
886
        return "x'" + bytearray_hex(data) + "'";
887
    }
888
    
889

    
890
    @Override
891
    public Constant bytearray(byte[] data) {
892
        return new ConstantBase(this, data);
893
    }
894
    
895
    @Override
896
    public Variable variable(String name) {
897
        return new VariableBase(this, name);
898
    }
899

    
900
    @Override
901
    public Variable column(String name) {
902
        return new VariableBase(this, name);
903
    }
904

    
905
    @Override
906
    public Value column(String tableName, String columnName) {
907
      return getattr(tableName,columnName);
908
    }
909

    
910
    @Override
911
    public Parameter parameter(String name) {
912
        List<Parameter> parameters = this.parameters();
913
        for (Parameter parameter : parameters) {
914
            if( StringUtils.equalsIgnoreCase(name, parameter.name()) ) {
915
                return parameter;
916
            }
917
        }
918
        Parameter parameter = this.parameter();
919
        parameter.name(name);
920
        return parameter;
921
    }
922
    
923
    @Override
924
    public Parameter parameter() {
925
        return new ParameterBase();
926
    }
927
    
928
    @Override
929
    public Constant constant(Object value) {
930
        if(value == null){
931
            return VALUE_NULL;
932
        }
933
        return new ConstantBase(this, value);
934
    }
935

    
936
    @Override
937
    public Constant constant(Object value, Class theClass) {
938
      try {
939
        DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
940
        Coercion coercion = dataTypeManager.getDataType(theClass).getCoercion();
941
        return this.constant(coercion.coerce(value));
942
      } catch (Exception ex) {
943
        throw new RuntimeException("Can't coerce value ("+Objects.toString(value)+") to "+theClass.getSimpleName()+".", ex);
944
      }
945
    }
946

    
947
    @Override
948
    public Constant constant(Object value, int type) {
949
      try {
950
        DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
951
        Coercion coercion = dataTypeManager.getCoercion(type);
952
        return this.constant(coercion.coerce(value));
953
      } catch (Exception ex) {
954
        throw new RuntimeException("Can't coerce value ("+Objects.toString(value)+") to "+type+".", ex);
955
      }
956
    }
957
  
958
    @Override
959
    public Group group(Value value) {
960
        return new GroupBase(value);
961
    }
962

    
963
    @Override
964
    public Custom custom(Object value) {
965
        return new CustomBase(value);
966
    }
967

    
968
    @Override
969
    public Method method(Value instance, String name, Value... values) {
970
        MethodBase method = new MethodBase(instance, name);
971
        for (Value theValue : values) {
972
            method.parameter(theValue);
973
        }
974
        return method;
975
    }
976
    
977
    @Override
978
    public Function function(String name, Value... values) {
979
        FunctionBase func = new FunctionBase(name);
980
        for (Value theValue : values) {
981
            func.parameter(theValue);
982
        }
983
        return func;
984
    }
985

    
986
    public Function builtin_function(String name, String format, Value... values) {
987
        FunctionBase func = new FunctionBase(name, format);
988
        for (Value theValue : values) {
989
            func.parameter(theValue);
990
        }
991
        return func;
992
    }
993

    
994
    @Override
995
    public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand) {
996
        return binaryOperator(name, null, leftOperand, rightOperand);
997
    }
998
    
999
    public BinaryOperator binaryOperator(String name, String format, Value leftOperand, Value rightOperand) {
1000
        BinaryOperator operator = new BinaryOperatorBase(name, format);
1001
        operator.left(leftOperand);
1002
        operator.right(rightOperand);
1003
        return operator;
1004
    }
1005

    
1006
    @Override
1007
    public List<Variable> variables() {
1008
        final Set<Variable> vars = new HashSet<>();
1009
        this.accept((Visitable value1) -> {
1010
          if (!vars.contains((Variable) value1)) {
1011
            vars.add((Variable) value1);
1012
          }
1013
        }, new ClassVisitorFilter(Variable.class));
1014
        List<Variable> lvars = new ArrayList<>(vars);
1015
        Collections.sort(lvars);
1016
        return lvars;
1017
    }
1018

    
1019
    @Override
1020
    public List<Parameter> parameters() {
1021
        final List<Parameter>  params = new ArrayList<>();
1022
        this.accept((Visitable value1) -> {
1023
          params.add((Parameter) value1);
1024
        }, new ClassVisitorFilter(Parameter.class));
1025
        return params;
1026
    }
1027
    
1028
    @Override
1029
    public List<String> parameters_names() {
1030
        List<String> params = new ArrayList<>();
1031
        for (Parameter param : parameters()) {
1032
            Object theValue = param.value();
1033
            String s;
1034
            switch(param.type()) {
1035
                case PARAMETER_TYPE_CONSTANT:
1036
                    if( theValue==null ) {
1037
                        s = "NULL";
1038
                    } else if( theValue instanceof String ) {
1039
                        s = "'" + (String)theValue + "'";
1040
                        
1041
                    } else if( theValue instanceof byte[] ) {
1042
                        s = bytearray_0x((byte[]) theValue);
1043
                        
1044
                    } else {
1045
                        s = theValue.toString();
1046
                    }    
1047
                    break;
1048
                case PARAMETER_TYPE_VARIABLE:
1049
                default:
1050
                    s = "\"" + param.name() + "\"";
1051
            }
1052
//            if( !params.contains(s) ) { // Ojo que deben ir todos, incluso duplicados.
1053
                params.add(s);
1054
//            }
1055
        }
1056
        // Collections.sort(params); Ojo, no deben ordenarse.
1057
        return params;
1058
    }
1059
    
1060
    @Override
1061
    public List<String> variables_names() {
1062
        List<String> vars = new ArrayList<>();
1063
        for (Variable var : this.variables()) {
1064
            vars.add(var.name());
1065
        }
1066
        Collections.sort(vars);
1067
        return vars;
1068
    }
1069
    
1070
    @Override
1071
    public ExpressionBuilder set(Value value) {
1072
        this.value = value;
1073
        return this;
1074
    }
1075

    
1076
    @Override
1077
    public ExpressionBuilder and(Value value) {
1078
        if (this.value == null) {
1079
            return this.set(value);
1080
        }
1081
        BinaryOperator operator = binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, this.value, value);
1082
        this.value = operator;
1083
        return this;
1084
    }
1085

    
1086
    @Override
1087
    public ExpressionBuilder or(Value value) {
1088
        if (this.value == null) {
1089
            return this.set(value);
1090
        }
1091
        BinaryOperator operator = binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, this.value, value);
1092
        this.value = operator;
1093
        return this;
1094
    }
1095

    
1096
    @Override
1097
    public Function is_null(Value value) {
1098
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
1099
    }
1100

    
1101
    @Override
1102
    public Function not_is_null(Value value) {
1103
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
1104
    }
1105

    
1106
    @Override
1107
    public Function not(Value value) {
1108
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
1109
    }
1110

    
1111
    @Override
1112
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
1113
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
1114
    }
1115

    
1116
    @Override
1117
    public BinaryOperator and(Expression leftOperand, Expression rightOperand) {
1118
        return binaryOperator(
1119
                OPERATOR_AND, 
1120
                FORMAT_OPERATOR_AND, 
1121
                leftOperand.getCode().toValue(), 
1122
                rightOperand.getCode().toValue()
1123
        );
1124
    }
1125

    
1126
    @Override
1127
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
1128
        return binaryOperator(
1129
                OPERATOR_AND, 
1130
                FORMAT_OPERATOR_AND, 
1131
                leftOperand.getCode().toValue(), 
1132
                rightOperand
1133
        );
1134
    }
1135

    
1136
    @Override
1137
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
1138
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
1139
    }
1140

    
1141
    @Override
1142
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
1143
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
1144
    }
1145

    
1146
    @Override
1147
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
1148
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
1149
    }
1150

    
1151
    @Override
1152
    public BinaryOperator gt(Value op1, Value op2) {
1153
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
1154
    }
1155

    
1156
    @Override
1157
    public BinaryOperator ge(Value op1, Value op2) {
1158
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
1159
    }
1160

    
1161
    @Override
1162
    public BinaryOperator lt(Value op1, Value op2) {
1163
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
1164
    }
1165

    
1166
    @Override
1167
    public BinaryOperator le(Value op1, Value op2) {
1168
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
1169
    }
1170

    
1171
    @Override
1172
    public BinaryOperator like(Value op1, Value op2) {
1173
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
1174
    }
1175

    
1176
    @Override
1177
    public BinaryOperator ilike(Value op1, Value op2) {
1178
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
1179
    }
1180

    
1181
    @Override
1182
    public BinaryOperator add(Value op1, Value op2) {
1183
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1184
    }
1185

    
1186
    @Override
1187
    public BinaryOperator subst(Value op1, Value op2) {
1188
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1189
    }
1190

    
1191
    @Override
1192
    public BinaryOperator mult(Value op1, Value op2) {
1193
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1194
    }
1195

    
1196
    @Override
1197
    public BinaryOperator div(Value op1, Value op2) {
1198
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1199
    }
1200

    
1201
    @Override
1202
    public Function concat(Value... values) {
1203
        if( values.length==2 ) {
1204
            return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, values[0], values[1]);
1205
        }
1206
        FunctionBase func = new FunctionBase(FUNCTION_CONCAT);
1207
        for (Value theValue : values) {
1208
            func.parameter(theValue);
1209
        }
1210
        return func;        
1211
    }
1212

    
1213
    @Override
1214
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1215
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1216
    }
1217

    
1218
    @Override
1219
    public Function ifnull(Value value, Value iftrue, Value iffalse) {
1220
        return function(FUNCTION_IFNULL, value, iftrue, iffalse);
1221
    }
1222
    
1223
    @Override
1224
    public Function left(Value str, Value size) {
1225
       return function(FUNCTION_LEFT, str, size);
1226
    }
1227
    
1228
    @Override
1229
    public Function right(Value str, Value len) {
1230
       return function(FUNCTION_RIGHT, str, len);
1231
    }
1232
    
1233
    @Override
1234
    public Function locate(Value search, Value str, Value start) {
1235
       return function(FUNCTION_LOCATE, search, str, start);
1236
    }
1237
    
1238
    @Override
1239
    public Function position(Value search, Value str) {
1240
       return function(FUNCTION_POSITION, search, str);
1241
    }
1242
    
1243
    @Override
1244
    public Function lpad(Value str, Value len, Value padstr) {
1245
       return function(FUNCTION_LPAD, str, len, padstr);
1246
    }
1247
    
1248
    @Override
1249
    public Function rpad(Value str, Value len, Value padstr) {
1250
       return function(FUNCTION_RPAD, str, len, padstr);
1251
    }
1252
    
1253
    @Override
1254
    public Function ltrim(Value str) {
1255
       return function(FUNCTION_LTRIM, str);
1256
    }
1257
    
1258
    @Override
1259
    public Function rtrim(Value str) {
1260
       return function(FUNCTION_RTRIM, str);
1261
    }
1262
    
1263
    @Override
1264
    public Function trim(Value str) {
1265
       return function(FUNCTION_TRIM, str);
1266
    }
1267
    
1268
    @Override
1269
    public Function repeat(Value str, Value size) {
1270
       return function(FUNCTION_REPEAT, str, size);
1271
    }
1272
    
1273
    @Override
1274
    public Function replace(Value str, Value search, Value replstr) {
1275
       return function(FUNCTION_REPLACE, str, search, replstr);
1276
    }
1277
    
1278
    @Override
1279
    public Function ascii(Value str) {
1280
       return function(FUNCTION_ASCII, str);
1281
    }
1282
    
1283
    @Override
1284
    public Function lenght(Value str) {
1285
       return function(FUNCTION_LENGHT, str);
1286
    }
1287

    
1288
    @Override
1289
    public Function instr(Value str, Value search, Value start) {
1290
       return function(FUNCTION_INSTR, str, search, start);
1291
    }
1292
    
1293
    @Override
1294
    public Function lower(Value str) {
1295
       return function(FUNCTION_LOWER, str);
1296
    }
1297
    
1298
    @Override
1299
    public Function upper(Value str) {
1300
       return function(FUNCTION_UPPER, str);
1301
    }
1302
    
1303
    @Override
1304
    public Function space(Value size) {
1305
       return function(FUNCTION_SPACE, size);
1306
    }
1307
    
1308
    @Override
1309
    public Function substring(Value str, Value start, Value len) {
1310
       return function(FUNCTION_SUBSTRING, str, start, len);
1311
    }
1312
    
1313
    @Override
1314
    public Function acos(Value num) {
1315
       return function(FUNCTION_ACOS, num);
1316
    } 
1317
    
1318
    @Override
1319
    public Function asin(Value num) {
1320
       return function(FUNCTION_ASIN, num);
1321
    }
1322
    
1323
    @Override
1324
    public Function atan(Value num) {
1325
       return function(FUNCTION_ATAN, num);
1326
    }
1327
    
1328
    @Override
1329
    public Function cos(Value num) {
1330
       return function(FUNCTION_COS, num);
1331
    }
1332
    
1333
    @Override
1334
    public Function cosh(Value num) {
1335
       return function(FUNCTION_COSH, num);
1336
    }
1337
    
1338
    @Override
1339
    public Function cot(Value num) {
1340
       return function(FUNCTION_COT, num);
1341
    }  
1342
    
1343
    @Override
1344
    public Function bitand(Value num1, Value num2) {
1345
       return function(FUNCTION_BITAND, num1, num2);
1346
    } 
1347
    
1348
    @Override
1349
    public Function bitor(Value num1, Value num2) {
1350
       return function(FUNCTION_BITOR, num1, num2);
1351
    }
1352
    
1353
    @Override
1354
    public Function bitxor(Value num1, Value num2) {
1355
       return function(FUNCTION_BITXOR, num1, num2);
1356
    }
1357
    
1358
    @Override
1359
    public Function ceil(Value num) {
1360
       return function(FUNCTION_CEIL, num);
1361
    }
1362
    
1363
    @Override
1364
    public Function degrees(Value num) {
1365
       return function(FUNCTION_DEGREES, num);
1366
    }  
1367
    
1368
    @Override
1369
    public Function exp(Value num) {
1370
       return function(FUNCTION_EXP, num);
1371
    }  
1372
    
1373
    @Override
1374
    public Function floor(Value num) {
1375
       return function(FUNCTION_FLOOR, num);
1376
    }  
1377
    
1378
    @Override
1379
    public Function log(Value num) {
1380
       return function(FUNCTION_LOG, num);
1381
    }  
1382
    
1383
    @Override
1384
    public Function log10(Value num) {
1385
       return function(FUNCTION_LOG10, num);
1386
    }  
1387
    
1388
    @Override
1389
    public Function pi() {
1390
       return function(FUNCTION_PI);
1391
    }
1392
    
1393
    @Override
1394
    public Function abs(Value num) {
1395
       return function(FUNCTION_ABS, num);
1396
    }
1397
    
1398
    @Override
1399
    public Function power(Value num) {
1400
       return function(FUNCTION_POWER, num);
1401
    }
1402
    
1403
    @Override
1404
    public Function radians(Value num) {
1405
       return function(FUNCTION_RADIANS, num);
1406
    }
1407
    
1408
    @Override
1409
    public Function rand(Value num) {
1410
       return function(FUNCTION_RAND, num);
1411
    }
1412
    
1413
    @Override
1414
    public Function round(Value num) {
1415
       return function(FUNCTION_ROUND, num);
1416
    }
1417
    
1418
    @Override
1419
    public Function sqrt(Value num) {
1420
       return function(FUNCTION_SQRT, num);
1421
    }
1422
    
1423
    @Override
1424
    public Function sign(Value num) {
1425
       return function(FUNCTION_SIGN, num);
1426
    }
1427
    
1428
    @Override
1429
    public Function sin(Value num) {
1430
       return function(FUNCTION_SIN, num);
1431
    }
1432
    
1433
    @Override
1434
    public Function sinh(Value num) {
1435
       return function(FUNCTION_SINH, num);
1436
    }
1437
    
1438
    @Override
1439
    public Function tan(Value num) {
1440
       return function(FUNCTION_TAN, num);
1441
    }
1442
    @Override
1443
    public Function tanh(Value num) {
1444
       return function(FUNCTION_TANH, num);
1445
    }  
1446
    
1447
    @Override
1448
    public Function zero() {
1449
       return function(FUNCTION_ZERO);
1450
    }
1451
    
1452
    @Override
1453
    public Function chr(Value num) {
1454
       return function(FUNCTION_CHR, num);
1455
    }    
1456

    
1457
    @Override
1458
    public Function cast(Value object, Value typeName) {
1459
       return function(FUNCTION_CAST, object, typeName);
1460
    }    
1461

    
1462
    @Override
1463
    public Function decode(Value value, Value format) {
1464
       return function(FUNCTION_DECODE, value, format);
1465
    }    
1466

    
1467
    @Override
1468
    public Function toDouble(Value num) {
1469
       return function(FUNCTION_TODOUBLE, num);
1470
    }    
1471

    
1472
    @Override
1473
    public Function toFloat(Value num) {
1474
       return function(FUNCTION_TOFLOAT, num);
1475
    }    
1476

    
1477
    @Override
1478
    public Function toLong(Value num) {
1479
       return function(FUNCTION_TOLONG, num);
1480
    }    
1481

    
1482
    @Override
1483
    public Function toInteger(Value num) {
1484
       return function(FUNCTION_TOINTEGER, num);
1485
    }    
1486

    
1487
    @Override
1488
    public Function toStr(Value object) {
1489
       return function(FUNCTION_TOSTR, object);
1490
    }    
1491

    
1492
    @Override
1493
    public Function list() {
1494
        return function(FUNCTION_LIST);
1495
    }
1496

    
1497
    @Override
1498
    public Function tuple() {
1499
        return function(FUNCTION_TUPLE);
1500
    }
1501

    
1502
    @Override
1503
    public Function tuple(Object... values) {
1504
        Function fn = function(FUNCTION_TUPLE);
1505
        for (Object theValue : values) {
1506
            if( theValue instanceof ExpressionBuilder.Value ) {
1507
              fn.parameter((Value) theValue);
1508
            } else {
1509
              fn.parameter(constant(theValue));
1510
            }
1511
        }
1512
        return fn;
1513
    }
1514
    
1515
    @Override
1516
    public String repr(Object value) {
1517
        return this.manager.getReprMethod(value).repr(value);
1518
    }
1519

    
1520
  @Override
1521
  public Function getattr(String objectId, String attributeId) {
1522
        Function fn = function(FUNCTION_GETATTR);
1523
        fn.parameter(variable(objectId));
1524
        fn.parameter(variable(attributeId));
1525
        return fn;
1526
  }
1527

    
1528
  @Override
1529
  public Function date(Date date) {
1530
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1531
    return function(FUNCTION_DATE, constant(df.format(date)));
1532
  }
1533

    
1534
  @Override
1535
  public Function time(Date time) {
1536
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1537
    return function(FUNCTION_TIME, constant(df.format(time)));
1538
  }
1539

    
1540
  @Override
1541
  public Function timestamp(Date timestamp) {
1542
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1543
    return function(FUNCTION_TIMESTAMP, constant(df.format(timestamp)));
1544
  }
1545

    
1546
  @Override
1547
  public Function date(String date) {
1548
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1549
    Date d;
1550
    try {
1551
      d = df.parse(date);
1552
    } catch (ParseException ex) {
1553
      throw new IllegalArgumentException("Can't parse argument '"+date+"' as date.", ex);
1554
    }
1555
    return function(FUNCTION_DATE, constant(df.format(d)));
1556
  }
1557

    
1558
  @Override
1559
  public Function time(String time) {
1560
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1561
    Date t;
1562
    try {
1563
      t = df.parse(time);
1564
    } catch (ParseException ex) {
1565
      throw new IllegalArgumentException("Can't parse argument '"+time+"' as date.", ex);
1566
    }
1567
    return function(FUNCTION_TIME, constant(df.format(t)));
1568
  }
1569

    
1570
  @Override
1571
  public Function timestamp(String timestamp) {
1572
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1573
    Date ts;
1574
    try {
1575
      ts = df.parse(timestamp);
1576
    } catch (ParseException ex) {
1577
      throw new IllegalArgumentException("Can't parse argument '"+timestamp+"' as date.", ex);
1578
    }
1579
    return function(FUNCTION_TIMESTAMP, constant(df.format(ts)));
1580
  }
1581

    
1582
  @Override
1583
  public Function color(Color color) {
1584
    return function(FUNCTION_COLOR, constant(color.getRed()), constant(color.getGreen()), constant(color.getBlue()), constant(color.getAlpha()));
1585
  }
1586

    
1587
  @Override
1588
  public Function color(Value red, Value green, Value blue, Value alfa) {
1589
    return function(FUNCTION_COLOR, red, green, blue, alfa);
1590
  }
1591

    
1592
  @Override
1593
  public Function date(Value date) {
1594
    return function(FUNCTION_DATE, date);
1595
  }
1596

    
1597
  @Override
1598
  public Function time(Value time) {
1599
    return function(FUNCTION_TIME, time);
1600
  }
1601

    
1602
  @Override
1603
  public Function timestamp(Value timestamp) {
1604
    return function(FUNCTION_TIMESTAMP, timestamp);
1605
  }
1606

    
1607
  @Override
1608
  public Function current_date() {
1609
    return function(FUNCTION_CURRENT_DATE);
1610
  }
1611

    
1612
  @Override
1613
  public Function current_time() {
1614
    return function(FUNCTION_CURRENT_TIME);
1615
  }
1616

    
1617
  @Override
1618
  public Function current_timestamp() {
1619
    return function(FUNCTION_CURRENT_TIMESTAMP);
1620
  }
1621

    
1622
  @Override
1623
  public Function date_add(Value datefield, Value valueToAdd, Value date) {
1624
    return function(FUNCTION_DATEADD, datefield, valueToAdd, date);
1625
  }
1626
  
1627
  @Override
1628
  public Function let(String name, Value value) {
1629
    return function(FUNCTION_LET, this.variable(name), value);
1630
  }
1631

    
1632
  @Override
1633
  public Function date_diff(Value datefield, Value valueToSubst, Value date) {
1634
    return function(FUNCTION_DATEDIFF, datefield, valueToSubst, date);
1635
  }
1636

    
1637
  @Override
1638
  public Function to_date(Value date, Value format) {
1639
    return function(FUNCTION_TO_DATE, date, format);
1640
  }
1641

    
1642
  @Override
1643
  public Function to_timestamp(Value timestamp, Value format) {
1644
    return function(FUNCTION_TO_TIMESTAMP, timestamp, format);
1645
  }
1646

    
1647
  @Override
1648
  public Function extract(Value datefield, Value source) {
1649
    return function(FUNCTION_EXTRACT, datefield, source);
1650
  }
1651
  
1652
}