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

History | View | Annotate | Download (48 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
            super.accept(visitor, filter);
89
            this.value.accept(visitor, filter);
90
        }
91

    
92
        @Override
93
        public void replace(Value target, Value replacement) {
94
            if( this.value == target ) {
95
                this.value = replacement;
96
            } else {
97
                this.value.replace(target, replacement);
98
            }
99
        }
100

    
101
        @Override
102
        public String toString() {
103
            return this.toString(formatter());
104
        }
105
        
106
        @Override
107
        public String toString(Formatter<Value> formatter) {
108
            if( formatter!=null && formatter.canApply(this) ) {
109
                return formatter.format(this);
110
            }
111
            return MessageFormat.format(FORMAT_GROUP, this.value.toString());
112
        }
113
    }
114

    
115
    public class VariableBase extends AbstractValue implements Variable {
116

    
117
        protected String name;
118
        protected ExpressionBuilder builder;
119
        
120
        public VariableBase(ExpressionBuilder builder, String name) {
121
            this.name = name;
122
            this.builder = builder;
123
        }
124
        
125
        public VariableBase clone() throws CloneNotSupportedException {
126
            VariableBase other = (VariableBase) super.clone();
127
            return other;
128
        }    
129

    
130
        @Override
131
        public String name() {
132
            return this.name;
133
        }
134

    
135
        @Override
136
        public String toString() {
137
            return this.toString(formatter());
138
        }
139
        
140
        @Override
141
        public String toString(Formatter<Value> formatter) {
142
            if( formatter!=null && formatter.canApply(this) ) {
143
                return formatter.format(this);
144
            }
145
            return this.builder.identifier(this.name);
146
        }
147

    
148
        @Override
149
        public int compareTo(Variable o) {
150
            return this.name.compareTo(o.name());
151
        }
152

    
153
        @Override
154
        public boolean equals(Object obj) {
155
            if (!(obj instanceof Variable)) {
156
                return false;
157
            }
158
            return this.name.equals(((Variable) obj).name());
159
        }
160

    
161
        @Override
162
        public int hashCode() {
163
            int hash = 7;
164
            hash = 37 * hash + Objects.hashCode(this.name);
165
            return hash;
166
        }
167
    }
168

    
169
    public class ParameterBase extends AbstractValue implements Parameter {
170

    
171
        protected String name;
172
        protected Object value;
173
        protected int type;
174

    
175
        public ParameterBase() {
176
            this.type = PARAMETER_TYPE_CONSTANT;
177
            this.name = null;
178
            this.value = null;
179
        }
180
        
181
        public ParameterBase clone() throws CloneNotSupportedException {
182
            ParameterBase other = (ParameterBase) super.clone();
183
            return other;
184
        }     
185

    
186
        @Override
187
        public Parameter as_constant() {
188
            this.type = PARAMETER_TYPE_CONSTANT;
189
            if (this.value == null && this.name != null) {
190
                this.value = this.name;
191
            }
192
            return this;
193
        }
194

    
195
        @Override
196
        public Parameter as_variable() {
197
            this.type = PARAMETER_TYPE_VARIABLE;
198
            if (this.value != null && this.name == null) {
199
                this.name = (String) this.value;
200
            }
201
            return this;
202
        }
203
        
204
        @Override
205
        public String name() {
206
            switch (this.type) {
207
                case PARAMETER_TYPE_VARIABLE:
208
                    return this.name;
209
                case PARAMETER_TYPE_CONSTANT:
210
                    if (this.value == null) {
211
                        return null;
212
                    }
213
                    return this.value.toString();
214
                default:
215
                    if (this.name != null) {
216
                        return this.name;
217
                    }
218
                    if (this.value != null) {
219
                        return this.value.toString();
220
                    }
221
                    return null;
222
            }
223
        }
224

    
225
        @Override
226
        public int type() {
227
            return this.type;
228
        }
229

    
230
        @Override
231
        public boolean is_constant() {
232
            return this.type == PARAMETER_TYPE_CONSTANT;
233
        }
234

    
235
        @Override
236
        public boolean is_variable() {
237
            return this.type == PARAMETER_TYPE_VARIABLE;
238
        }
239

    
240
        @Override
241
        public Parameter value(Object value) {
242
            this.value = value;
243
            return this;
244
        }
245

    
246
        @Override
247
        public Parameter name(String name) {
248
            this.type = PARAMETER_TYPE_VARIABLE;
249
            this.name = name;
250
            return this;
251
        }
252

    
253
        @Override
254
        public Object value() {
255
            try {
256
                switch (this.type) {
257
                    case PARAMETER_TYPE_CONSTANT:
258
                        return this.value;
259
                    case PARAMETER_TYPE_VARIABLE:
260
                    default:
261
                        return this.value;
262
                }
263
            } catch (Exception ex) {
264
                throw new RuntimeException("Can't get value from parameter.", ex);
265
            }
266
        }
267

    
268
        @Override
269
        public String toString() {
270
            return this.toString(formatter());
271
        }
272
        
273
        @Override
274
        public String toString(Formatter<Value> formatter) {
275
            if( formatter!=null && formatter.canApply(this) ) {
276
                return formatter.format(this);
277
            }
278
            switch (this.type) {
279
                case PARAMETER_TYPE_CONSTANT:
280
                    return Objects.toString(this.value);
281
                    
282
                case PARAMETER_TYPE_VARIABLE:
283
                default:
284
                    return "?";
285
            }
286
        }
287
    }
288

    
289
    public class ConstantBase extends AbstractValue implements Constant {
290

    
291
        protected Object value;
292
        protected ExpressionBuilder builder;
293
        
294
        public ConstantBase(ExpressionBuilder builder, Object value) {
295
            this.value = value;
296
            this.builder = builder;
297
        }
298

    
299
        public Constant clone() throws CloneNotSupportedException {
300
            ConstantBase other = (ConstantBase) super.clone();
301
            return other;
302
        }
303
        
304
        @Override
305
        public Object value() {
306
            return this.value;
307
        }
308

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

    
346
    public class CustomBase extends AbstractValue implements Custom {
347

    
348
        protected Object value;
349

    
350
        // Esto es para permitir declarar parametros y columnas en una seccion
351
        // custom.
352
        protected List<Value> values;
353

    
354
        public CustomBase(Object value) {
355
            this.value = value;
356
        }
357
        
358
        public Custom clone() throws CloneNotSupportedException {
359
            CustomBase other = (CustomBase) super.clone();
360
            if(other.values!=null) {
361
                for (int i = 0; i < values.size(); i++) {
362
                    Value v = (Value) values.get(i).clone();
363
                    other.values.set(i, v);
364
                }
365
            }
366
            
367
            return other;
368
        }
369

    
370
        @Override
371
        public void accept(Visitor visitor, VisitorFilter filter) {
372
            super.accept(visitor, filter);
373
            if (this.values != null) {
374
                for (Value theValue : values) {
375
                    theValue.accept(visitor, filter);
376
                }
377
            }
378
        }
379

    
380
        @Override
381
        public void replace(Value target, Value replacement) {
382
            if( this.values == null ) {
383
                return;
384
            }
385
            for (int i = 0; i < values.size(); i++) {
386
                Value theValue = values.get(i);
387
                if( target == theValue ) {
388
                    values.set(i, replacement);
389
                } else {
390
                    theValue.replace(target, replacement);
391
                }
392
            }
393
        }
394

    
395
        @Override
396
        public Object value() {
397
            return this.value;
398
        }
399

    
400
        @Override
401
        public Custom add(Variable variable) {
402
            if (this.values == null) {
403
                this.values = new ArrayList<>();
404
            }
405
            this.values.add(variable);
406
            return this;
407
        }
408

    
409
        @Override
410
        public Custom add(Parameter parameter) {
411
            if (this.values == null) {
412
                this.values = new ArrayList<>();
413
            }
414
            this.values.add(parameter);
415
            return this;
416
        }
417

    
418
        @Override
419
        public String toString() {
420
            return this.toString(formatter());
421
        }
422
        
423
        @Override
424
        public String toString(Formatter<Value> formatter) {
425
            if( formatter!=null && formatter.canApply(this) ) {
426
                return formatter.format(this);
427
            }
428
            return Objects.toString(this.value, "");
429
        }
430
    }
431

    
432
    public class FunctionBase extends AbstractValue implements Function {
433

    
434
        protected String name;
435
        protected String format;
436
        protected List<Value> parameters;
437

    
438
        public FunctionBase(String name, String format) {
439
            this.name = name;
440
            this.format = format;
441
        }
442
        
443
        public FunctionBase clone() throws CloneNotSupportedException {
444
            FunctionBase other = (FunctionBase) super.clone();
445
            if (other.parameters != null) {
446
                for (int i = 0; i < parameters.size(); i++) {
447
                    Value v = (Value) parameters.get(i).clone();
448
                    other.parameters.set(i, v);
449
                }
450
            }
451

    
452
            return other;
453
        }
454

    
455
        public FunctionBase(String name) {
456
            this(name,null);
457
        }
458

    
459
        @Override
460
        public List<Value> parameters() {
461
            if (this.parameters == null) {
462
                this.parameters = new ArrayList<>();
463
            }
464
            return this.parameters;
465
        }
466

    
467
        @Override
468
        public Function format(String format) {
469
          this.format = format;
470
          return this;
471
        }
472

    
473
        @Override
474
        public Function parameter(Value parameter) {
475
            this.parameters().add(parameter);
476
            return this;
477
        }
478

    
479
        @Override
480
        public String name() {
481
            return this.name;
482
        }
483

    
484
        @Override
485
        public void accept(Visitor visitor, VisitorFilter filter) {
486
            super.accept(visitor, filter);
487
            if( this.parameters!=null ) {
488
                for (Value argument : this.parameters) {
489
                    if( argument!=null ) {
490
                        argument.accept(visitor, filter);
491
                    }
492
                }
493
            }
494
        }
495

    
496
        @Override
497
        public void replace(Value target, Value replacement) {
498
          if( this.parameters!=null ) {
499
            for (int i = 0; i < parameters.size(); i++) {
500
                Value argument = parameters.get(i);
501
                if (argument != null) {
502
                    if( argument == target ) {
503
                        parameters.set(i, replacement);
504
                    } else {
505
                        argument.replace(target, replacement);
506
                    }
507
                }
508
            }
509
          }
510
        }
511
        
512
        @Override
513
        public String toString() {
514
            return this.toString(formatter());
515
        }
516
        
517
        @Override
518
        public String toString(Formatter<Value> formatter) {
519
            if( formatter!=null && formatter.canApply(this) ) {
520
                return formatter.format(this);
521
            }
522
            if( this.format==null ) {
523
                StringBuilder builder = new StringBuilder();
524
                builder.append(name);
525
                builder.append("(");
526
                if (this.parameters != null && !this.parameters.isEmpty()) {
527
                    boolean first = true;
528
                    for (Value argument : this.parameters) {
529
                        if( first ) {
530
                            first=false;
531
                            builder.append(argument.toString(formatter));
532
                        } else {
533
                            builder.append(", ");
534
                            builder.append(argument.toString(formatter));
535
                        }
536
                    }
537
                }
538
                builder.append(")");
539
                return builder.toString();
540
            }
541
            if (this.parameters != null && !this.parameters.isEmpty()) {
542
                List<String> values = new ArrayList<>();
543
                for (Value argument : this.parameters) {
544
                    values.add(argument.toString(formatter));
545
                }
546
                return MessageFormat.format(format, values.toArray());
547
            } else {
548
                return this.format;
549
            }
550
        }
551
    }
552

    
553
    public class MethodBase extends FunctionBase implements Method {
554

    
555
        private Value instance;
556
        
557
        public MethodBase(Value instance, String name) {
558
            super(name);
559
            this.instance = instance;
560
        }
561
        
562
        public MethodBase clone() throws CloneNotSupportedException {
563
            MethodBase other = (MethodBase) super.clone();
564
            other.instance = instance.clone();
565
            return other;
566
        }
567
        
568

    
569
        @Override
570
        public Value instance() {
571
            return this.instance;
572
        }
573

    
574
        @Override
575
        public void accept(Visitor visitor, VisitorFilter filter) {
576
            this.instance.accept(visitor, filter);
577
            super.accept(visitor, filter);
578
        }
579

    
580
        @Override
581
        public void replace(Value target, Value replacement) {
582
            if( this.instance == target ) {
583
                this.instance = replacement;
584
            } else {
585
                this.instance.replace(target, replacement);
586
            }
587
        }
588
        
589
        @Override
590
        public String toString(Formatter<Value> formatter) {
591
            if( formatter!=null && formatter.canApply(this) ) {
592
                return formatter.format(this);
593
            }
594
            StringBuilder builder = new StringBuilder();
595
            builder.append(this.instance.toString(formatter));
596
            builder.append("->");
597
            builder.append(this.name());
598
            builder.append("(");
599
            if (this.parameters != null && !this.parameters.isEmpty()) {
600
                boolean first = true;
601
                for (Value argument : this.parameters) {
602
                    if( first ) {
603
                        first=false;
604
                        builder.append(argument.toString(formatter));
605
                    } else {
606
                        builder.append(", ");
607
                        builder.append(argument.toString(formatter));
608
                    }
609
                }
610
            }
611
            builder.append(")");
612
            return builder.toString();
613
        }
614
    }
615

    
616
    public class BinaryOperatorBase extends FunctionBase implements BinaryOperator {
617

    
618
        private static final int LEFT = 0;
619
        private static final int RIGHT = 1;
620
        
621
        public BinaryOperatorBase(String name, String format) {
622
            super(name, format);
623
            this.parameters = new ArrayList<>();
624
            this.parameters.add(null);
625
            this.parameters.add(null);
626
        }
627

    
628
        @Override
629
        public Function parameter(Value parameter) {
630
            throw new UnsupportedOperationException("BinaryOperator can support add parameters.");
631
        }
632
        
633
        @Override
634
        public String name() {
635
            return this.name;
636
        }
637

    
638
        @Override
639
        public BinaryOperator left(Value operand) {
640
            this.parameters.set(LEFT, operand);
641
            return this;
642
        }
643

    
644
        @Override
645
        public BinaryOperator right(Value operand) {
646
            this.parameters.set(RIGHT, operand);
647
            return this;
648
        }
649

    
650
        @Override
651
        public Value left() {
652
            return this.parameters.get(LEFT);
653
        }
654

    
655
        @Override
656
        public Value right() {
657
            return this.parameters.get(RIGHT);
658
        }
659

    
660
        @Override
661
        public String toString() {
662
            return this.toString(formatter());
663
        }
664
        
665
        @Override
666
        public String toString(Formatter<Value> formatter) {
667
            if( formatter!=null && formatter.canApply(this) ) {
668
                return formatter.format(this);
669
            }
670
            if( this.format==null ) {
671
                StringBuilder builder = new StringBuilder();
672
                builder.append("(");
673
                builder.append(this.left().toString(formatter));
674
                builder.append(" ");
675
                builder.append(this.name);
676
                builder.append(" ");
677
                builder.append(this.right().toString(formatter));
678
                builder.append(")");
679
                return builder.toString();
680
            } else {
681
                return MessageFormat.format(
682
                        format,
683
                        this.left().toString(formatter),
684
                        this.right().toString(formatter)
685
                );
686
            }
687
        }
688
    }
689

    
690
    protected Value value;
691
    protected ExpressionEvaluatorManager manager;
692
    protected Formatter<ExpressionBuilder.Value> formatter;
693

    
694
    public DefaultExpressionBuilder(ExpressionEvaluatorManager manager) {
695
        this.manager = manager;
696
        this.propertiesHelper = new PropertiesSupportHelper();
697
    }
698
    
699
        @Override
700
    public Object getProperty(String name) {
701
        return this.propertiesHelper.getProperty(name);
702
    }
703

    
704
    @Override
705
    public void setProperty(String name, Object value) {
706
        this.propertiesHelper.setProperty(name, value);
707
    }
708

    
709
    @Override
710
    public Map<String, Object> getProperties() {
711
        return this.propertiesHelper.getProperties();
712
    }
713
    
714
    @Override
715
    public void setProperties(Class filter, final Object... values) {
716
        for (int i = 0; i < values.length; i+=2) {
717
              propertiesHelper.setProperty((String) values[i], values[i+1]);
718
        }
719
        this.accept(new Visitor() {
720
            @Override
721
            public void visit(Visitable v) {
722
                for (int i = 0; i < values.length; i+=2) {
723
                    ((Value)v).setProperty((String) values[i], values[i+1]);
724
                }
725
            }
726
        }, new ClassVisitorFilter(filter) );
727
    }
728
    
729
    @Override
730
    public Formatter<ExpressionBuilder.Value> formatter() {
731
      if( this.formatter == null ) {
732
        this.formatter = this.manager.getExpressionBuilderFormatter();
733
      }
734
      return this.formatter;
735
    }
736

    
737
    @Override
738
    public boolean isEmpty() {
739
        return value == null;
740
    }
741
    
742
    @Override
743
    public ExpressionBuilder createExpressionBuilder() {
744
        return new DefaultExpressionBuilder(this.manager);
745
    }
746

    
747
    @Override
748
    public Value value() {
749
        return this.value;
750
    }
751

    
752
    @Override
753
    public ExpressionBuilder value(Value value) {
754
        this.value = value;
755
        return this;
756
    }
757

    
758
    @Override
759
    public String toString() {
760
        if (this.value == null) {
761
            return "";
762
        }
763
        return this.value.toString();
764
    }
765

    
766
    @Override
767
    public String toString(Formatter<Value> formatter) {
768
        if (this.value == null) {
769
            return "";
770
        }
771
        return this.value.toString(formatter);
772
    }
773
    
774
    @Override
775
    public String build() {
776
        if (this.value == null) {
777
            return null;
778
        }
779
        return this.value.toString();
780
    }
781
    
782
    @Override
783
    public String build(Formatter<Value> formatter) {
784
        if (this.value == null) {
785
            return null;
786
        }
787
        return this.value.toString(formatter);
788
    }
789

    
790
    @Override
791
    public Value toValue(String expression) {
792
        try {
793
            Code code = ExpressionUtils.compile(expression);
794
            return code.toValue(this);
795
        } catch(Throwable ex) {
796
            return custom(expression);
797
        }
798
    }
799

    
800
    @Override
801
    public void accept(Visitor visitor, VisitorFilter filter) {
802
        if( this.value == null) {
803
            return;
804
        }
805
        this.value.accept(visitor, filter);
806
    }
807

    
808
    @Override
809
    public String quote_for_identifiers() {
810
        return FORMAT_QUOTE_FOR_IDENTIFIERS;
811
    }
812
    
813
    @Override
814
    public String quote_for_strings() {
815
        return FORMAT_QUOTE_FOR_STRINGS;
816
    }
817
       
818
    @Override
819
    public String string(String s) {
820
        String quote = this.quote_for_strings();
821
//        No se porque no esta disponible wrapIfMissing
822
//        return StringUtils.wrapIfMissing(s,quote);
823
        if (s.startsWith(quote)) {
824
            return s;
825
        }
826
        return quote + StringUtils.replace(s,quote,quote+quote) + quote;
827
    }
828

    
829
    @Override
830
    public String identifier(String id) {
831
        String quote = this.quote_for_identifiers();
832
//        No se porque no esta disponible wrapIfMissing
833
//        return StringUtils.wrapIfMissing(id,quote);
834
        if (id.startsWith(quote)) {
835
            return id;
836
        }
837
        return quote + id + quote;
838
    }
839

    
840
    @Override
841
    public String bytearray_hex(byte[] data) {
842
        StringBuilder builder = new StringBuilder();
843
        for (byte abyte : data) {
844
            int v = abyte & 0xff;
845
            builder.append(String.format("%02x", v));
846
        }
847
        return builder.toString();
848
    }
849

    
850
    @Override
851
    public String bytearray_0x(byte[] data) {
852
        return "0x" + bytearray_hex(data);
853
    }
854

    
855
    @Override
856
    public String bytearray_x(byte[] data) {
857
        return "x'" + bytearray_hex(data) + "'";
858
    }
859
    
860

    
861
    @Override
862
    public Constant bytearray(byte[] data) {
863
        return new ConstantBase(this, data);
864
    }
865
    
866
    @Override
867
    public Variable variable(String name) {
868
        return new VariableBase(this, name);
869
    }
870

    
871
    @Override
872
    public Variable column(String name) {
873
        return new VariableBase(this, name);
874
    }
875

    
876
    @Override
877
    public Value column(String tableName, String columnName) {
878
      return getattr(tableName,columnName);
879
    }
880

    
881
    @Override
882
    public Parameter parameter(String name) {
883
        List<Parameter> parameters = this.parameters();
884
        for (Parameter parameter : parameters) {
885
            if( StringUtils.equalsIgnoreCase(name, parameter.name()) ) {
886
                return parameter;
887
            }
888
        }
889
        Parameter parameter = this.parameter();
890
        parameter.name(name);
891
        return parameter;
892
    }
893
    
894
    @Override
895
    public Parameter parameter() {
896
        return new ParameterBase();
897
    }
898
    
899
    @Override
900
    public Constant constant(Object value) {
901
        return new ConstantBase(this, value);
902
    }
903

    
904
    @Override
905
    public Constant constant(Object value, Class theClass) {
906
      try {
907
        DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
908
        Coercion coercion = dataTypeManager.getDataType(theClass).getCoercion();
909
        return this.constant(coercion.coerce(value));
910
      } catch (Exception ex) {
911
        throw new RuntimeException("Can't coerce value ("+Objects.toString(value)+") to "+theClass.getSimpleName()+".", ex);
912
      }
913
    }
914

    
915
    @Override
916
    public Constant constant(Object value, int type) {
917
      try {
918
        DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
919
        Coercion coercion = dataTypeManager.getCoercion(type);
920
        return this.constant(coercion.coerce(value));
921
      } catch (Exception ex) {
922
        throw new RuntimeException("Can't coerce value ("+Objects.toString(value)+") to "+type+".", ex);
923
      }
924
    }
925
  
926
    @Override
927
    public Group group(Value value) {
928
        return new GroupBase(value);
929
    }
930

    
931
    @Override
932
    public Custom custom(Object value) {
933
        return new CustomBase(value);
934
    }
935

    
936
    @Override
937
    public Method method(Value instance, String name, Value... values) {
938
        MethodBase method = new MethodBase(instance, name);
939
        for (Value theValue : values) {
940
            method.parameter(theValue);
941
        }
942
        return method;
943
    }
944
    
945
    @Override
946
    public Function function(String name, Value... values) {
947
        FunctionBase func = new FunctionBase(name);
948
        for (Value theValue : values) {
949
            func.parameter(theValue);
950
        }
951
        return func;
952
    }
953

    
954
    public Function builtin_function(String name, String format, Value... values) {
955
        FunctionBase func = new FunctionBase(name, format);
956
        for (Value theValue : values) {
957
            func.parameter(theValue);
958
        }
959
        return func;
960
    }
961

    
962
    @Override
963
    public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand) {
964
        return binaryOperator(name, null, leftOperand, rightOperand);
965
    }
966
    
967
    public BinaryOperator binaryOperator(String name, String format, Value leftOperand, Value rightOperand) {
968
        BinaryOperator operator = new BinaryOperatorBase(name, format);
969
        operator.left(leftOperand);
970
        operator.right(rightOperand);
971
        return operator;
972
    }
973

    
974
    @Override
975
    public List<Variable> variables() {
976
        final Set<Variable> vars = new HashSet<>();
977
        this.accept((Visitable value1) -> {
978
          if (!vars.contains((Variable) value1)) {
979
            vars.add((Variable) value1);
980
          }
981
        }, new ClassVisitorFilter(Variable.class));
982
        List<Variable> lvars = new ArrayList<>(vars);
983
        Collections.sort(lvars);
984
        return lvars;
985
    }
986

    
987
    @Override
988
    public List<Parameter> parameters() {
989
        final List<Parameter>  params = new ArrayList<>();
990
        this.accept((Visitable value1) -> {
991
          params.add((Parameter) value1);
992
        }, new ClassVisitorFilter(Parameter.class));
993
        return params;
994
    }
995
    
996
    @Override
997
    public List<String> parameters_names() {
998
        List<String> params = new ArrayList<>();
999
        for (Parameter param : parameters()) {
1000
            Object theValue = param.value();
1001
            String s;
1002
            switch(param.type()) {
1003
                case PARAMETER_TYPE_CONSTANT:
1004
                    if( theValue==null ) {
1005
                        s = "NULL";
1006
                    } else if( theValue instanceof String ) {
1007
                        s = "'" + (String)theValue + "'";
1008
                        
1009
                    } else if( theValue instanceof byte[] ) {
1010
                        s = bytearray_0x((byte[]) theValue);
1011
                        
1012
                    } else {
1013
                        s = theValue.toString();
1014
                    }    
1015
                    break;
1016
                case PARAMETER_TYPE_VARIABLE:
1017
                default:
1018
                    s = "\"" + param.name() + "\"";
1019
            }
1020
//            if( !params.contains(s) ) { // Ojo que deben ir todos, incluso duplicados.
1021
                params.add(s);
1022
//            }
1023
        }
1024
        // Collections.sort(params); Ojo, no deben ordenarse.
1025
        return params;
1026
    }
1027
    
1028
    @Override
1029
    public List<String> variables_names() {
1030
        List<String> vars = new ArrayList<>();
1031
        for (Variable var : this.variables()) {
1032
            vars.add(var.name());
1033
        }
1034
        Collections.sort(vars);
1035
        return vars;
1036
    }
1037
    
1038
    @Override
1039
    public ExpressionBuilder set(Value value) {
1040
        this.value = value;
1041
        return this;
1042
    }
1043

    
1044
    @Override
1045
    public ExpressionBuilder and(Value value) {
1046
        if (this.value == null) {
1047
            return this.set(value);
1048
        }
1049
        BinaryOperator operator = binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, this.value, value);
1050
        this.value = operator;
1051
        return this;
1052
    }
1053

    
1054
    @Override
1055
    public ExpressionBuilder or(Value value) {
1056
        if (this.value == null) {
1057
            return this.set(value);
1058
        }
1059
        BinaryOperator operator = binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, this.value, value);
1060
        this.value = operator;
1061
        return this;
1062
    }
1063

    
1064
    @Override
1065
    public Function is_null(Value value) {
1066
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
1067
    }
1068

    
1069
    @Override
1070
    public Function not_is_null(Value value) {
1071
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
1072
    }
1073

    
1074
    @Override
1075
    public Function not(Value value) {
1076
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
1077
    }
1078

    
1079
    @Override
1080
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
1081
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
1082
    }
1083

    
1084
    @Override
1085
    public BinaryOperator and(Expression leftOperand, Expression rightOperand) {
1086
        return binaryOperator(
1087
                OPERATOR_AND, 
1088
                FORMAT_OPERATOR_AND, 
1089
                leftOperand.getCode().toValue(), 
1090
                rightOperand.getCode().toValue()
1091
        );
1092
    }
1093

    
1094
    @Override
1095
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
1096
        return binaryOperator(
1097
                OPERATOR_AND, 
1098
                FORMAT_OPERATOR_AND, 
1099
                leftOperand.getCode().toValue(), 
1100
                rightOperand
1101
        );
1102
    }
1103

    
1104
    @Override
1105
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
1106
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
1107
    }
1108

    
1109
    @Override
1110
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
1111
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
1112
    }
1113

    
1114
    @Override
1115
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
1116
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
1117
    }
1118

    
1119
    @Override
1120
    public BinaryOperator gt(Value op1, Value op2) {
1121
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
1122
    }
1123

    
1124
    @Override
1125
    public BinaryOperator ge(Value op1, Value op2) {
1126
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
1127
    }
1128

    
1129
    @Override
1130
    public BinaryOperator lt(Value op1, Value op2) {
1131
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
1132
    }
1133

    
1134
    @Override
1135
    public BinaryOperator le(Value op1, Value op2) {
1136
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
1137
    }
1138

    
1139
    @Override
1140
    public BinaryOperator like(Value op1, Value op2) {
1141
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
1142
    }
1143

    
1144
    @Override
1145
    public BinaryOperator ilike(Value op1, Value op2) {
1146
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
1147
    }
1148

    
1149
    @Override
1150
    public BinaryOperator add(Value op1, Value op2) {
1151
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1152
    }
1153

    
1154
    @Override
1155
    public BinaryOperator subst(Value op1, Value op2) {
1156
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1157
    }
1158

    
1159
    @Override
1160
    public BinaryOperator mult(Value op1, Value op2) {
1161
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1162
    }
1163

    
1164
    @Override
1165
    public BinaryOperator div(Value op1, Value op2) {
1166
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1167
    }
1168

    
1169
    @Override
1170
    public Function concat(Value... values) {
1171
        if( values.length==2 ) {
1172
            return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, values[0], values[1]);
1173
        }
1174
        FunctionBase func = new FunctionBase(FUNCTION_CONCAT);
1175
        for (Value theValue : values) {
1176
            func.parameter(theValue);
1177
        }
1178
        return func;        
1179
    }
1180

    
1181
    @Override
1182
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1183
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1184
    }
1185

    
1186
    @Override
1187
    public Function ifnull(Value value, Value iftrue, Value iffalse) {
1188
        return function(FUNCTION_IFNULL, value, iftrue, iffalse);
1189
    }
1190
    
1191
    @Override
1192
    public Function left(Value str, Value size) {
1193
       return function(FUNCTION_LEFT, str, size);
1194
    }
1195
    
1196
    @Override
1197
    public Function right(Value str, Value len) {
1198
       return function(FUNCTION_RIGHT, str, len);
1199
    }
1200
    
1201
    @Override
1202
    public Function locate(Value search, Value str, Value start) {
1203
       return function(FUNCTION_LOCATE, search, str, start);
1204
    }
1205
    
1206
    @Override
1207
    public Function position(Value search, Value str) {
1208
       return function(FUNCTION_POSITION, search, str);
1209
    }
1210
    
1211
    @Override
1212
    public Function lpad(Value str, Value len, Value padstr) {
1213
       return function(FUNCTION_LPAD, str, len, padstr);
1214
    }
1215
    
1216
    @Override
1217
    public Function rpad(Value str, Value len, Value padstr) {
1218
       return function(FUNCTION_RPAD, str, len, padstr);
1219
    }
1220
    
1221
    @Override
1222
    public Function ltrim(Value str) {
1223
       return function(FUNCTION_LTRIM, str);
1224
    }
1225
    
1226
    @Override
1227
    public Function rtrim(Value str) {
1228
       return function(FUNCTION_RTRIM, str);
1229
    }
1230
    
1231
    @Override
1232
    public Function trim(Value str) {
1233
       return function(FUNCTION_TRIM, str);
1234
    }
1235
    
1236
    @Override
1237
    public Function repeat(Value str, Value size) {
1238
       return function(FUNCTION_REPEAT, str, size);
1239
    }
1240
    
1241
    @Override
1242
    public Function replace(Value str, Value search, Value replstr) {
1243
       return function(FUNCTION_REPLACE, str, search, replstr);
1244
    }
1245
    
1246
    @Override
1247
    public Function ascii(Value str) {
1248
       return function(FUNCTION_ASCII, str);
1249
    }
1250
    
1251
    @Override
1252
    public Function lenght(Value str) {
1253
       return function(FUNCTION_LENGHT, str);
1254
    }
1255

    
1256
    @Override
1257
    public Function instr(Value str, Value search, Value start) {
1258
       return function(FUNCTION_INSTR, str, search, start);
1259
    }
1260
    
1261
    @Override
1262
    public Function lower(Value str) {
1263
       return function(FUNCTION_LOWER, str);
1264
    }
1265
    
1266
    @Override
1267
    public Function upper(Value str) {
1268
       return function(FUNCTION_UPPER, str);
1269
    }
1270
    
1271
    @Override
1272
    public Function space(Value size) {
1273
       return function(FUNCTION_SPACE, size);
1274
    }
1275
    
1276
    @Override
1277
    public Function substring(Value str, Value start, Value len) {
1278
       return function(FUNCTION_SUBSTRING, str, start, len);
1279
    }
1280
    
1281
    @Override
1282
    public Function acos(Value num) {
1283
       return function(FUNCTION_ACOS, num);
1284
    } 
1285
    
1286
    @Override
1287
    public Function asin(Value num) {
1288
       return function(FUNCTION_ASIN, num);
1289
    }
1290
    
1291
    @Override
1292
    public Function atan(Value num) {
1293
       return function(FUNCTION_ATAN, num);
1294
    }
1295
    
1296
    @Override
1297
    public Function cos(Value num) {
1298
       return function(FUNCTION_COS, num);
1299
    }
1300
    
1301
    @Override
1302
    public Function cosh(Value num) {
1303
       return function(FUNCTION_COSH, num);
1304
    }
1305
    
1306
    @Override
1307
    public Function cot(Value num) {
1308
       return function(FUNCTION_COT, num);
1309
    }  
1310
    
1311
    @Override
1312
    public Function bitand(Value num1, Value num2) {
1313
       return function(FUNCTION_BITAND, num1, num2);
1314
    } 
1315
    
1316
    @Override
1317
    public Function bitor(Value num1, Value num2) {
1318
       return function(FUNCTION_BITOR, num1, num2);
1319
    }
1320
    
1321
    @Override
1322
    public Function bitxor(Value num1, Value num2) {
1323
       return function(FUNCTION_BITXOR, num1, num2);
1324
    }
1325
    
1326
    @Override
1327
    public Function ceil(Value num) {
1328
       return function(FUNCTION_CEIL, num);
1329
    }
1330
    
1331
    @Override
1332
    public Function degrees(Value num) {
1333
       return function(FUNCTION_DEGREES, num);
1334
    }  
1335
    
1336
    @Override
1337
    public Function exp(Value num) {
1338
       return function(FUNCTION_EXP, num);
1339
    }  
1340
    
1341
    @Override
1342
    public Function floor(Value num) {
1343
       return function(FUNCTION_FLOOR, num);
1344
    }  
1345
    
1346
    @Override
1347
    public Function log(Value num) {
1348
       return function(FUNCTION_LOG, num);
1349
    }  
1350
    
1351
    @Override
1352
    public Function log10(Value num) {
1353
       return function(FUNCTION_LOG10, num);
1354
    }  
1355
    
1356
    @Override
1357
    public Function pi() {
1358
       return function(FUNCTION_PI);
1359
    }
1360
    
1361
    @Override
1362
    public Function abs(Value num) {
1363
       return function(FUNCTION_ABS, num);
1364
    }
1365
    
1366
    @Override
1367
    public Function power(Value num) {
1368
       return function(FUNCTION_POWER, num);
1369
    }
1370
    
1371
    @Override
1372
    public Function radians(Value num) {
1373
       return function(FUNCTION_RADIANS, num);
1374
    }
1375
    
1376
    @Override
1377
    public Function rand(Value num) {
1378
       return function(FUNCTION_RAND, num);
1379
    }
1380
    
1381
    @Override
1382
    public Function round(Value num) {
1383
       return function(FUNCTION_ROUND, num);
1384
    }
1385
    
1386
    @Override
1387
    public Function sqrt(Value num) {
1388
       return function(FUNCTION_SQRT, num);
1389
    }
1390
    
1391
    @Override
1392
    public Function sign(Value num) {
1393
       return function(FUNCTION_SIGN, num);
1394
    }
1395
    
1396
    @Override
1397
    public Function sin(Value num) {
1398
       return function(FUNCTION_SIN, num);
1399
    }
1400
    
1401
    @Override
1402
    public Function sinh(Value num) {
1403
       return function(FUNCTION_SINH, num);
1404
    }
1405
    
1406
    @Override
1407
    public Function tan(Value num) {
1408
       return function(FUNCTION_TAN, num);
1409
    }
1410
    @Override
1411
    public Function tanh(Value num) {
1412
       return function(FUNCTION_TANH, num);
1413
    }  
1414
    
1415
    @Override
1416
    public Function zero() {
1417
       return function(FUNCTION_ZERO);
1418
    }
1419
    
1420
    @Override
1421
    public Function chr(Value num) {
1422
       return function(FUNCTION_CHR, num);
1423
    }    
1424

    
1425
    @Override
1426
    public Function cast(Value object, Value typeName) {
1427
       return function(FUNCTION_CAST, object, typeName);
1428
    }    
1429

    
1430
    @Override
1431
    public Function decode(Value value, Value format) {
1432
       return function(FUNCTION_DECODE, value, format);
1433
    }    
1434

    
1435
    @Override
1436
    public Function toDouble(Value num) {
1437
       return function(FUNCTION_TODOUBLE, num);
1438
    }    
1439

    
1440
    @Override
1441
    public Function toFloat(Value num) {
1442
       return function(FUNCTION_TOFLOAT, num);
1443
    }    
1444

    
1445
    @Override
1446
    public Function toLong(Value num) {
1447
       return function(FUNCTION_TOLONG, num);
1448
    }    
1449

    
1450
    @Override
1451
    public Function toInteger(Value num) {
1452
       return function(FUNCTION_TOINTEGER, num);
1453
    }    
1454

    
1455
    @Override
1456
    public Function toStr(Value object) {
1457
       return function(FUNCTION_TOSTR, object);
1458
    }    
1459

    
1460
    @Override
1461
    public Function list() {
1462
        return function(FUNCTION_LIST);
1463
    }
1464

    
1465
    @Override
1466
    public Function tuple() {
1467
        return function(FUNCTION_TUPLE);
1468
    }
1469

    
1470
    @Override
1471
    public Function tuple(Object... values) {
1472
        Function fn = function(FUNCTION_TUPLE);
1473
        for (Object theValue : values) {
1474
            if( theValue instanceof ExpressionBuilder.Value ) {
1475
              fn.parameter((Value) theValue);
1476
            } else {
1477
              fn.parameter(constant(theValue));
1478
            }
1479
        }
1480
        return fn;
1481
    }
1482
    
1483
    @Override
1484
    public String repr(Object value) {
1485
        return this.manager.getReprMethod(value).repr(value);
1486
    }
1487

    
1488
  @Override
1489
  public Function getattr(String objectId, String attributeId) {
1490
        Function fn = function(FUNCTION_GETATTR);
1491
        fn.parameter(variable(objectId));
1492
        fn.parameter(variable(attributeId));
1493
        return fn;
1494
  }
1495

    
1496
  @Override
1497
  public Function date(Date date) {
1498
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1499
    return function(FUNCTION_DATE, constant(df.format(date)));
1500
  }
1501

    
1502
  @Override
1503
  public Function time(Date time) {
1504
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1505
    return function(FUNCTION_TIME, constant(df.format(time)));
1506
  }
1507

    
1508
  @Override
1509
  public Function timestamp(Date timestamp) {
1510
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1511
    return function(FUNCTION_TIMESTAMP, constant(df.format(timestamp)));
1512
  }
1513

    
1514
  @Override
1515
  public Function date(String date) {
1516
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1517
    Date d;
1518
    try {
1519
      d = df.parse(date);
1520
    } catch (ParseException ex) {
1521
      throw new IllegalArgumentException("Can't parse argument '"+date+"' as date.", ex);
1522
    }
1523
    return function(FUNCTION_DATE, constant(df.format(d)));
1524
  }
1525

    
1526
  @Override
1527
  public Function time(String time) {
1528
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1529
    Date t;
1530
    try {
1531
      t = df.parse(time);
1532
    } catch (ParseException ex) {
1533
      throw new IllegalArgumentException("Can't parse argument '"+time+"' as date.", ex);
1534
    }
1535
    return function(FUNCTION_TIME, constant(df.format(t)));
1536
  }
1537

    
1538
  @Override
1539
  public Function timestamp(String timestamp) {
1540
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1541
    Date ts;
1542
    try {
1543
      ts = df.parse(timestamp);
1544
    } catch (ParseException ex) {
1545
      throw new IllegalArgumentException("Can't parse argument '"+timestamp+"' as date.", ex);
1546
    }
1547
    return function(FUNCTION_TIMESTAMP, constant(df.format(ts)));
1548
  }
1549

    
1550
  @Override
1551
  public Function color(Color color) {
1552
    return function(FUNCTION_COLOR, constant(color.getRed()), constant(color.getGreen()), constant(color.getBlue()), constant(color.getAlpha()));
1553
  }
1554

    
1555
  @Override
1556
  public Function color(Value red, Value green, Value blue, Value alfa) {
1557
    return function(FUNCTION_COLOR, red, green, blue, alfa);
1558
  }
1559

    
1560
  @Override
1561
  public Function date(Value date) {
1562
    return function(FUNCTION_DATE, date);
1563
  }
1564

    
1565
  @Override
1566
  public Function time(Value time) {
1567
    return function(FUNCTION_TIME, time);
1568
  }
1569

    
1570
  @Override
1571
  public Function timestamp(Value timestamp) {
1572
    return function(FUNCTION_TIMESTAMP, timestamp);
1573
  }
1574

    
1575
  @Override
1576
  public Function current_date() {
1577
    return function(FUNCTION_CURRENT_DATE);
1578
  }
1579

    
1580
  @Override
1581
  public Function current_time() {
1582
    return function(FUNCTION_CURRENT_TIME);
1583
  }
1584

    
1585
  @Override
1586
  public Function current_timestamp() {
1587
    return function(FUNCTION_CURRENT_TIMESTAMP);
1588
  }
1589

    
1590
  @Override
1591
  public Function date_add(Value datefield, Value valueToAdd, Value date) {
1592
    return function(FUNCTION_DATEADD, datefield, valueToAdd, date);
1593
  }
1594
  
1595
  @Override
1596
  public Function let(String name, Value value) {
1597
    return function(FUNCTION_LET, this.variable(name), value);
1598
  }
1599

    
1600
  @Override
1601
  public Function date_diff(Value datefield, Value valueToSubst, Value date) {
1602
    return function(FUNCTION_DATEDIFF, datefield, valueToSubst, date);
1603
  }
1604

    
1605
  @Override
1606
  public Function to_date(Value date, Value format) {
1607
    return function(FUNCTION_TO_DATE, date, format);
1608
  }
1609

    
1610
  @Override
1611
  public Function to_timestamp(Value timestamp, Value format) {
1612
    return function(FUNCTION_TO_TIMESTAMP, timestamp, format);
1613
  }
1614

    
1615
  @Override
1616
  public Function extract(Value datefield, Value source) {
1617
    return function(FUNCTION_EXTRACT, datefield, source);
1618
  }
1619
  
1620
}