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

History | View | Annotate | Download (54.3 KB)

1
package org.gvsig.expressionevaluator.impl;
2

    
3
import java.text.MessageFormat;
4
import java.util.ArrayList;
5
import java.util.Collections;
6
import java.util.HashSet;
7
import java.util.List;
8
import java.util.Objects;
9
import java.util.Set;
10
import org.apache.commons.lang3.StringUtils;
11
import org.cresques.cts.IProjection;
12
import org.gvsig.expressionevaluator.Code;
13
import org.gvsig.expressionevaluator.Expression;
14
import org.gvsig.fmap.geom.Geometry;
15
import org.gvsig.fmap.geom.primitive.Envelope;
16

    
17
import org.gvsig.expressionevaluator.ExpressionBuilder;
18
import static org.gvsig.expressionevaluator.ExpressionBuilder.EMPTY_FORMATTER;
19
import org.gvsig.expressionevaluator.ExpressionUtils;
20
import org.gvsig.expressionevaluator.Formatter;
21
import org.gvsig.fmap.geom.GeometryUtils;
22

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

    
29
    private static final String FORMAT_TRUE = "TRUE";
30
    private static final String FORMAT_FALSE = "FALSE";
31

    
32
    private static final String FORMAT_GROUP = "( {0} )";
33

    
34
    private static final String FORMAT_ST_SRID = "ST_SRID({0})";
35
    private static final String FORMAT_ST_ASTEXT = "ST_AsText({0})";
36
    private static final String FORMAT_ST_ASBINARY = "ST_AsBinary({0})";
37
    private static final String FORMAT_ST_ASEWKB = "ST_AsEWKB({0})";
38
    private static final String FORMAT_ST_CONTAINS = "ST_Contains(({0}), ({1}))";
39
    private static final String FORMAT_ST_CROSSES = "ST_Crosses(({0}), ({1}))";
40
    private static final String FORMAT_ST_DISJOINT = "ST_Disjoint(({0}), ({1}))";
41
    private static final String FORMAT_ST_EQUALS = "ST_Equals(({0}), ({1}))";
42
    private static final String FORMAT_ST_ISCLOSED = "ST_IsClosed({0})";
43
    private static final String FORMAT_ST_OVERLAPS = "ST_Overlaps(({0}), ({1}))";
44
    private static final String FORMAT_ST_TOUCHES = "ST_Touches(({0}), ({1}))";
45
    private static final String FORMAT_ST_WITHIN = "ST_Within(({0}), ({1}))";
46
    private static final String FORMAT_ST_ENVELOPE = "ST_Envelope({0})";
47
    private static final String FORMAT_ST_INTERSECTS = "ST_Intersects(({0}), ({1}))";
48
    private static final String FORMAT_ST_GEOMFROMTEXT = "ST_GeomFromText(({0}), ({1}))";
49
    private static final String FORMAT_ST_GEOMFROMWKB = "ST_GeomFromWKB(({0}), ({1}))";
50
    private static final String FORMAT_ST_GEOMFROMEWKB = "ST_GeomFromEWKB(({0}), ({1}))";
51
    private static final String FORMAT_ST_SIMPLIFY = "ST_Simplify(({0}), ({1}))";
52

    
53
    private static final String FORMAT_ISNULL = "( ({0}) IS NULL )";
54
    private static final String FORMAT_NOTISNULL = "( ({0}) IS NOT NULL )";
55
    private static final String FORMAT_OPERATOR_NOT = "( NOT ({0}) )";
56

    
57
    private static final String FORMAT_OPERATOR_AND = "({0} AND {1})";
58
    private static final String FORMAT_OPERATOR_OR = "{0} OR {1}";
59
    private static final String FORMAT_OPERATOR_EQ = "( ({0}) = ({1}) )";
60
    private static final String FORMAT_OPERATOR_NE = "( ({0}) <> ({1}) )";
61
    private static final String FORMAT_OPERATOR_GT = "( ({0}) > ({1}) )";
62
    private static final String FORMAT_OPERATOR_GE = "( ({0}) >= ({1}) )";
63
    private static final String FORMAT_OPERATOR_LT = "( ({0}) < ({1}) )";
64
    private static final String FORMAT_OPERATOR_LE = "( ({0}) <= ({1}) )";
65
    private static final String FORMAT_OPERATOR_LIKE = "( ({0}) LIKE ({1}) )";
66
    private static final String FORMAT_OPERATOR_ILIKE = "( ({0}) ILIKE ({1}) )";
67
    private static final String FORMAT_OPERATOR_ADD = "{0} + {1}";
68
    private static final String FORMAT_OPERATOR_SUBST = "{0} - {1}";
69
    private static final String FORMAT_OPERATOR_MULT = "({0} * {1})";
70
    private static final String FORMAT_OPERATOR_DIV = "({0} / {1})";
71
    private static final String FORMAT_OPERATOR_CONCAT = "{0} || {1}";
72

    
73
    public class GroupBase extends AbstractValue implements Group {
74

    
75
        protected Value value;
76

    
77
        public GroupBase(Value value) {
78
            this.value = value;
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(EMPTY_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

    
119
        public VariableBase(String name) {
120
            this.name = name;
121
        }
122

    
123
        @Override
124
        public String name() {
125
            return this.name;
126
        }
127

    
128
        @Override
129
        public String toString() {
130
            return this.toString(EMPTY_FORMATTER);
131
        }
132
        
133
        @Override
134
        public String toString(Formatter<Value> formatter) {
135
            if( formatter!=null && formatter.canApply(this) ) {
136
                return formatter.format(this);
137
            }
138
            return identifier(this.name);
139
        }
140

    
141
        @Override
142
        public int compareTo(Variable o) {
143
            return this.name.compareTo(o.name());
144
        }
145

    
146
        @Override
147
        public boolean equals(Object obj) {
148
            if (!(obj instanceof Variable)) {
149
                return false;
150
            }
151
            return this.name.equals(((Variable) obj).name());
152
        }
153

    
154
        @Override
155
        public int hashCode() {
156
            int hash = 7;
157
            hash = 37 * hash + Objects.hashCode(this.name);
158
            return hash;
159
        }
160
    }
161

    
162
    public class ParameterBase extends AbstractValue implements Parameter {
163

    
164
        protected String name;
165
        protected Object value;
166
        protected ParameterType type;
167
        protected Value srs;
168

    
169
        /*
170
        Para un parametre de tipo Geometria, el srs sera siempre un Constant
171
        excepto cuando se le asigne una geometria contante al parametro y esta
172
        tenga un SRS asignado. En este caso, tanto la geometria como el SRS
173
        se trataran como parametros.
174
        
175
        Si se quiere que el SRS sea un Parameter, se construira como tal y se 
176
        asignara a traves del metodo srs(Value srs).
177
        */
178
        public ParameterBase() {
179
            this.type = ParameterType.Constant;
180
            this.name = null;
181
            this.value = null;
182
        }
183

    
184
        @Override
185
        public void accept(Visitor visitor, VisitorFilter filter) {
186
            super.accept(visitor, filter);
187
            if (this.srs != null) {
188
                this.srs.accept(visitor, filter);
189
            }
190
        }
191

    
192
        @Override
193
        public void replace(Value target, Value replacement) {
194
            if( this.srs == target ) {
195
                this.srs = replacement;
196
            } else {
197
                this.srs.replace(target, replacement);
198
            }
199
        }
200

    
201
        @Override
202
        public Parameter as_geometry_variable() {
203
            this.type = ParameterType.Geometry;
204
            if (this.value == null && this.name != null) {
205
                this.value = this.name;
206
            }
207
            return this;
208
        }
209

    
210
        @Override
211
        public Parameter as_constant() {
212
            this.type = ParameterType.Constant;
213
            if (this.value == null && this.name != null) {
214
                this.value = this.name;
215
            }
216
            return this;
217
        }
218

    
219
        @Override
220
        public Parameter as_variable() {
221
            this.type = ParameterType.Variable;
222
            if (this.value != null && this.name == null) {
223
                this.name = (String) this.value;
224
            }
225
            return this;
226
        }
227

    
228
        @Override
229
        public Parameter srs(Value srs) {
230
            this.srs = srs;
231
            if( this.type == ParameterType.Variable ) {
232
                this.type = ParameterType.Geometry;
233
            }
234
            return this;
235
        }
236

    
237
        @Override
238
        public Parameter srs(IProjection srs) {
239
            this.srs = constant(srs_id(srs));
240
            if( this.type == ParameterType.Variable ) {
241
                this.type = ParameterType.Geometry;
242
            }
243
            return this;
244
        }
245

    
246
        @Override
247
        public String name() {
248
            switch (this.type) {
249
                case Variable:
250
                case Geometry:
251
                    return this.name;
252
                case Constant:
253
                    if (this.value == null) {
254
                        return null;
255
                    }
256
                    return this.value.toString();
257
                default:
258
                    if (this.name != null) {
259
                        return this.name;
260
                    }
261
                    if (this.value != null) {
262
                        return this.value.toString();
263
                    }
264
                    return null;
265
            }
266
        }
267

    
268
        @Override
269
        public boolean is_constant() {
270
            return this.type == ParameterType.Constant;
271
        }
272

    
273
        @Override
274
        public boolean is_geometry_variable() {
275
            return this.type == ParameterType.Geometry;
276
        }
277

    
278
        @Override
279
        public boolean is_variable() {
280
            return this.type == ParameterType.Variable;
281
        }
282

    
283
        @Override
284
        public Parameter value(Object value) {
285
            if( value instanceof Geometry ) {
286
                if( this.srs == null ) {
287
                    IProjection proj = ((Geometry)value).getProjection();
288
                    this.srs(parameter().value(proj));
289
                }
290
            }
291
            this.value = value;
292
            return this;
293
        }
294

    
295
        @Override
296
        public Parameter name(String name) {
297
            this.type = ParameterType.Variable;
298
            this.name = name;
299
            return this;
300
        }
301

    
302
        @Override
303
        public Object value() {
304
            try {
305
                switch (this.type) {
306
                    case Constant:
307
                        if( this.value instanceof Geometry ) {
308
                            Geometry geometry = (Geometry) this.value;
309
                            switch (geometry_support_type()) {
310
                                case EWKB:
311
                                    return GeometryUtils.toEWKB(geometry);
312
                                case WKB:
313
                                    return GeometryUtils.toWKB(geometry);
314
                                case WKT:
315
                                default:
316
                                    return GeometryUtils.toWKT(geometry);
317
                            }
318
                        } else if (this.value instanceof IProjection) {
319
                            return srs_id((IProjection) this.value);
320
                        }
321
                        return this.value;
322
                    case Variable:
323
                    case Geometry:
324
                    default:
325
                        return this.value;
326
                }
327
            } catch (Exception ex) {
328
                throw new RuntimeException("Can't get value from parameter.", ex);
329
            }
330
        }
331

    
332
        @Override
333
        public ParameterType type() {
334
            return this.type;
335
        }
336

    
337
        @Override
338
        public Value srs() {
339
            return this.srs;
340
        }
341

    
342
        @Override
343
        public String toString() {
344
            return this.toString(EMPTY_FORMATTER);
345
        }
346
        
347
        @Override
348
        public String toString(Formatter<Value> formatter) {
349
            if( formatter!=null && formatter.canApply(this) ) {
350
                return formatter.format(this);
351
            }
352
            switch (this.type) {
353
                case Constant:
354
                    if( value instanceof Geometry ) {
355
                        switch (geometry_support_type()) {
356
                            case EWKB:
357
                                return MessageFormat.format(
358
                                    FORMAT_ST_GEOMFROMEWKB,
359
                                    "?",
360
                                    getSRS(formatter)
361
                                );
362
                            case WKB:
363
                                return MessageFormat.format(
364
                                    FORMAT_ST_GEOMFROMWKB,
365
                                    "?",
366
                                    getSRS(formatter)
367
                                );
368
                            case WKT:
369
                            default:
370
                                return MessageFormat.format(
371
                                    FORMAT_ST_GEOMFROMTEXT,
372
                                    "?",
373
                                    getSRS(formatter)
374
                                );
375
                        }
376
                    }
377
                case Variable:
378
                default:
379
                    return "?";
380
                case Geometry:
381
                    switch (geometry_support_type()) {
382
                        case EWKB:
383
                            return MessageFormat.format(
384
                                FORMAT_ST_GEOMFROMEWKB,
385
                                "?",
386
                                getSRS(formatter)
387
                            );
388
                        case WKB:
389
                            return MessageFormat.format(
390
                                FORMAT_ST_GEOMFROMWKB,
391
                                "?",
392
                                getSRS(formatter)
393
                            );
394
                        case WKT:
395
                        default:
396
                            return MessageFormat.format(
397
                                FORMAT_ST_GEOMFROMTEXT,
398
                                "?",
399
                                getSRS(formatter)
400
                            );
401
                    }
402
            }
403
        }
404
        
405
        private String getSRS(Formatter formatter) {
406
            if( this.srs!=null ) {
407
                return this.srs.toString(formatter);
408
            }
409
            if( this.value instanceof Geometry ) {
410
                IProjection proj = ((Geometry)this.value).getProjection();
411
                Object s = srs_id(proj);
412
                if( s == null ) {
413
                    throw new IllegalArgumentException("A parameter of type Geometry with an invalid SRS.");
414
                }
415
                return s.toString();
416
            }
417
            throw new IllegalArgumentException("The parameter of type Geometry need a SRS.");
418
        }
419
    }
420

    
421
    public class ConstantBase extends AbstractValue implements Constant {
422

    
423
        protected Object value;
424

    
425
        public ConstantBase(Object value) {
426
            this.value = value;
427
        }
428

    
429
        @Override
430
        public Object value() {
431
            return this.value;
432
        }
433

    
434
        @Override
435
        public String toString() {
436
            return this.toString(EMPTY_FORMATTER);
437
        }
438
        
439
        @Override
440
        public String toString(Formatter<Value> formatter) {
441
            if( formatter!=null && formatter.canApply(this) ) {
442
                return formatter.format(this);
443
            }
444
            if( this.value==null ) {
445
                return "NULL";
446
            }
447
            if( this.value instanceof byte[] ) {
448
                return "DECODE('"+bytearray_hex((byte[])this.value)+"','hex')";
449
            }
450
            if (this.value instanceof String) {
451
                return string((String) this.value);
452
            }
453
            if( this.value instanceof Geometry ) {
454
                Geometry geometry = (Geometry) this.value;
455
                switch (geometry_support_type()) {
456
                    case EWKB:
457
                        return MessageFormat.format(
458
                                FORMAT_ST_GEOMFROMEWKB,
459
                                "DECODE('"+bytearray_hex(GeometryUtils.toEWKB(geometry))+"','hex')",
460
                                String.valueOf(srs_id(geometry.getProjection()))
461
                        );
462
                    case WKB:
463
                        return MessageFormat.format(
464
                                FORMAT_ST_GEOMFROMWKB,
465
                                "DECODE('"+bytearray_hex(GeometryUtils.toWKB(geometry))+"','hex')",
466
                                String.valueOf(srs_id(geometry.getProjection()))
467
                        );
468
                    case WKT:
469
                    default:
470
                        return MessageFormat.format(
471
                                FORMAT_ST_GEOMFROMTEXT,
472
                                string(GeometryUtils.toWKT(geometry)),
473
                                String.valueOf(srs_id(geometry.getProjection()))
474
                        );
475
                }
476
            }
477
            if( this.value instanceof IProjection ) {
478
                return Objects.toString(srs_id((IProjection)(this.value)));
479
            }
480
            if (this.value instanceof Boolean) {
481
                if (((Boolean) this.value)) {
482
                    return FORMAT_TRUE;
483
                } else {
484
                    return FORMAT_FALSE;
485
                }
486
            }
487
            return Objects.toString(this.value, "");
488
        }
489
    }
490

    
491
    public class CustomBase extends AbstractValue implements Custom {
492

    
493
        protected Object value;
494

    
495
        // Esto es para permitir declarar parametros y columnas en una seccion
496
        // custom.
497
        protected List<Value> values;
498

    
499
        public CustomBase(Object value) {
500
            this.value = value;
501
        }
502

    
503
        @Override
504
        public void accept(Visitor visitor, VisitorFilter filter) {
505
            super.accept(visitor, filter);
506
            if (this.values != null) {
507
                for (Value theValue : values) {
508
                    theValue.accept(visitor, filter);
509
                }
510
            }
511
        }
512

    
513
        @Override
514
        public void replace(Value target, Value replacement) {
515
            if( this.values == null ) {
516
                return;
517
            }
518
            for (int i = 0; i < values.size(); i++) {
519
                Value theValue = values.get(i);
520
                if( target == theValue ) {
521
                    values.set(i, replacement);
522
                } else {
523
                    theValue.replace(target, replacement);
524
                }
525
            }
526
        }
527

    
528
        @Override
529
        public Object value() {
530
            return this.value;
531
        }
532

    
533
        @Override
534
        public Custom add(Variable variable) {
535
            if (this.values == null) {
536
                this.values = new ArrayList<>();
537
            }
538
            this.values.add(variable);
539
            return this;
540
        }
541

    
542
        @Override
543
        public Custom add(Parameter parameter) {
544
            if (this.values == null) {
545
                this.values = new ArrayList<>();
546
            }
547
            this.values.add(parameter);
548
            return this;
549
        }
550

    
551
        @Override
552
        public String toString() {
553
            return this.toString(EMPTY_FORMATTER);
554
        }
555
        
556
        @Override
557
        public String toString(Formatter<Value> formatter) {
558
            if( formatter!=null && formatter.canApply(this) ) {
559
                return formatter.format(this);
560
            }
561
            return Objects.toString(this.value, "");
562
        }
563
    }
564

    
565
    public class FunctionBase extends AbstractValue implements Function {
566

    
567
        protected String name;
568
        protected String format;
569
        protected List<Value> parameters;
570

    
571
        public FunctionBase(String name, String format) {
572
            this.name = name;
573
            this.format = format;
574
        }
575

    
576
        public FunctionBase(String name) {
577
            this(name,null);
578
        }
579
        
580
        @Override
581
        public List<Value> parameters() {
582
            if (this.parameters == null) {
583
                this.parameters = new ArrayList<>();
584
            }
585
            return this.parameters;
586
        }
587

    
588
        @Override
589
        public Function parameter(Value parameter) {
590
            this.parameters().add(parameter);
591
            return this;
592
        }
593

    
594
        @Override
595
        public String name() {
596
            return this.name;
597
        }
598

    
599
        @Override
600
        public void accept(Visitor visitor, VisitorFilter filter) {
601
            super.accept(visitor, filter);
602
            for (Value value : this.parameters) {
603
                value.accept(visitor, filter);
604
            }
605
        }
606

    
607
        @Override
608
        public void replace(Value target, Value replacement) {
609
            for (int i = 0; i < parameters.size(); i++) {
610
                Value value = parameters.get(i);
611
                if( value == target ) {
612
                    parameters.set(i, replacement);
613
                } else {
614
                    value.replace(target, replacement);
615
                }
616
            }
617
        }
618
        
619
        @Override
620
        public String toString() {
621
            return this.toString(EMPTY_FORMATTER);
622
        }
623
        
624
        @Override
625
        public String toString(Formatter<Value> formatter) {
626
            if( formatter!=null && formatter.canApply(this) ) {
627
                return formatter.format(this);
628
            }
629
            if( this.format==null ) {
630
                StringBuilder builder = new StringBuilder();
631
                builder.append(name);
632
                builder.append("(");
633
                if (this.parameters != null && !this.parameters.isEmpty()) {
634
                    boolean first = true;
635
                    for (Value value : this.parameters) {
636
                        if( first ) {
637
                            first=false;
638
                            builder.append(value.toString(formatter));
639
                        } else {
640
                            builder.append(", ");
641
                            builder.append(value.toString(formatter));
642
                        }
643
                    }
644
                }
645
                builder.append(")");
646
                return builder.toString();
647
            }
648
            if (this.parameters != null && !this.parameters.isEmpty()) {
649
                List<String> values = new ArrayList<>();
650
                for (Value value : this.parameters) {
651
                    values.add(value.toString(formatter));
652
                }
653
                return MessageFormat.format(format, values.toArray());
654
            } else {
655
                return this.format;
656
            }
657
        }
658
    }
659

    
660
    public class MethodBase extends FunctionBase implements Method {
661

    
662
        private Value instance;
663
        
664
        public MethodBase(Value instance, String name) {
665
            super(name);
666
            this.instance = instance;
667
        }
668

    
669
        @Override
670
        public Value instance() {
671
            return this.instance;
672
        }
673

    
674
        @Override
675
        public void accept(Visitor visitor, VisitorFilter filter) {
676
            this.instance.accept(visitor, filter);
677
            super.accept(visitor, filter);
678
        }
679

    
680
        @Override
681
        public void replace(Value target, Value replacement) {
682
            if( this.instance == target ) {
683
                this.instance = replacement;
684
            } else {
685
                this.instance.replace(target, replacement);
686
            }
687
        }
688
        
689
        @Override
690
        public String toString(Formatter<Value> formatter) {
691
            if( formatter!=null && formatter.canApply(this) ) {
692
                return formatter.format(this);
693
            }
694
            StringBuilder builder = new StringBuilder();
695
            builder.append(this.instance.toString(formatter));
696
            builder.append("->");
697
            builder.append(this.name());
698
            builder.append(name);
699
            builder.append("(");
700
            if (this.parameters != null && !this.parameters.isEmpty()) {
701
                boolean first = true;
702
                for (Value value : this.parameters) {
703
                    if( first ) {
704
                        first=false;
705
                        builder.append(value.toString(formatter));
706
                    } else {
707
                        builder.append(", ");
708
                        builder.append(value.toString(formatter));
709
                    }
710
                }
711
            }
712
            builder.append(")");
713
            return builder.toString();
714
        }
715
    }
716

    
717
    public class BinaryOperatorBase extends AbstractValue implements BinaryOperator {
718

    
719
        protected String name;
720
        protected String format;
721
        protected Value left;
722
        protected Value right;
723

    
724
        public BinaryOperatorBase(String name, String format) {
725
            this.name = name;
726
            this.format = format;
727
        }
728

    
729
        @Override
730
        public String name() {
731
            return this.name;
732
        }
733

    
734
        @Override
735
        public void replace(Value target, Value replacement) {
736
            if( target == this.left ) {
737
                this.left = replacement;
738
            } else {
739
                this.left.replace(target, replacement);
740
            }
741
            if( target == this.right ) {
742
                this.right = replacement;
743
            } else {
744
                this.right.replace(target, replacement);
745
            }
746
        }
747
        
748
        @Override
749
        public void accept(Visitor visitor, VisitorFilter filter) {
750
            super.accept(visitor, filter);
751
            this.left.accept(visitor, filter);
752
            this.right.accept(visitor, filter);
753
        }
754

    
755
        @Override
756
        public BinaryOperator left(Value operand) {
757
            this.left = operand;
758
            return this;
759
        }
760

    
761
        @Override
762
        public BinaryOperator right(Value operand) {
763
            this.right = operand;
764
            return this;
765
        }
766

    
767
        @Override
768
        public Value left() {
769
            return this.left;
770
        }
771

    
772
        @Override
773
        public Value right() {
774
            return this.right;
775
        }
776

    
777
        @Override
778
        public String toString() {
779
            return this.toString(EMPTY_FORMATTER);
780
        }
781
        
782
        @Override
783
        public String toString(Formatter<Value> formatter) {
784
            if( formatter!=null && formatter.canApply(this) ) {
785
                return formatter.format(this);
786
            }
787
            if( this.format==null ) {
788
                StringBuilder builder = new StringBuilder();
789
                builder.append("(");
790
                builder.append(this.left.toString(formatter));
791
                builder.append(" ");
792
                builder.append(this.name);
793
                builder.append(" ");
794
                builder.append(this.right.toString(formatter));
795
                builder.append(")");
796
                return builder.toString();
797
            } else {
798
                return MessageFormat.format(
799
                        format,
800
                        this.left.toString(formatter),
801
                        this.right.toString(formatter)
802
                );
803
            }
804
        }
805
    }
806

    
807
    protected GeometrySupportType geometrySupportType;
808
    protected Value value;
809

    
810
    public DefaultExpressionBuilder() {
811
        this.geometrySupportType = GeometrySupportType.WKB;
812
    }
813

    
814
    @Override
815
    public boolean isEmpty() {
816
        return value == null;
817
    }
818
    
819
    @Override
820
    public ExpressionBuilder createExpressionBuilder() {
821
        return new DefaultExpressionBuilder();
822
    }
823

    
824
    @Override
825
    public GeometrySupportType geometry_support_type() {
826
        return this.geometrySupportType;
827
    }
828

    
829
    @Override
830
    public ExpressionBuilder geometry_support_type(GeometrySupportType geometrySupportType) {
831
        this.geometrySupportType = geometrySupportType;
832
        return this;
833
    }
834

    
835
    @Override
836
    public Value value() {
837
        return this.value;
838
    }
839

    
840
    @Override
841
    public ExpressionBuilder value(Value value) {
842
        this.value = value;
843
        return this;
844
    }
845

    
846
    @Override
847
    public String toString() {
848
        return this.value.toString();
849
    }
850

    
851
    @Override
852
    public String toString(Formatter<Value> formatter) {
853
        return this.value.toString(formatter);
854
    }
855

    
856
    @Override
857
    public Value toValue(String expression) {
858
        try {
859
            Code code = ExpressionUtils.compile(expression);
860
            return code.toValue(this);
861
        } catch(Throwable ex) {
862
            return custom(expression);
863
        }
864
    }
865

    
866
    @Override
867
    public void accept(Visitor visitor, VisitorFilter filter) {
868
        if( this.value == null) {
869
            return;
870
        }
871
        this.value.accept(visitor, filter);
872
    }
873

    
874
    @Override
875
    public String quote_for_identifiers() {
876
        return FORMAT_QUOTE_FOR_IDENTIFIERS;
877
    }
878
    
879
    @Override
880
    public String quote_for_strings() {
881
        return FORMAT_QUOTE_FOR_STRINGS;
882
    }
883
       
884
    @Override
885
    public String string(String s) {
886
        String quote = this.quote_for_strings();
887
//        No se porque no esta disponible wrapIfMissing
888
//        return StringUtils.wrapIfMissing(s,quote);
889
        if (s.startsWith(quote)) {
890
            return s;
891
        }
892
        return quote + StringUtils.replace(s,quote,quote+quote) + quote;
893
    }
894

    
895
    @Override
896
    public String identifier(String id) {
897
        String quote = this.quote_for_identifiers();
898
//        No se porque no esta disponible wrapIfMissing
899
//        return StringUtils.wrapIfMissing(id,quote);
900
        if (id.startsWith(quote)) {
901
            return id;
902
        }
903
        return quote + id + quote;
904
    }
905

    
906
    @Override
907
    public String bytearray_hex(byte[] data) {
908
        StringBuilder builder = new StringBuilder();
909
        for (byte abyte : data) {
910
            int v = abyte & 0xff;
911
            builder.append(String.format("%02x", v));
912
        }
913
        return builder.toString();
914
    }
915

    
916
    @Override
917
    public String bytearray_0x(byte[] data) {
918
        return "0x" + bytearray_hex(data);
919
    }
920

    
921
    @Override
922
    public String bytearray_x(byte[] data) {
923
        return "x'" + bytearray_hex(data) + "'";
924
    }
925
    
926
    @Override
927
    public Object srs_id(IProjection projection) {
928
        if( projection==null ) {
929
            return 0;
930
        }
931
        return ProjectionUtils.getCode(projection);
932
    }
933

    
934
    @Override
935
    public Constant bytearray(byte[] data) {
936
        return new ConstantBase(data);
937
    }
938
    
939
    @Override
940
    public Constant srs(IProjection projection) {
941
        return constant(projection);
942
    }
943

    
944
    @Override
945
    public Variable variable(String name) {
946
        return new VariableBase(name);
947
    }
948

    
949
    @Override
950
    public Variable column(String name) {
951
        return new VariableBase(name);
952
    }
953
    
954
    @Override
955
    public Parameter parameter(String name) {
956
        List<Parameter> parameters = this.parameters();
957
        for (Parameter parameter : parameters) {
958
            if( StringUtils.equalsIgnoreCase(name, parameter.name()) ) {
959
                return parameter;
960
            }
961
        }
962
        Parameter parameter = this.parameter();
963
        parameter.name(name);
964
        return parameter;
965
    }
966
    
967
    @Override
968
    public Parameter parameter() {
969
        return new ParameterBase();
970
    }
971
    
972
    @Override
973
    public Constant constant(Object value) {
974
        return new ConstantBase(value);
975
    }
976

    
977
    @Override
978
    public Group group(Value value) {
979
        return new GroupBase(value);
980
    }
981

    
982
    @Override
983
    public Constant geometry(Geometry geom, IProjection projection) {
984
        geom.setProjection(projection);
985
        return new ConstantBase(geom);
986
    }
987

    
988
    @Override
989
    public Constant geometry(Geometry geom) {
990
        if( geom.getProjection()==null ) {
991
            throw new IllegalArgumentException("The geometry does not have an associated projection. Use 'geometry(Geometry, IProjection)'.");
992
        }
993
        return new ConstantBase(geom);
994
    }
995

    
996
    @Override
997
    public Constant envelope(Envelope envelope, IProjection projection) {
998
        Geometry geom = envelope.getGeometry();
999
        geom.setProjection(projection);
1000
        return new ConstantBase(geom);
1001
    }
1002

    
1003
    @Override
1004
    public Constant envelope(Envelope envelope) {
1005
        if( envelope.getProjection()==null ) {
1006
            throw new IllegalArgumentException("The envelope does not have an associated projection. Use 'envelope(Geometry, IProjection)'.");
1007
        }
1008
        Geometry geom = envelope.getGeometry();
1009
        return new ConstantBase(geom);
1010
    }
1011

    
1012
    @Override
1013
    public Custom custom(Object value) {
1014
        return new CustomBase(value);
1015
    }
1016

    
1017
    @Override
1018
    public Method method(Value instance, String name, Value... values) {
1019
        MethodBase method = new MethodBase(instance, name);
1020
        for (Value theValue : values) {
1021
            method.parameter(theValue);
1022
        }
1023
        return method;
1024
    }
1025
    
1026
    @Override
1027
    public Function function(String name, Value... values) {
1028
        FunctionBase func = new FunctionBase(name);
1029
        for (Value theValue : values) {
1030
            func.parameter(theValue);
1031
        }
1032
        return func;
1033
    }
1034

    
1035
    public Function builtin_function(String name, String format, Value... values) {
1036
        FunctionBase func = new FunctionBase(name, format);
1037
        for (Value theValue : values) {
1038
            func.parameter(theValue);
1039
        }
1040
        return func;
1041
    }
1042

    
1043
    @Override
1044
    public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand) {
1045
        return binaryOperator(name, null, leftOperand, rightOperand);
1046
    }
1047
    
1048
    public BinaryOperator binaryOperator(String name, String format, Value leftOperand, Value rightOperand) {
1049
        BinaryOperator operator = new BinaryOperatorBase(name, format);
1050
        operator.left(leftOperand);
1051
        operator.right(rightOperand);
1052
        return operator;
1053
    }
1054

    
1055
    @Override
1056
    public List<Variable> variables() {
1057
        final Set<Variable> vars = new HashSet<>();
1058
        this.accept(new Visitor() {
1059
            @Override
1060
            public void visit(Visitable value) {
1061
                if( !vars.contains((Variable)value) ) {
1062
                    vars.add((Variable)value);
1063
                }
1064
            }
1065
        }, new ClassVisitorFilter(Variable.class));
1066
        List<Variable> lvars = new ArrayList<>(vars);
1067
        Collections.sort(lvars);
1068
        return lvars;
1069
    }
1070

    
1071
    @Override
1072
    public List<Parameter> parameters() {
1073
        final List<Parameter>  params = new ArrayList<>();
1074
        this.accept(new Visitor() {
1075
            @Override
1076
            public void visit(Visitable value) {
1077
                params.add((Parameter) value);
1078
            }
1079
        }, new ClassVisitorFilter(Parameter.class));
1080
        return params;
1081
    }
1082
    
1083
    @Override
1084
    public List<String> parameters_names() {
1085
        List<String> params = new ArrayList<>();
1086
        for (Parameter param : parameters()) {
1087
            Object theValue = param.value();
1088
            String s;
1089
            switch(param.type()) {
1090
                case Constant:
1091
                    if( theValue==null ) {
1092
                        s = "NULL";
1093
                    } else if( theValue instanceof String ) {
1094
                        s = "'" + (String)theValue + "'";
1095
                        
1096
                    } else if( theValue instanceof byte[] ) {
1097
                        s = bytearray_0x((byte[]) theValue);
1098
                        
1099
                    } else {
1100
                        s = theValue.toString();
1101
                    }    
1102
                    break;
1103
                case Geometry:
1104
                    if( param.name()==null ) {
1105
                        s = bytearray_0x((byte[]) theValue);
1106
                    } else {
1107
                        s = "\"" + param.name() + "\"";
1108
                    }
1109
                    break;
1110
                case Variable:
1111
                default:
1112
                    s = "\"" + param.name() + "\"";
1113
            }
1114
//            if( !params.contains(s) ) { // Ojo que deben ir todos, incluso duplicados.
1115
                params.add(s);
1116
//            }
1117
        }
1118
        // Collections.sort(params); Ojo, no deben ordenarse.
1119
        return params;
1120
    }
1121
    
1122
    @Override
1123
    public List<String> variables_names() {
1124
        List<String> vars = new ArrayList<>();
1125
        for (Variable var : this.variables()) {
1126
            vars.add(var.name());
1127
        }
1128
        Collections.sort(vars);
1129
        return vars;
1130
    }
1131
    
1132
    @Override
1133
    public Function as_geometry(Value value) {
1134
        return builtin_function(FUNCTION_ST_ASBINARY, FORMAT_ST_ASBINARY, value);
1135
    }
1136

    
1137
    @Override
1138
    public ExpressionBuilder set(Value value) {
1139
        this.value = value;
1140
        return this;
1141
    }
1142

    
1143
    @Override
1144
    public ExpressionBuilder and(Value value) {
1145
        if (this.value == null) {
1146
            return this.set(value);
1147
        }
1148
        BinaryOperator operator = binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, this.value, value);
1149
        this.value = operator;
1150
        return this;
1151
    }
1152

    
1153
    @Override
1154
    public ExpressionBuilder or(Value value) {
1155
        if (this.value == null) {
1156
            return this.set(value);
1157
        }
1158
        BinaryOperator operator = binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, this.value, value);
1159
        this.value = operator;
1160
        return this;
1161
    }
1162

    
1163
    @Override
1164
    public Function ST_Intersects(Value geom1, Value geom2) {
1165
        return builtin_function(FUNCTION_ST_INTERSECTS, FORMAT_ST_INTERSECTS, geom1, geom2);
1166
    }
1167

    
1168
    @Override
1169
    public Function ST_SRID(Value geom) {
1170
        return builtin_function(FUNCTION_ST_SRID, FORMAT_ST_SRID, geom);
1171
    }
1172

    
1173
    @Override
1174
    public Function ST_Envelope(Value geom) {
1175
        return builtin_function(FUNCTION_ST_ENVELOPE, FORMAT_ST_ENVELOPE, geom);
1176
    }
1177

    
1178
    @Override
1179
    public Function ST_AsText(Value geom) {
1180
        return builtin_function(FUNCTION_ST_ASTEXT, FORMAT_ST_ASTEXT, geom);
1181
    }
1182

    
1183
    @Override
1184
    public Function ST_AsBinary(Value geom) {
1185
        return builtin_function(FUNCTION_ST_ASBINARY, FORMAT_ST_ASBINARY, geom);
1186
    }
1187

    
1188
    @Override
1189
    public Function ST_AsEWKB(Value geom) {
1190
        return builtin_function(FUNCTION_ST_ASEWKB, FORMAT_ST_ASEWKB, geom);
1191
    }
1192

    
1193
    @Override
1194
    public Function ST_GeomFromText(Value geom, Value crs) {
1195
        return builtin_function(FUNCTION_ST_GEOMFROMTEXT, FORMAT_ST_GEOMFROMTEXT, geom, crs);
1196
    }
1197

    
1198
    @Override
1199
    public Function ST_GeomFromWKB(Value geom, Value crs) {
1200
        return builtin_function(FUNCTION_ST_GEOMFROMWKB, FORMAT_ST_GEOMFROMWKB, geom, crs);
1201
    }
1202

    
1203
    @Override
1204
    public Function ST_GeomFromEWKB(Value geom, Value crs) {
1205
        return builtin_function(FUNCTION_ST_GEOMFROMEWKB, FORMAT_ST_GEOMFROMEWKB, geom, crs);
1206
    }
1207

    
1208
    @Override
1209
    public Function ST_Simplify(Value geom, Value tolerance) {
1210
        return builtin_function(FUNCTION_ST_SIMPLIFY, FORMAT_ST_SIMPLIFY, tolerance);
1211
    }
1212

    
1213
    @Override
1214
    public Function ST_Disjoint(Value geom1, Value geom2) {
1215
        return builtin_function(FUNCTION_ST_DISJOINT, FORMAT_ST_DISJOINT, geom1, geom2);
1216
    }
1217

    
1218
    @Override
1219
    public Function ST_Contains(Value geom1, Value geom2) {
1220
        return builtin_function(FUNCTION_ST_CONTAINS, FORMAT_ST_CONTAINS, geom1, geom2);
1221
    }
1222

    
1223
    @Override
1224
    public Function ST_Equals(Value geom1, Value geom2) {
1225
        return builtin_function(FUNCTION_ST_EQUALS, FORMAT_ST_EQUALS, geom1, geom2);
1226
    }
1227

    
1228
    @Override
1229
    public Function ST_Crosses(Value geom1, Value geom2) {
1230
        return builtin_function(FUNCTION_ST_CROSSES, FORMAT_ST_CROSSES, geom1, geom2);
1231
    }
1232

    
1233
    @Override
1234
    public Function ST_IsClosed(Value geom) {
1235
        return builtin_function(FUNCTION_ST_ISCLOSED, FORMAT_ST_ISCLOSED, geom);
1236
    }
1237

    
1238
    @Override
1239
    public Function ST_Overlaps(Value geom1, Value geom2) {
1240
        return builtin_function(FUNCTION_ST_OVERLAPS, FORMAT_ST_OVERLAPS, geom1, geom2);
1241
    }
1242

    
1243
    @Override
1244
    public Function ST_Touches(Value geom1, Value geom2) {
1245
        return builtin_function(FUNCTION_ST_TOUCHES, FORMAT_ST_TOUCHES, geom1, geom2);
1246
    }
1247

    
1248
    @Override
1249
    public Function ST_Within(Value geom1, Value geom2) {
1250
        return builtin_function("ST_Within", FORMAT_ST_WITHIN, geom1, geom2);
1251
    }
1252

    
1253
    @Override
1254
    public Function ST_Area(Value geom) {
1255
        return function("ST_Area", geom);
1256
    }
1257

    
1258
    @Override
1259
    public Function ST_Buffer(Value geom) {
1260
        return function("ST_Buffer", geom);
1261
    }
1262

    
1263
    @Override
1264
    public Function ST_Centroid(Value geom) {
1265
        return function("ST_Centroid", geom);
1266
    }
1267

    
1268
    @Override
1269
    public Function ST_CoveredBy(Value geom1, Value geom2) {
1270
        return function("ST_CoveredBy", geom1, geom2);
1271
    }
1272

    
1273
    @Override
1274
    public Function ST_Covers(Value geom1, Value geom2) {
1275
        return function("ST_Covers", geom1, geom2);
1276
    }
1277

    
1278
    @Override
1279
    public Function ST_Diference(Value geom1, Value geom2) {
1280
        return function("ST_Diference", geom1, geom2);
1281
    }
1282

    
1283
    @Override
1284
    public Function ST_Dimension(Value geom) {
1285
        return function("ST_Dimension", geom);
1286
    }
1287

    
1288
    @Override
1289
    public Function ST_Distance(Value geom1, Value geom2) {
1290
        return function("ST_Distance", geom1, geom2);
1291
    }
1292

    
1293
    @Override
1294
    public Function ST_EndPoint(Value geom) {
1295
        return function("ST_EndPoint", geom);
1296
    }
1297

    
1298
    @Override
1299
    public Function ST_Intersection(Value geom1, Value geom2) {
1300
        return function("ST_Intersection", geom1, geom2);
1301
    }
1302

    
1303
    @Override
1304
    public Function ST_IsSimple(Value geom) {
1305
        return function("ST_IsSimple", geom);
1306
    }
1307

    
1308
    @Override
1309
    public Function ST_IsValid(Value geom) {
1310
        return function("ST_IsValid", geom);
1311
    }
1312

    
1313
    @Override
1314
    public Function ST_NumGeometries(Value geom) {
1315
        return function("ST_NumGeometries", geom);
1316
    }
1317

    
1318
    @Override
1319
    public Function ST_NumPoints(Value geom) {
1320
        return function("ST_NumPoints", geom);
1321
    }
1322

    
1323
    @Override
1324
    public Function ST_Perimeter(Value geom) {
1325
        return function("ST_Perimeter", geom);
1326
    }
1327

    
1328
    @Override
1329
    public Function ST_PointN(Value geom, Value n) {
1330
        return function("ST_PointN", geom, n);
1331
    }
1332

    
1333
    @Override
1334
    public Function ST_StartPoint(Value geom) {
1335
        return function("ST_StartPoint", geom);
1336
    }
1337

    
1338
    @Override
1339
    public Function ST_Union(Value geom1, Value geom2) {
1340
        return function("ST_Union", geom1, geom2);
1341
    }
1342

    
1343
    @Override
1344
    public Function ST_X(Value geom) {
1345
        return function("ST_X", geom);
1346
    }
1347

    
1348
    @Override
1349
    public Function ST_Y(Value geom) {
1350
        return function("ST_Y", geom);
1351
    }
1352

    
1353
    @Override
1354
    public Function ST_Z(Value geom) {
1355
        return function("ST_Z", geom);
1356
    }
1357

    
1358
    @Override
1359
    public Function is_null(Value value) {
1360
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
1361
    }
1362

    
1363
    @Override
1364
    public Function not_is_null(Value value) {
1365
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
1366
    }
1367

    
1368
    @Override
1369
    public Function not(Value value) {
1370
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
1371
    }
1372

    
1373
    @Override
1374
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
1375
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
1376
    }
1377

    
1378
    @Override
1379
    public BinaryOperator and(Expression leftOperand, Expression rightOperand) {
1380
        return binaryOperator(
1381
                OPERATOR_AND, 
1382
                FORMAT_OPERATOR_AND, 
1383
                leftOperand.getCode().toValue(), 
1384
                rightOperand.getCode().toValue()
1385
        );
1386
    }
1387

    
1388
    @Override
1389
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
1390
        return binaryOperator(
1391
                OPERATOR_AND, 
1392
                FORMAT_OPERATOR_AND, 
1393
                leftOperand.getCode().toValue(), 
1394
                rightOperand
1395
        );
1396
    }
1397

    
1398
    @Override
1399
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
1400
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
1401
    }
1402

    
1403
    @Override
1404
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
1405
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
1406
    }
1407

    
1408
    @Override
1409
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
1410
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
1411
    }
1412

    
1413
    @Override
1414
    public BinaryOperator gt(Value op1, Value op2) {
1415
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
1416
    }
1417

    
1418
    @Override
1419
    public BinaryOperator ge(Value op1, Value op2) {
1420
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
1421
    }
1422

    
1423
    @Override
1424
    public BinaryOperator lt(Value op1, Value op2) {
1425
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
1426
    }
1427

    
1428
    @Override
1429
    public BinaryOperator le(Value op1, Value op2) {
1430
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
1431
    }
1432

    
1433
    @Override
1434
    public BinaryOperator like(Value op1, Value op2) {
1435
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
1436
    }
1437

    
1438
    @Override
1439
    public BinaryOperator ilike(Value op1, Value op2) {
1440
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
1441
    }
1442

    
1443
    @Override
1444
    public BinaryOperator add(Value op1, Value op2) {
1445
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1446
    }
1447

    
1448
    @Override
1449
    public BinaryOperator subst(Value op1, Value op2) {
1450
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1451
    }
1452

    
1453
    @Override
1454
    public BinaryOperator mult(Value op1, Value op2) {
1455
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1456
    }
1457

    
1458
    @Override
1459
    public BinaryOperator div(Value op1, Value op2) {
1460
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1461
    }
1462

    
1463
    @Override
1464
    public BinaryOperator concat(Value op1, Value op2) {
1465
        return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, op1, op2);
1466
    }
1467
    
1468
    @Override
1469
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1470
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1471
    }
1472

    
1473
    @Override
1474
    public Function ifnull(Value value, Value iftrue, Value iffalse) {
1475
        return function(FUNCTION_IFNULL, value, iftrue, iffalse);
1476
    }
1477
    
1478
    @Override
1479
    public Function left(Value str, Value size) {
1480
       return function(FUNCTION_LEFT, str, size);
1481
    }
1482
    
1483
    @Override
1484
    public Function right(Value str, Value len) {
1485
       return function(FUNCTION_RIGHT, str, len);
1486
    }
1487
    
1488
    @Override
1489
    public Function locate(Value search, Value str, Value start) {
1490
       return function(FUNCTION_LOCATE, search, str, start);
1491
    }
1492
    
1493
    @Override
1494
    public Function position(Value search, Value str) {
1495
       return function(FUNCTION_POSITION, search, str);
1496
    }
1497
    
1498
    @Override
1499
    public Function lpad(Value str, Value len, Value padstr) {
1500
       return function(FUNCTION_LPAD, str, len, padstr);
1501
    }
1502
    
1503
    @Override
1504
    public Function rpad(Value str, Value len, Value padstr) {
1505
       return function(FUNCTION_RPAD, str, len, padstr);
1506
    }
1507
    
1508
    @Override
1509
    public Function ltrim(Value str) {
1510
       return function(FUNCTION_LTRIM, str);
1511
    }
1512
    
1513
    @Override
1514
    public Function rtrim(Value str) {
1515
       return function(FUNCTION_RTRIM, str);
1516
    }
1517
    
1518
    @Override
1519
    public Function trim(Value str) {
1520
       return function(FUNCTION_TRIM, str);
1521
    }
1522
    
1523
    @Override
1524
    public Function repeat(Value str, Value size) {
1525
       return function(FUNCTION_REPEAT, str, size);
1526
    }
1527
    
1528
    @Override
1529
    public Function replace(Value str, Value search, Value replstr) {
1530
       return function(FUNCTION_REPLACE, str, search, replstr);
1531
    }
1532
    
1533
    @Override
1534
    public Function ascii(Value str) {
1535
       return function(FUNCTION_ASCII, str);
1536
    }
1537
    
1538
    @Override
1539
    public Function lenght(Value str) {
1540
       return function(FUNCTION_LENGHT, str);
1541
    }
1542

    
1543
    @Override
1544
    public Function instr(Value str, Value search, Value start) {
1545
       return function(FUNCTION_INSTR, str, search, start);
1546
    }
1547
    
1548
    @Override
1549
    public Function lower(Value str) {
1550
       return function(FUNCTION_LOWER, str);
1551
    }
1552
    
1553
    @Override
1554
    public Function upper(Value str) {
1555
       return function(FUNCTION_UPPER, str);
1556
    }
1557
    
1558
    @Override
1559
    public Function space(Value size) {
1560
       return function(FUNCTION_SPACE, size);
1561
    }
1562
    
1563
    @Override
1564
    public Function substring(Value str, Value start, Value len) {
1565
       return function(FUNCTION_SUBSTRING, str, start, len);
1566
    }
1567
    
1568
    @Override
1569
    public Function acos(Value num) {
1570
       return function(FUNCTION_ACOS, num);
1571
    } 
1572
    
1573
    @Override
1574
    public Function asin(Value num) {
1575
       return function(FUNCTION_ASIN, num);
1576
    }
1577
    
1578
    @Override
1579
    public Function atan(Value num) {
1580
       return function(FUNCTION_ATAN, num);
1581
    }
1582
    
1583
    @Override
1584
    public Function cos(Value num) {
1585
       return function(FUNCTION_COS, num);
1586
    }
1587
    
1588
    @Override
1589
    public Function cosh(Value num) {
1590
       return function(FUNCTION_COSH, num);
1591
    }
1592
    
1593
    @Override
1594
    public Function cot(Value num) {
1595
       return function(FUNCTION_COT, num);
1596
    }  
1597
    
1598
    @Override
1599
    public Function bitand(Value num1, Value num2) {
1600
       return function(FUNCTION_BITAND, num1, num2);
1601
    } 
1602
    
1603
    @Override
1604
    public Function bitor(Value num1, Value num2) {
1605
       return function(FUNCTION_BITOR, num1, num2);
1606
    }
1607
    
1608
    @Override
1609
    public Function bitxor(Value num1, Value num2) {
1610
       return function(FUNCTION_BITXOR, num1, num2);
1611
    }
1612
    
1613
    @Override
1614
    public Function ceil(Value num) {
1615
       return function(FUNCTION_CEIL, num);
1616
    }
1617
    
1618
    @Override
1619
    public Function degrees(Value num) {
1620
       return function(FUNCTION_DEGREES, num);
1621
    }  
1622
    
1623
    @Override
1624
    public Function exp(Value num) {
1625
       return function(FUNCTION_EXP, num);
1626
    }  
1627
    
1628
    @Override
1629
    public Function floor(Value num) {
1630
       return function(FUNCTION_FLOOR, num);
1631
    }  
1632
    
1633
    @Override
1634
    public Function log(Value num) {
1635
       return function(FUNCTION_LOG, num);
1636
    }  
1637
    
1638
    @Override
1639
    public Function log10(Value num) {
1640
       return function(FUNCTION_LOG10, num);
1641
    }  
1642
    
1643
    @Override
1644
    public Function pi(Value num) {
1645
       return function(FUNCTION_PI, num);
1646
    }
1647
    
1648
    @Override
1649
    public Function power(Value num) {
1650
       return function(FUNCTION_POWER, num);
1651
    }
1652
    
1653
    @Override
1654
    public Function radians(Value num) {
1655
       return function(FUNCTION_RADIANS, num);
1656
    }
1657
    
1658
    @Override
1659
    public Function rand(Value num) {
1660
       return function(FUNCTION_RAND, num);
1661
    }
1662
    
1663
    @Override
1664
    public Function round(Value num) {
1665
       return function(FUNCTION_ROUND, num);
1666
    }
1667
    
1668
    @Override
1669
    public Function sqrt(Value num) {
1670
       return function(FUNCTION_SQRT, num);
1671
    }
1672
    
1673
    @Override
1674
    public Function sign(Value num) {
1675
       return function(FUNCTION_SIGN, num);
1676
    }
1677
    
1678
    @Override
1679
    public Function sin(Value num) {
1680
       return function(FUNCTION_SIN, num);
1681
    }
1682
    
1683
    @Override
1684
    public Function sinh(Value num) {
1685
       return function(FUNCTION_SINH, num);
1686
    }
1687
    
1688
    @Override
1689
    public Function tan(Value num) {
1690
       return function(FUNCTION_TAN, num);
1691
    }
1692
    @Override
1693
    public Function tanh(Value num) {
1694
       return function(FUNCTION_TANH, num);
1695
    }  
1696
    
1697
    @Override
1698
    public Function zero() {
1699
       return function(FUNCTION_ZERO);
1700
    }
1701
    
1702
    @Override
1703
    public Function chr(Value num) {
1704
       return function(FUNCTION_CHR, num);
1705
    }    
1706

    
1707
    @Override
1708
    public Function ST_ExtentAggregate(Value geom) {
1709
       return function(FUNCTION_ST_EXTENTAGGREGATE, geom);
1710
    }
1711

    
1712
    @Override
1713
    public Function ST_UnionAggregate(Value geom) {
1714
       return function(FUNCTION_ST_UNIONAGGREGATE, geom);
1715
    }
1716

    
1717
    @Override
1718
    public Function cast(Value object, Value typeName) {
1719
       return function(FUNCTION_CAST, object, typeName);
1720
    }    
1721

    
1722
    @Override
1723
    public Function decode(Value value, Value format) {
1724
       return function(FUNCTION_DECODE, value, format);
1725
    }    
1726

    
1727
    @Override
1728
    public Function toDouble(Value num) {
1729
       return function(FUNCTION_TODOUBLE, num);
1730
    }    
1731

    
1732
    @Override
1733
    public Function toFloat(Value num) {
1734
       return function(FUNCTION_TOFLOAT, num);
1735
    }    
1736

    
1737
    @Override
1738
    public Function toLong(Value num) {
1739
       return function(FUNCTION_TOLONG, num);
1740
    }    
1741

    
1742
    @Override
1743
    public Function toInteger(Value num) {
1744
       return function(FUNCTION_TOINTEGER, num);
1745
    }    
1746

    
1747
    @Override
1748
    public Function toStr(Value object) {
1749
       return function(FUNCTION_TOSTR, object);
1750
    }    
1751

    
1752
    @Override
1753
    public Function ST_Point(Value x, Value y) {
1754
       return function(FUNCTION_ST_POINT, x, y);
1755
    }
1756

    
1757
    @Override
1758
    public Function ST_SetSRID(Value geom, Value srid) {
1759
       return function(FUNCTION_ST_POINT, geom, srid);
1760
    }
1761

    
1762
    @Override
1763
    public Function list() {
1764
        return function(FUNCTION_LIST);
1765
    }
1766

    
1767
    @Override
1768
    public Function tuple() {
1769
        return function(FUNCTION_TUPLE);
1770
    }
1771

    
1772
    @Override
1773
    public Function tuple(Constant... values) {
1774
        Function fn = function(FUNCTION_TUPLE);
1775
        for (Value theValue : values) {
1776
            fn.parameter(this.constant(theValue));
1777
        }
1778
        return fn;
1779
    }
1780
    
1781
    
1782
}