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

History | View | Annotate | Download (49.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 String toString() {
94
            return this.toString(EMPTY_FORMATTER);
95
        }
96
        
97
        @Override
98
        public String toString(Formatter<Value> formatter) {
99
            if( formatter!=null && formatter.canApply(this) ) {
100
                return formatter.format(this);
101
            }
102
            return MessageFormat.format(FORMAT_GROUP, this.value.toString());
103
        }
104
    }
105

    
106
    public class VariableBase extends AbstractValue implements Variable {
107

    
108
        protected String name;
109

    
110
        public VariableBase(String name) {
111
            this.name = name;
112
        }
113

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

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

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

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

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

    
153
    public class ParameterBase extends AbstractValue implements Parameter {
154

    
155
        protected String name;
156
        protected Object value;
157
        protected ParameterType type;
158
        protected Value srs;
159

    
160
        /*
161
        Para un parametre de tipo Geometria, el srs sera siempre un Constant
162
        excepto cuando se le asigne una geometria contante al parametro y esta
163
        tenga un SRS asignado. En este caso, tanto la geometria como el SRS
164
        se trataran como parametros.
165
        
166
        Si se quiere que el SRS sea un Parameter, se construira como tal y se 
167
        asignara a traves del metodo srs(Value srs).
168
        */
169
        public ParameterBase() {
170
            this.type = ParameterType.Constant;
171
            this.name = null;
172
            this.value = null;
173
        }
174

    
175
        @Override
176
        public void accept(Visitor visitor, VisitorFilter filter) {
177
            super.accept(visitor, filter);
178
            if (this.srs != null) {
179
                this.srs.accept(visitor, filter);
180
            }
181
        }
182

    
183
        @Override
184
        public Parameter as_geometry_variable() {
185
            this.type = ParameterType.Geometry;
186
            if (this.value == null && this.name != null) {
187
                this.value = this.name;
188
            }
189
            return this;
190
        }
191

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

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

    
210
        @Override
211
        public Parameter srs(Value srs) {
212
            this.srs = srs;
213
            if( this.type == ParameterType.Variable ) {
214
                this.type = ParameterType.Geometry;
215
            }
216
            return this;
217
        }
218

    
219
        @Override
220
        public Parameter srs(IProjection srs) {
221
            this.srs = constant(srs_id(srs));
222
            if( this.type == ParameterType.Variable ) {
223
                this.type = ParameterType.Geometry;
224
            }
225
            return this;
226
        }
227

    
228
        @Override
229
        public String name() {
230
            switch (this.type) {
231
                case Variable:
232
                case Geometry:
233
                    return this.name;
234
                case Constant:
235
                    if (this.value == null) {
236
                        return null;
237
                    }
238
                    return this.value.toString();
239
                default:
240
                    if (this.name != null) {
241
                        return this.name;
242
                    }
243
                    if (this.value != null) {
244
                        return this.value.toString();
245
                    }
246
                    return null;
247
            }
248
        }
249

    
250
        @Override
251
        public boolean is_constant() {
252
            return this.type == ParameterType.Constant;
253
        }
254

    
255
        @Override
256
        public boolean is_geometry_variable() {
257
            return this.type == ParameterType.Geometry;
258
        }
259

    
260
        @Override
261
        public boolean is_variable() {
262
            return this.type == ParameterType.Variable;
263
        }
264

    
265
        @Override
266
        public Parameter value(Object value) {
267
            if( value instanceof Geometry ) {
268
                if( this.srs == null ) {
269
                    IProjection proj = ((Geometry)value).getProjection();
270
                    this.srs(parameter().value(proj));
271
                }
272
            }
273
            this.value = value;
274
            return this;
275
        }
276

    
277
        @Override
278
        public Parameter name(String name) {
279
            this.type = ParameterType.Variable;
280
            this.name = name;
281
            return this;
282
        }
283

    
284
        @Override
285
        public Object value() {
286
            try {
287
                switch (this.type) {
288
                    case Constant:
289
                        if( this.value instanceof Geometry ) {
290
                            Geometry geometry = (Geometry) this.value;
291
                            switch (geometry_support_type()) {
292
                                case EWKB:
293
                                    return GeometryUtils.toEWKB(geometry);
294
                                case WKB:
295
                                    return GeometryUtils.toWKB(geometry);
296
                                case WKT:
297
                                default:
298
                                    return GeometryUtils.toWKT(geometry);
299
                            }
300
                        } else if (this.value instanceof IProjection) {
301
                            return srs_id((IProjection) this.value);
302
                        }
303
                        return this.value;
304
                    case Variable:
305
                    case Geometry:
306
                    default:
307
                        return this.value;
308
                }
309
            } catch (Exception ex) {
310
                throw new RuntimeException("Can't get value from parameter.", ex);
311
            }
312
        }
313

    
314
        @Override
315
        public ParameterType type() {
316
            return this.type;
317
        }
318

    
319
        @Override
320
        public Value srs() {
321
            return this.srs;
322
        }
323

    
324
        @Override
325
        public String toString() {
326
            return this.toString(EMPTY_FORMATTER);
327
        }
328
        
329
        @Override
330
        public String toString(Formatter<Value> formatter) {
331
            if( formatter!=null && formatter.canApply(this) ) {
332
                return formatter.format(this);
333
            }
334
            switch (this.type) {
335
                case Constant:
336
                    if( value instanceof Geometry ) {
337
                        switch (geometry_support_type()) {
338
                            case EWKB:
339
                                return MessageFormat.format(
340
                                    FORMAT_ST_GEOMFROMEWKB,
341
                                    "?",
342
                                    getSRS(formatter)
343
                                );
344
                            case WKB:
345
                                return MessageFormat.format(
346
                                    FORMAT_ST_GEOMFROMWKB,
347
                                    "?",
348
                                    getSRS(formatter)
349
                                );
350
                            case WKT:
351
                            default:
352
                                return MessageFormat.format(
353
                                    FORMAT_ST_GEOMFROMTEXT,
354
                                    "?",
355
                                    getSRS(formatter)
356
                                );
357
                        }
358
                    }
359
                case Variable:
360
                default:
361
                    return "?";
362
                case Geometry:
363
                    switch (geometry_support_type()) {
364
                        case EWKB:
365
                            return MessageFormat.format(
366
                                FORMAT_ST_GEOMFROMEWKB,
367
                                "?",
368
                                getSRS(formatter)
369
                            );
370
                        case WKB:
371
                            return MessageFormat.format(
372
                                FORMAT_ST_GEOMFROMWKB,
373
                                "?",
374
                                getSRS(formatter)
375
                            );
376
                        case WKT:
377
                        default:
378
                            return MessageFormat.format(
379
                                FORMAT_ST_GEOMFROMTEXT,
380
                                "?",
381
                                getSRS(formatter)
382
                            );
383
                    }
384
            }
385
        }
386
        
387
        private String getSRS(Formatter formatter) {
388
            if( this.srs!=null ) {
389
                return this.srs.toString(formatter);
390
            }
391
            if( this.value instanceof Geometry ) {
392
                IProjection proj = ((Geometry)this.value).getProjection();
393
                Object s = srs_id(proj);
394
                if( s == null ) {
395
                    throw new IllegalArgumentException("A parameter of type Geometry with an invalid SRS.");
396
                }
397
                return s.toString();
398
            }
399
            throw new IllegalArgumentException("The parameter of type Geometry need a SRS.");
400
        }
401
    }
402

    
403
    public class ConstantBase extends AbstractValue implements Constant {
404

    
405
        protected Object value;
406

    
407
        public ConstantBase(Object value) {
408
            this.value = value;
409
        }
410

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

    
416
        @Override
417
        public String toString() {
418
            return this.toString(EMPTY_FORMATTER);
419
        }
420
        
421
        @Override
422
        public String toString(Formatter<Value> formatter) {
423
            if( formatter!=null && formatter.canApply(this) ) {
424
                return formatter.format(this);
425
            }
426
            if( this.value==null ) {
427
                return "NULL";
428
            }
429
            if( this.value instanceof byte[] ) {
430
                return "DECODE('"+bytearray_hex((byte[])this.value)+"','hex')";
431
            }
432
            if (this.value instanceof String) {
433
                return string((String) this.value);
434
            }
435
            if( this.value instanceof Geometry ) {
436
                Geometry geometry = (Geometry) this.value;
437
                switch (geometry_support_type()) {
438
                    case EWKB:
439
                        return MessageFormat.format(
440
                                FORMAT_ST_GEOMFROMEWKB,
441
                                "DECODE('"+bytearray_hex(GeometryUtils.toEWKB(geometry))+"','hex')",
442
                                String.valueOf(srs_id(geometry.getProjection()))
443
                        );
444
                    case WKB:
445
                        return MessageFormat.format(
446
                                FORMAT_ST_GEOMFROMWKB,
447
                                "DECODE('"+bytearray_hex(GeometryUtils.toWKB(geometry))+"','hex')",
448
                                String.valueOf(srs_id(geometry.getProjection()))
449
                        );
450
                    case WKT:
451
                    default:
452
                        return MessageFormat.format(
453
                                FORMAT_ST_GEOMFROMTEXT,
454
                                string(GeometryUtils.toWKT(geometry)),
455
                                String.valueOf(srs_id(geometry.getProjection()))
456
                        );
457
                }
458
            }
459
            if( this.value instanceof IProjection ) {
460
                return Objects.toString(srs_id((IProjection)(this.value)));
461
            }
462
            if (this.value instanceof Boolean) {
463
                if (((Boolean) this.value)) {
464
                    return FORMAT_TRUE;
465
                } else {
466
                    return FORMAT_FALSE;
467
                }
468
            }
469
            return Objects.toString(this.value, "");
470
        }
471
    }
472

    
473
    public class CustomBase extends AbstractValue implements Custom {
474

    
475
        protected Object value;
476

    
477
        // Esto es para permitir declarar parametros y columnas en una seccion
478
        // custom.
479
        protected List<Value> values;
480

    
481
        public CustomBase(Object value) {
482
            this.value = value;
483
        }
484

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

    
495
        @Override
496
        public Object value() {
497
            return this.value;
498
        }
499

    
500
        @Override
501
        public Custom add(Variable variable) {
502
            if (this.values == null) {
503
                this.values = new ArrayList<>();
504
            }
505
            this.values.add(variable);
506
            return this;
507
        }
508

    
509
        @Override
510
        public Custom add(Parameter parameter) {
511
            if (this.values == null) {
512
                this.values = new ArrayList<>();
513
            }
514
            this.values.add(parameter);
515
            return this;
516
        }
517

    
518
        @Override
519
        public String toString() {
520
            return this.toString(EMPTY_FORMATTER);
521
        }
522
        
523
        @Override
524
        public String toString(Formatter<Value> formatter) {
525
            if( formatter!=null && formatter.canApply(this) ) {
526
                return formatter.format(this);
527
            }
528
            return Objects.toString(this.value, "");
529
        }
530
    }
531

    
532
    public class FunctionBase extends AbstractValue implements Function {
533

    
534
        protected String name;
535
        protected String format;
536
        protected List<Value> parameters;
537

    
538
        public FunctionBase(String name, String format) {
539
            this.name = name;
540
            this.format = format;
541
        }
542

    
543
        public FunctionBase(String name) {
544
            this(name,null);
545
        }
546
        
547
        @Override
548
        public List<Value> parameters() {
549
            if (this.parameters == null) {
550
                this.parameters = new ArrayList<>();
551
            }
552
            return this.parameters;
553
        }
554

    
555
        @Override
556
        public Function parameter(Value parameter) {
557
            this.parameters().add(parameter);
558
            return this;
559
        }
560

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

    
566
        @Override
567
        public void accept(Visitor visitor, VisitorFilter filter) {
568
            super.accept(visitor, filter);
569
            for (Value value : this.parameters) {
570
                value.accept(visitor, filter);
571
            }
572
        }
573

    
574
        @Override
575
        public String toString() {
576
            return this.toString(EMPTY_FORMATTER);
577
        }
578
        
579
        @Override
580
        public String toString(Formatter<Value> formatter) {
581
            if( formatter!=null && formatter.canApply(this) ) {
582
                return formatter.format(this);
583
            }
584
            if( this.format==null ) {
585
                StringBuilder builder = new StringBuilder();
586
                builder.append(name);
587
                builder.append("(");
588
                if (this.parameters != null && !this.parameters.isEmpty()) {
589
                    boolean first = true;
590
                    for (Value value : this.parameters) {
591
                        if( first ) {
592
                            first=false;
593
                            builder.append(value.toString(formatter));
594
                        } else {
595
                            builder.append(", ");
596
                            builder.append(value.toString(formatter));
597
                        }
598
                    }
599
                }
600
                builder.append(")");
601
                return builder.toString();
602
            }
603
            if (this.parameters != null && !this.parameters.isEmpty()) {
604
                List<String> values = new ArrayList<>();
605
                for (Value value : this.parameters) {
606
                    values.add(value.toString(formatter));
607
                }
608
                return MessageFormat.format(format, values.toArray());
609
            } else {
610
                return this.format;
611
            }
612
        }
613
    }
614

    
615
    public class MethodBase extends FunctionBase implements Method {
616

    
617
        private final Value instance;
618
        
619
        public MethodBase(Value instance, String name) {
620
            super(name);
621
            this.instance = instance;
622
        }
623

    
624
        @Override
625
        public Value instance() {
626
            return this.instance;
627
        }
628

    
629
        @Override
630
        public void accept(Visitor visitor, VisitorFilter filter) {
631
            this.instance.accept(visitor, filter);
632
            super.accept(visitor, filter);
633
        }
634
        
635
        @Override
636
        public String toString(Formatter<Value> formatter) {
637
            if( formatter!=null && formatter.canApply(this) ) {
638
                return formatter.format(this);
639
            }
640
            StringBuilder builder = new StringBuilder();
641
            builder.append(this.instance.toString(formatter));
642
            builder.append("->");
643
            builder.append(this.name());
644
            builder.append(name);
645
            builder.append("(");
646
            if (this.parameters != null && !this.parameters.isEmpty()) {
647
                boolean first = true;
648
                for (Value value : this.parameters) {
649
                    if( first ) {
650
                        first=false;
651
                        builder.append(value.toString(formatter));
652
                    } else {
653
                        builder.append(", ");
654
                        builder.append(value.toString(formatter));
655
                    }
656
                }
657
            }
658
            builder.append(")");
659
            return builder.toString();
660
        }
661
    }
662

    
663
    public class BinaryOperatorBase extends AbstractValue implements BinaryOperator {
664

    
665
        protected String name;
666
        protected String format;
667
        protected Value left;
668
        protected Value right;
669

    
670
        public BinaryOperatorBase(String name, String format) {
671
            this.name = name;
672
            this.format = format;
673
        }
674

    
675
        @Override
676
        public String name() {
677
            return this.name;
678
        }
679

    
680
        @Override
681
        public void accept(Visitor visitor, VisitorFilter filter) {
682
            super.accept(visitor, filter);
683
            this.left.accept(visitor, filter);
684
            this.right.accept(visitor, filter);
685
        }
686

    
687
        @Override
688
        public BinaryOperator left(Value operand) {
689
            this.left = operand;
690
            return this;
691
        }
692

    
693
        @Override
694
        public BinaryOperator right(Value operand) {
695
            this.right = operand;
696
            return this;
697
        }
698

    
699
        @Override
700
        public Value left() {
701
            return this.left;
702
        }
703

    
704
        @Override
705
        public Value right() {
706
            return this.right;
707
        }
708

    
709
        @Override
710
        public String toString() {
711
            return this.toString(EMPTY_FORMATTER);
712
        }
713
        
714
        @Override
715
        public String toString(Formatter<Value> formatter) {
716
            if( formatter!=null && formatter.canApply(this) ) {
717
                return formatter.format(this);
718
            }
719
            if( this.format==null ) {
720
                StringBuilder builder = new StringBuilder();
721
                builder.append("(");
722
                builder.append(this.left.toString(formatter));
723
                builder.append(" ");
724
                builder.append(this.name);
725
                builder.append(" ");
726
                builder.append(this.right.toString(formatter));
727
                builder.append(")");
728
                return builder.toString();
729
            } else {
730
                return MessageFormat.format(
731
                        format,
732
                        this.left.toString(formatter),
733
                        this.right.toString(formatter)
734
                );
735
            }
736
        }
737
    }
738

    
739
    protected GeometrySupportType geometrySupportType;
740
    protected Value value;
741

    
742
    public DefaultExpressionBuilder() {
743
        this.geometrySupportType = GeometrySupportType.WKB;
744
    }
745

    
746
    @Override
747
    public boolean isEmpty() {
748
        return value == null;
749
    }
750
    
751
    @Override
752
    public ExpressionBuilder createExpressionBuilder() {
753
        return new DefaultExpressionBuilder();
754
    }
755

    
756
    @Override
757
    public GeometrySupportType geometry_support_type() {
758
        return this.geometrySupportType;
759
    }
760

    
761
    @Override
762
    public ExpressionBuilder geometry_support_type(GeometrySupportType geometrySupportType) {
763
        this.geometrySupportType = geometrySupportType;
764
        return this;
765
    }
766

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

    
772
    @Override
773
    public ExpressionBuilder value(Value value) {
774
        this.value = value;
775
        return this;
776
    }
777

    
778
    @Override
779
    public String toString() {
780
        return this.value.toString();
781
    }
782

    
783
    @Override
784
    public String toString(Formatter<Value> formatter) {
785
        return this.value.toString(formatter);
786
    }
787

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

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

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

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

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

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

    
853
    @Override
854
    public String bytearray_x(byte[] data) {
855
        return "x'" + bytearray_hex(data) + "'";
856
    }
857
    
858
    @Override
859
    public Object srs_id(IProjection projection) {
860
        if( projection==null ) {
861
            return 0;
862
        }
863
        return ProjectionUtils.getCode(projection);
864
    }
865

    
866
    @Override
867
    public Constant bytearray(byte[] data) {
868
        return new ConstantBase(data);
869
    }
870
    
871
    @Override
872
    public Constant srs(IProjection projection) {
873
        return constant(projection);
874
    }
875

    
876
    @Override
877
    public Variable variable(String name) {
878
        return new VariableBase(name);
879
    }
880

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

    
909
    @Override
910
    public Group group(Value value) {
911
        return new GroupBase(value);
912
    }
913

    
914
    @Override
915
    public Constant geometry(Geometry geom, IProjection projection) {
916
        geom.setProjection(projection);
917
        return new ConstantBase(geom);
918
    }
919

    
920
    @Override
921
    public Constant geometry(Geometry geom) {
922
        if( geom.getProjection()==null ) {
923
            throw new IllegalArgumentException("The geometry does not have an associated projection. Use 'geometry(Geometry, IProjection)'.");
924
        }
925
        return new ConstantBase(geom);
926
    }
927

    
928
    @Override
929
    public Constant envelope(Envelope envelope, IProjection projection) {
930
        Geometry geom = envelope.getGeometry();
931
        geom.setProjection(projection);
932
        return new ConstantBase(geom);
933
    }
934

    
935
    @Override
936
    public Constant envelope(Envelope envelope) {
937
        if( envelope.getProjection()==null ) {
938
            throw new IllegalArgumentException("The envelope does not have an associated projection. Use 'envelope(Geometry, IProjection)'.");
939
        }
940
        Geometry geom = envelope.getGeometry();
941
        return new ConstantBase(geom);
942
    }
943

    
944
    @Override
945
    public Custom custom(Object value) {
946
        return new CustomBase(value);
947
    }
948

    
949
    @Override
950
    public Method method(Value instance, String name, Value... values) {
951
        MethodBase method = new MethodBase(instance, name);
952
        for (Value theValue : values) {
953
            method.parameter(theValue);
954
        }
955
        return method;
956
    }
957
    
958
    @Override
959
    public Function function(String name, Value... values) {
960
        FunctionBase func = new FunctionBase(name);
961
        for (Value theValue : values) {
962
            func.parameter(theValue);
963
        }
964
        return func;
965
    }
966

    
967
    public Function builtin_function(String name, String format, Value... values) {
968
        FunctionBase func = new FunctionBase(name, format);
969
        for (Value theValue : values) {
970
            func.parameter(theValue);
971
        }
972
        return func;
973
    }
974

    
975
    @Override
976
    public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand) {
977
        return binaryOperator(name, null, leftOperand, rightOperand);
978
    }
979
    
980
    public BinaryOperator binaryOperator(String name, String format, Value leftOperand, Value rightOperand) {
981
        BinaryOperator operator = new BinaryOperatorBase(name, format);
982
        operator.left(leftOperand);
983
        operator.right(rightOperand);
984
        return operator;
985
    }
986

    
987
    @Override
988
    public List<Variable> variables() {
989
        final Set<Variable> vars = new HashSet<>();
990
        this.accept(new Visitor() {
991
            @Override
992
            public void visit(Visitable value) {
993
                if( !vars.contains((Variable)value) ) {
994
                    vars.add((Variable)value);
995
                }
996
            }
997
        }, new ClassVisitorFilter(Variable.class));
998
        List<Variable> lvars = new ArrayList<>(vars);
999
        Collections.sort(lvars);
1000
        return lvars;
1001
    }
1002

    
1003
    @Override
1004
    public List<Parameter> parameters() {
1005
        final List<Parameter>  params = new ArrayList<>();
1006
        this.accept(new Visitor() {
1007
            @Override
1008
            public void visit(Visitable value) {
1009
                params.add((Parameter) value);
1010
            }
1011
        }, new ClassVisitorFilter(Parameter.class));
1012
        return params;
1013
    }
1014
    
1015
    @Override
1016
    public List<String> parameters_names() {
1017
        List<String> params = new ArrayList<>();
1018
        for (Parameter param : parameters()) {
1019
            Object theValue = param.value();
1020
            String s;
1021
            switch(param.type()) {
1022
                case Constant:
1023
                    if( theValue==null ) {
1024
                        s = "NULL";
1025
                    } else if( theValue instanceof String ) {
1026
                        s = "'" + (String)theValue + "'";
1027
                        
1028
                    } else if( theValue instanceof byte[] ) {
1029
                        s = bytearray_0x((byte[]) theValue);
1030
                        
1031
                    } else {
1032
                        s = theValue.toString();
1033
                    }    
1034
                    break;
1035
                case Geometry:
1036
                    if( param.name()==null ) {
1037
                        s = bytearray_0x((byte[]) theValue);
1038
                    } else {
1039
                        s = "\"" + param.name() + "\"";
1040
                    }
1041
                    break;
1042
                case Variable:
1043
                default:
1044
                    s = "\"" + param.name() + "\"";
1045
            }
1046
//            if( !params.contains(s) ) { // Ojo que deben ir todos, incluso duplicados.
1047
                params.add(s);
1048
//            }
1049
        }
1050
        // Collections.sort(params); Ojo, no deben ordenarse.
1051
        return params;
1052
    }
1053
    
1054
    @Override
1055
    public List<String> variables_names() {
1056
        List<String> vars = new ArrayList<>();
1057
        for (Variable var : this.variables()) {
1058
            vars.add(var.name());
1059
        }
1060
        Collections.sort(vars);
1061
        return vars;
1062
    }
1063
    
1064
    @Override
1065
    public Function as_geometry(Value value) {
1066
        return builtin_function(FUNCTION_ST_ASBINARY, FORMAT_ST_ASBINARY, value);
1067
    }
1068

    
1069
    @Override
1070
    public ExpressionBuilder set(Value value) {
1071
        this.value = value;
1072
        return this;
1073
    }
1074

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

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

    
1095
    @Override
1096
    public Function ST_Intersects(Value geom1, Value geom2) {
1097
        return builtin_function(FUNCTION_ST_INTERSECTS, FORMAT_ST_INTERSECTS, geom1, geom2);
1098
    }
1099

    
1100
    @Override
1101
    public Function ST_SRID(Value geom) {
1102
        return builtin_function(FUNCTION_ST_SRID, FORMAT_ST_SRID, geom);
1103
    }
1104

    
1105
    @Override
1106
    public Function ST_Envelope(Value geom) {
1107
        return builtin_function(FUNCTION_ST_ENVELOPE, FORMAT_ST_ENVELOPE, geom);
1108
    }
1109

    
1110
    @Override
1111
    public Function ST_AsText(Value geom) {
1112
        return builtin_function(FUNCTION_ST_ASTEXT, FORMAT_ST_ASTEXT, geom);
1113
    }
1114

    
1115
    @Override
1116
    public Function ST_AsBinary(Value geom) {
1117
        return builtin_function(FUNCTION_ST_ASBINARY, FORMAT_ST_ASBINARY, geom);
1118
    }
1119

    
1120
    @Override
1121
    public Function ST_AsEWKB(Value geom) {
1122
        return builtin_function(FUNCTION_ST_ASEWKB, FORMAT_ST_ASEWKB, geom);
1123
    }
1124

    
1125
    @Override
1126
    public Function ST_GeomFromText(Value geom, Value crs) {
1127
        return builtin_function(FUNCTION_ST_GEOMFROMTEXT, FORMAT_ST_GEOMFROMTEXT, geom, crs);
1128
    }
1129

    
1130
    @Override
1131
    public Function ST_GeomFromWKB(Value geom, Value crs) {
1132
        return builtin_function(FUNCTION_ST_GEOMFROMWKB, FORMAT_ST_GEOMFROMWKB, geom, crs);
1133
    }
1134

    
1135
    @Override
1136
    public Function ST_GeomFromEWKB(Value geom, Value crs) {
1137
        return builtin_function(FUNCTION_ST_GEOMFROMEWKB, FORMAT_ST_GEOMFROMEWKB, geom, crs);
1138
    }
1139

    
1140
    @Override
1141
    public Function ST_Simplify(Value geom, Value tolerance) {
1142
        return builtin_function(FUNCTION_ST_SIMPLIFY, FORMAT_ST_SIMPLIFY, tolerance);
1143
    }
1144

    
1145
    @Override
1146
    public Function ST_Disjoint(Value geom1, Value geom2) {
1147
        return builtin_function(FUNCTION_ST_DISJOINT, FORMAT_ST_DISJOINT, geom1, geom2);
1148
    }
1149

    
1150
    @Override
1151
    public Function ST_Contains(Value geom1, Value geom2) {
1152
        return builtin_function(FUNCTION_ST_CONTAINS, FORMAT_ST_CONTAINS, geom1, geom2);
1153
    }
1154

    
1155
    @Override
1156
    public Function ST_Equals(Value geom1, Value geom2) {
1157
        return builtin_function(FUNCTION_ST_EQUALS, FORMAT_ST_EQUALS, geom1, geom2);
1158
    }
1159

    
1160
    @Override
1161
    public Function ST_Crosses(Value geom1, Value geom2) {
1162
        return builtin_function(FUNCTION_ST_CROSSES, FORMAT_ST_CROSSES, geom1, geom2);
1163
    }
1164

    
1165
    @Override
1166
    public Function ST_IsClosed(Value geom) {
1167
        return builtin_function(FUNCTION_ST_ISCLOSED, FORMAT_ST_ISCLOSED, geom);
1168
    }
1169

    
1170
    @Override
1171
    public Function ST_Overlaps(Value geom1, Value geom2) {
1172
        return builtin_function(FUNCTION_ST_OVERLAPS, FORMAT_ST_OVERLAPS, geom1, geom2);
1173
    }
1174

    
1175
    @Override
1176
    public Function ST_Touches(Value geom1, Value geom2) {
1177
        return builtin_function(FUNCTION_ST_TOUCHES, FORMAT_ST_TOUCHES, geom1, geom2);
1178
    }
1179

    
1180
    @Override
1181
    public Function ST_Within(Value geom1, Value geom2) {
1182
        return builtin_function("ST_Within", FORMAT_ST_WITHIN, geom1, geom2);
1183
    }
1184

    
1185
    @Override
1186
    public Function is_null(Value value) {
1187
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
1188
    }
1189

    
1190
    @Override
1191
    public Function not_is_null(Value value) {
1192
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
1193
    }
1194

    
1195
    @Override
1196
    public Function not(Value value) {
1197
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
1198
    }
1199

    
1200
    @Override
1201
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
1202
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
1203
    }
1204

    
1205
    @Override
1206
    public BinaryOperator and(Expression leftOperand, Expression rightOperand) {
1207
        return binaryOperator(
1208
                OPERATOR_AND, 
1209
                FORMAT_OPERATOR_AND, 
1210
                leftOperand.getCode().toValue(), 
1211
                rightOperand.getCode().toValue()
1212
        );
1213
    }
1214

    
1215
    @Override
1216
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
1217
        return binaryOperator(
1218
                OPERATOR_AND, 
1219
                FORMAT_OPERATOR_AND, 
1220
                leftOperand.getCode().toValue(), 
1221
                rightOperand
1222
        );
1223
    }
1224

    
1225
    @Override
1226
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
1227
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
1228
    }
1229

    
1230
    @Override
1231
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
1232
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
1233
    }
1234

    
1235
    @Override
1236
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
1237
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
1238
    }
1239

    
1240
    @Override
1241
    public BinaryOperator gt(Value op1, Value op2) {
1242
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
1243
    }
1244

    
1245
    @Override
1246
    public BinaryOperator ge(Value op1, Value op2) {
1247
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
1248
    }
1249

    
1250
    @Override
1251
    public BinaryOperator lt(Value op1, Value op2) {
1252
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
1253
    }
1254

    
1255
    @Override
1256
    public BinaryOperator le(Value op1, Value op2) {
1257
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
1258
    }
1259

    
1260
    @Override
1261
    public BinaryOperator like(Value op1, Value op2) {
1262
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
1263
    }
1264

    
1265
    @Override
1266
    public BinaryOperator ilike(Value op1, Value op2) {
1267
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
1268
    }
1269

    
1270
    @Override
1271
    public BinaryOperator add(Value op1, Value op2) {
1272
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1273
    }
1274

    
1275
    @Override
1276
    public BinaryOperator subst(Value op1, Value op2) {
1277
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1278
    }
1279

    
1280
    @Override
1281
    public BinaryOperator mult(Value op1, Value op2) {
1282
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1283
    }
1284

    
1285
    @Override
1286
    public BinaryOperator div(Value op1, Value op2) {
1287
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1288
    }
1289

    
1290
    @Override
1291
    public BinaryOperator concat(Value op1, Value op2) {
1292
        return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, op1, op2);
1293
    }
1294
    
1295
    @Override
1296
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1297
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1298
    }
1299

    
1300
    @Override
1301
    public Function ifnull(Value value, Value iftrue, Value iffalse) {
1302
        return function(FUNCTION_IFNULL, value, iftrue, iffalse);
1303
    }
1304
    
1305
    @Override
1306
    public Function left(Value str, Value size) {
1307
       return function(FUNCTION_LEFT, str, size);
1308
    }
1309
    
1310
    @Override
1311
    public Function right(Value str, Value len) {
1312
       return function(FUNCTION_RIGHT, str, len);
1313
    }
1314
    
1315
    @Override
1316
    public Function locate(Value search, Value str, Value start) {
1317
       return function(FUNCTION_LOCATE, search, str, start);
1318
    }
1319
    
1320
    @Override
1321
    public Function position(Value search, Value str) {
1322
       return function(FUNCTION_POSITION, search, str);
1323
    }
1324
    
1325
    @Override
1326
    public Function lpad(Value str, Value len, Value padstr) {
1327
       return function(FUNCTION_LPAD, str, len, padstr);
1328
    }
1329
    
1330
    @Override
1331
    public Function rpad(Value str, Value len, Value padstr) {
1332
       return function(FUNCTION_RPAD, str, len, padstr);
1333
    }
1334
    
1335
    @Override
1336
    public Function ltrim(Value str) {
1337
       return function(FUNCTION_LTRIM, str);
1338
    }
1339
    
1340
    @Override
1341
    public Function rtrim(Value str) {
1342
       return function(FUNCTION_RTRIM, str);
1343
    }
1344
    
1345
    @Override
1346
    public Function trim(Value str) {
1347
       return function(FUNCTION_TRIM, str);
1348
    }
1349
    
1350
    @Override
1351
    public Function repeat(Value str, Value size) {
1352
       return function(FUNCTION_REPEAT, str, size);
1353
    }
1354
    
1355
    @Override
1356
    public Function replace(Value str, Value search, Value replstr) {
1357
       return function(FUNCTION_REPLACE, str, search, replstr);
1358
    }
1359
    
1360
    @Override
1361
    public Function ascii(Value str) {
1362
       return function(FUNCTION_ASCII, str);
1363
    }
1364
    
1365
    @Override
1366
    public Function lenght(Value str) {
1367
       return function(FUNCTION_LENGHT, str);
1368
    }
1369

    
1370
    @Override
1371
    public Function instr(Value str, Value search, Value start) {
1372
       return function(FUNCTION_INSTR, str, search, start);
1373
    }
1374
    
1375
    @Override
1376
    public Function lower(Value str) {
1377
       return function(FUNCTION_LOWER, str);
1378
    }
1379
    
1380
    @Override
1381
    public Function upper(Value str) {
1382
       return function(FUNCTION_UPPER, str);
1383
    }
1384
    
1385
    @Override
1386
    public Function space(Value size) {
1387
       return function(FUNCTION_SPACE, size);
1388
    }
1389
    
1390
    @Override
1391
    public Function substring(Value str, Value start, Value len) {
1392
       return function(FUNCTION_SUBSTRING, str, start, len);
1393
    }
1394
    
1395
    @Override
1396
    public Function acos(Value num) {
1397
       return function(FUNCTION_ACOS, num);
1398
    } 
1399
    
1400
    @Override
1401
    public Function asin(Value num) {
1402
       return function(FUNCTION_ASIN, num);
1403
    }
1404
    
1405
    @Override
1406
    public Function atan(Value num) {
1407
       return function(FUNCTION_ATAN, num);
1408
    }
1409
    
1410
    @Override
1411
    public Function cos(Value num) {
1412
       return function(FUNCTION_COS, num);
1413
    }
1414
    
1415
    @Override
1416
    public Function cosh(Value num) {
1417
       return function(FUNCTION_COSH, num);
1418
    }
1419
    
1420
    @Override
1421
    public Function cot(Value num) {
1422
       return function(FUNCTION_COT, num);
1423
    }  
1424
    
1425
    @Override
1426
    public Function bitand(Value num1, Value num2) {
1427
       return function(FUNCTION_BITAND, num1, num2);
1428
    } 
1429
    
1430
    @Override
1431
    public Function bitor(Value num1, Value num2) {
1432
       return function(FUNCTION_BITOR, num1, num2);
1433
    }
1434
    
1435
    @Override
1436
    public Function bitxor(Value num1, Value num2) {
1437
       return function(FUNCTION_BITXOR, num1, num2);
1438
    }
1439
    
1440
    @Override
1441
    public Function ceil(Value num) {
1442
       return function(FUNCTION_CEIL, num);
1443
    }
1444
    
1445
    @Override
1446
    public Function degrees(Value num) {
1447
       return function(FUNCTION_DEGREES, num);
1448
    }  
1449
    
1450
    @Override
1451
    public Function exp(Value num) {
1452
       return function(FUNCTION_EXP, num);
1453
    }  
1454
    
1455
    @Override
1456
    public Function floor(Value num) {
1457
       return function(FUNCTION_FLOOR, num);
1458
    }  
1459
    
1460
    @Override
1461
    public Function log(Value num) {
1462
       return function(FUNCTION_LOG, num);
1463
    }  
1464
    
1465
    @Override
1466
    public Function log10(Value num) {
1467
       return function(FUNCTION_LOG10, num);
1468
    }  
1469
    
1470
    @Override
1471
    public Function pi(Value num) {
1472
       return function(FUNCTION_PI, num);
1473
    }
1474
    
1475
    @Override
1476
    public Function power(Value num) {
1477
       return function(FUNCTION_POWER, num);
1478
    }
1479
    
1480
    @Override
1481
    public Function radians(Value num) {
1482
       return function(FUNCTION_RADIANS, num);
1483
    }
1484
    
1485
    @Override
1486
    public Function rand(Value num) {
1487
       return function(FUNCTION_RAND, num);
1488
    }
1489
    
1490
    @Override
1491
    public Function round(Value num) {
1492
       return function(FUNCTION_ROUND, num);
1493
    }
1494
    
1495
    @Override
1496
    public Function sqrt(Value num) {
1497
       return function(FUNCTION_SQRT, num);
1498
    }
1499
    
1500
    @Override
1501
    public Function sign(Value num) {
1502
       return function(FUNCTION_SIGN, num);
1503
    }
1504
    
1505
    @Override
1506
    public Function sin(Value num) {
1507
       return function(FUNCTION_SIN, num);
1508
    }
1509
    
1510
    @Override
1511
    public Function sinh(Value num) {
1512
       return function(FUNCTION_SINH, num);
1513
    }
1514
    
1515
    @Override
1516
    public Function tan(Value num) {
1517
       return function(FUNCTION_TAN, num);
1518
    }
1519
    @Override
1520
    public Function tanh(Value num) {
1521
       return function(FUNCTION_TANH, num);
1522
    }  
1523
    
1524
    @Override
1525
    public Function zero() {
1526
       return function(FUNCTION_ZERO);
1527
    }
1528
    
1529
    @Override
1530
    public Function chr(Value num) {
1531
       return function(FUNCTION_CHR, num);
1532
    }    
1533

    
1534
    @Override
1535
    public Function ST_ExtentAggregate(Value geom) {
1536
       return function(FUNCTION_ST_EXTENTAGGREGATE, geom);
1537
    }
1538

    
1539
    @Override
1540
    public Function ST_UnionAggregate(Value geom) {
1541
       return function(FUNCTION_ST_UNIONAGGREGATE, geom);
1542
    }
1543

    
1544
    @Override
1545
    public Function cast(Value object, Value typeName) {
1546
       return function(FUNCTION_CAST, object, typeName);
1547
    }    
1548

    
1549
    @Override
1550
    public Function decode(Value value, Value format) {
1551
       return function(FUNCTION_DECODE, value, format);
1552
    }    
1553

    
1554
    @Override
1555
    public Function toDouble(Value num) {
1556
       return function(FUNCTION_TODOUBLE, num);
1557
    }    
1558

    
1559
    @Override
1560
    public Function toFloat(Value num) {
1561
       return function(FUNCTION_TOFLOAT, num);
1562
    }    
1563

    
1564
    @Override
1565
    public Function toLong(Value num) {
1566
       return function(FUNCTION_TOLONG, num);
1567
    }    
1568

    
1569
    @Override
1570
    public Function toInteger(Value num) {
1571
       return function(FUNCTION_TOINTEGER, num);
1572
    }    
1573

    
1574
    @Override
1575
    public Function toStr(Value object) {
1576
       return function(FUNCTION_TOSTR, object);
1577
    }    
1578

    
1579
    @Override
1580
    public Function ST_Point(Value x, Value y) {
1581
       return function(FUNCTION_ST_POINT, x, y);
1582
    }
1583

    
1584
    @Override
1585
    public Function ST_SetSRID(Value geom, Value srid) {
1586
       return function(FUNCTION_ST_POINT, geom, srid);
1587
    }
1588

    
1589
    @Override
1590
    public Function list() {
1591
        return function(FUNCTION_LIST);
1592
    }
1593
}