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

History | View | Annotate | Download (55.1 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_FORCE2D = "ST_Force2D({0})";
48
    private static final String FORMAT_ST_INTERSECTS = "ST_Intersects(({0}), ({1}))";
49
    private static final String FORMAT_ST_GEOMFROMTEXT = "ST_GeomFromText(({0}), ({1}))";
50
    private static final String FORMAT_ST_GEOMFROMWKB = "ST_GeomFromWKB(({0}), ({1}))";
51
    private static final String FORMAT_ST_GEOMFROMEWKB = "ST_GeomFromEWKB(({0}), ({1}))";
52
    private static final String FORMAT_ST_SIMPLIFY = "ST_Simplify(({0}), ({1}))";
53

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

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

    
74
    public class GroupBase extends AbstractValue implements Group {
75

    
76
        protected Value value;
77

    
78
        public GroupBase(Value value) {
79
            this.value = value;
80
        }
81

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

    
87
        @Override
88
        public void accept(Visitor visitor, VisitorFilter filter) {
89
            super.accept(visitor, filter);
90
            this.value.accept(visitor, filter);
91
        }
92

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

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

    
116
    public class VariableBase extends AbstractValue implements Variable {
117

    
118
        protected String name;
119

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

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

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

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

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

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

    
163
    public class ParameterBase extends AbstractValue implements Parameter {
164

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
422
    public class ConstantBase extends AbstractValue implements Constant {
423

    
424
        protected Object value;
425

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

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

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

    
492
    public class CustomBase extends AbstractValue implements Custom {
493

    
494
        protected Object value;
495

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

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

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

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

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

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

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

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

    
566
    public class FunctionBase extends AbstractValue implements Function {
567

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

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

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

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

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

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

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

    
661
    public class MethodBase extends FunctionBase implements Method {
662

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

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

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

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

    
718
    public class BinaryOperatorBase extends AbstractValue implements BinaryOperator {
719

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

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

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

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

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

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

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

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

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

    
808
    protected GeometrySupportType geometrySupportType;
809
    protected Value value;
810

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1179
    @Override
1180
    public Function ST_Force2D(Value geom) {
1181
        return builtin_function(FUNCTION_ST_FORCE2D, FORMAT_ST_FORCE2D, geom);
1182
    }
1183

    
1184
    @Override
1185
    public Function ST_AsText(Value geom) {
1186
        return builtin_function(FUNCTION_ST_ASTEXT, FORMAT_ST_ASTEXT, geom);
1187
    }
1188

    
1189
    @Override
1190
    public Function ST_AsBinary(Value geom) {
1191
        return builtin_function(FUNCTION_ST_ASBINARY, FORMAT_ST_ASBINARY, geom);
1192
    }
1193

    
1194
    @Override
1195
    public Function ST_AsEWKB(Value geom) {
1196
        return builtin_function(FUNCTION_ST_ASEWKB, FORMAT_ST_ASEWKB, geom);
1197
    }
1198

    
1199
    @Override
1200
    public Function ST_GeomFromText(Value geom, Value crs) {
1201
        return builtin_function(FUNCTION_ST_GEOMFROMTEXT, FORMAT_ST_GEOMFROMTEXT, geom, crs);
1202
    }
1203

    
1204
    @Override
1205
    public Function ST_GeomFromWKB(Value geom, Value crs) {
1206
        return builtin_function(FUNCTION_ST_GEOMFROMWKB, FORMAT_ST_GEOMFROMWKB, geom, crs);
1207
    }
1208

    
1209
    @Override
1210
    public Function ST_GeomFromEWKB(Value geom, Value crs) {
1211
        return builtin_function(FUNCTION_ST_GEOMFROMEWKB, FORMAT_ST_GEOMFROMEWKB, geom, crs);
1212
    }
1213

    
1214
    @Override
1215
    public Function ST_Simplify(Value geom, Value tolerance) {
1216
        return builtin_function(FUNCTION_ST_SIMPLIFY, FORMAT_ST_SIMPLIFY, tolerance);
1217
    }
1218

    
1219
    @Override
1220
    public Function ST_Disjoint(Value geom1, Value geom2) {
1221
        return builtin_function(FUNCTION_ST_DISJOINT, FORMAT_ST_DISJOINT, geom1, geom2);
1222
    }
1223

    
1224
    @Override
1225
    public Function ST_Contains(Value geom1, Value geom2) {
1226
        return builtin_function(FUNCTION_ST_CONTAINS, FORMAT_ST_CONTAINS, geom1, geom2);
1227
    }
1228

    
1229
    @Override
1230
    public Function ST_Equals(Value geom1, Value geom2) {
1231
        return builtin_function(FUNCTION_ST_EQUALS, FORMAT_ST_EQUALS, geom1, geom2);
1232
    }
1233

    
1234
    @Override
1235
    public Function ST_Crosses(Value geom1, Value geom2) {
1236
        return builtin_function(FUNCTION_ST_CROSSES, FORMAT_ST_CROSSES, geom1, geom2);
1237
    }
1238

    
1239
    @Override
1240
    public Function ST_IsClosed(Value geom) {
1241
        return builtin_function(FUNCTION_ST_ISCLOSED, FORMAT_ST_ISCLOSED, geom);
1242
    }
1243

    
1244
    @Override
1245
    public Function ST_Overlaps(Value geom1, Value geom2) {
1246
        return builtin_function(FUNCTION_ST_OVERLAPS, FORMAT_ST_OVERLAPS, geom1, geom2);
1247
    }
1248

    
1249
    @Override
1250
    public Function ST_Touches(Value geom1, Value geom2) {
1251
        return builtin_function(FUNCTION_ST_TOUCHES, FORMAT_ST_TOUCHES, geom1, geom2);
1252
    }
1253

    
1254
    @Override
1255
    public Function ST_Within(Value geom1, Value geom2) {
1256
        return builtin_function("ST_Within", FORMAT_ST_WITHIN, geom1, geom2);
1257
    }
1258

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

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

    
1269
    @Override
1270
    public Function ST_Buffer(Value geom, Value dist) {
1271
        return function("ST_Buffer", geom, dist);
1272
    }
1273

    
1274
    @Override
1275
    public Function ST_Centroid(Value geom) {
1276
        return function("ST_Centroid", geom);
1277
    }
1278

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

    
1284
    @Override
1285
    public Function ST_Covers(Value geom1, Value geom2) {
1286
        return function("ST_Covers", geom1, geom2);
1287
    }
1288

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

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

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

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

    
1309
    @Override
1310
    public Function ST_Intersection(Value geom1, Value geom2) {
1311
        return function("ST_Intersection", geom1, geom2);
1312
    }
1313

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

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

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

    
1329
    @Override
1330
    public Function ST_NumPoints(Value geom) {
1331
        return function("ST_NumPoints", geom);
1332
    }
1333

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

    
1339
    @Override
1340
    public Function ST_PointN(Value geom, Value n) {
1341
        return function("ST_PointN", geom, n);
1342
    }
1343

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

    
1349
    @Override
1350
    public Function ST_Union(Value geom1, Value geom2) {
1351
        return function("ST_Union", geom1, geom2);
1352
    }
1353

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

    
1359
    @Override
1360
    public Function ST_Y(Value geom) {
1361
        return function("ST_Y", geom);
1362
    }
1363

    
1364
    @Override
1365
    public Function ST_Z(Value geom) {
1366
        return function("ST_Z", geom);
1367
    }
1368

    
1369
    @Override
1370
    public Function is_null(Value value) {
1371
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
1372
    }
1373

    
1374
    @Override
1375
    public Function not_is_null(Value value) {
1376
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
1377
    }
1378

    
1379
    @Override
1380
    public Function not(Value value) {
1381
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
1382
    }
1383

    
1384
    @Override
1385
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
1386
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
1387
    }
1388

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

    
1399
    @Override
1400
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
1401
        return binaryOperator(
1402
                OPERATOR_AND, 
1403
                FORMAT_OPERATOR_AND, 
1404
                leftOperand.getCode().toValue(), 
1405
                rightOperand
1406
        );
1407
    }
1408

    
1409
    @Override
1410
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
1411
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
1412
    }
1413

    
1414
    @Override
1415
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
1416
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
1417
    }
1418

    
1419
    @Override
1420
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
1421
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
1422
    }
1423

    
1424
    @Override
1425
    public BinaryOperator gt(Value op1, Value op2) {
1426
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
1427
    }
1428

    
1429
    @Override
1430
    public BinaryOperator ge(Value op1, Value op2) {
1431
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
1432
    }
1433

    
1434
    @Override
1435
    public BinaryOperator lt(Value op1, Value op2) {
1436
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
1437
    }
1438

    
1439
    @Override
1440
    public BinaryOperator le(Value op1, Value op2) {
1441
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
1442
    }
1443

    
1444
    @Override
1445
    public BinaryOperator like(Value op1, Value op2) {
1446
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
1447
    }
1448

    
1449
    @Override
1450
    public BinaryOperator ilike(Value op1, Value op2) {
1451
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
1452
    }
1453

    
1454
    @Override
1455
    public BinaryOperator add(Value op1, Value op2) {
1456
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1457
    }
1458

    
1459
    @Override
1460
    public BinaryOperator subst(Value op1, Value op2) {
1461
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1462
    }
1463

    
1464
    @Override
1465
    public BinaryOperator mult(Value op1, Value op2) {
1466
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1467
    }
1468

    
1469
    @Override
1470
    public BinaryOperator div(Value op1, Value op2) {
1471
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1472
    }
1473

    
1474
    @Override
1475
    public BinaryOperator concat(Value op1, Value op2) {
1476
        return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, op1, op2);
1477
    }
1478
    
1479
    @Override
1480
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1481
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1482
    }
1483

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

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

    
1718
    @Override
1719
    public Function ST_ExtentAggregate(Value geom) {
1720
       return function(FUNCTION_ST_EXTENTAGGREGATE, geom);
1721
    }
1722

    
1723
    @Override
1724
    public Function ST_UnionAggregate(Value geom) {
1725
       return function(FUNCTION_ST_UNIONAGGREGATE, geom);
1726
    }
1727

    
1728
    @Override
1729
    public Function cast(Value object, Value typeName) {
1730
       return function(FUNCTION_CAST, object, typeName);
1731
    }    
1732

    
1733
    @Override
1734
    public Function decode(Value value, Value format) {
1735
       return function(FUNCTION_DECODE, value, format);
1736
    }    
1737

    
1738
    @Override
1739
    public Function toDouble(Value num) {
1740
       return function(FUNCTION_TODOUBLE, num);
1741
    }    
1742

    
1743
    @Override
1744
    public Function toFloat(Value num) {
1745
       return function(FUNCTION_TOFLOAT, num);
1746
    }    
1747

    
1748
    @Override
1749
    public Function toLong(Value num) {
1750
       return function(FUNCTION_TOLONG, num);
1751
    }    
1752

    
1753
    @Override
1754
    public Function toInteger(Value num) {
1755
       return function(FUNCTION_TOINTEGER, num);
1756
    }    
1757

    
1758
    @Override
1759
    public Function toStr(Value object) {
1760
       return function(FUNCTION_TOSTR, object);
1761
    }    
1762

    
1763
    @Override
1764
    public Function ST_Point(Value x, Value y) {
1765
       return function(FUNCTION_ST_POINT, x, y);
1766
    }
1767

    
1768
    @Override
1769
    public Function ST_MakePoint(Value x, Value y) {
1770
       return function(FUNCTION_ST_MAKEPOINT, x, y);
1771
    }
1772

    
1773
    @Override
1774
    public Function ST_MakePoint(Value x, Value y, Value z) {
1775
       return function(FUNCTION_ST_MAKEPOINT, x, y, z);
1776
    }
1777

    
1778
    @Override
1779
    public Function ST_MakePoint(Value x, Value y, Value z, Value m) {
1780
       return function(FUNCTION_ST_MAKEPOINT, x, y, z, m);
1781
    }
1782

    
1783
    @Override
1784
    public Function ST_SetSRID(Value geom, Value srid) {
1785
       return function(FUNCTION_ST_POINT, geom, srid);
1786
    }
1787

    
1788
    @Override
1789
    public Function list() {
1790
        return function(FUNCTION_LIST);
1791
    }
1792

    
1793
    @Override
1794
    public Function tuple() {
1795
        return function(FUNCTION_TUPLE);
1796
    }
1797

    
1798
    @Override
1799
    public Function tuple(Constant... values) {
1800
        Function fn = function(FUNCTION_TUPLE);
1801
        for (Value theValue : values) {
1802
            fn.parameter(this.constant(theValue));
1803
        }
1804
        return fn;
1805
    }
1806
    
1807
    
1808
}