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

History | View | Annotate | Download (40.8 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.apache.commons.lang3.tuple.ImmutablePair;
12
import org.apache.commons.lang3.tuple.Pair;
13
import org.gvsig.expressionevaluator.Code;
14
import org.gvsig.expressionevaluator.Expression;
15

    
16
import org.gvsig.expressionevaluator.ExpressionBuilder;
17
import static org.gvsig.expressionevaluator.ExpressionBuilder.EMPTY_FORMATTER;
18
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_CONSTANT;
19
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE;
20
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
21
import org.gvsig.expressionevaluator.ExpressionUtils;
22
import org.gvsig.expressionevaluator.Formatter;
23

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

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

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

    
35
    private static final String FORMAT_ISNULL = "( ({0}) IS NULL )";
36
    private static final String FORMAT_NOTISNULL = "( ({0}) IS NOT NULL )";
37
    private static final String FORMAT_OPERATOR_NOT = "( NOT ({0}) )";
38

    
39
    private static final String FORMAT_OPERATOR_AND = "({0} AND {1})";
40
    private static final String FORMAT_OPERATOR_OR = "{0} OR {1}";
41
    private static final String FORMAT_OPERATOR_EQ = "( ({0}) = ({1}) )";
42
    private static final String FORMAT_OPERATOR_NE = "( ({0}) <> ({1}) )";
43
    private static final String FORMAT_OPERATOR_GT = "( ({0}) > ({1}) )";
44
    private static final String FORMAT_OPERATOR_GE = "( ({0}) >= ({1}) )";
45
    private static final String FORMAT_OPERATOR_LT = "( ({0}) < ({1}) )";
46
    private static final String FORMAT_OPERATOR_LE = "( ({0}) <= ({1}) )";
47
    private static final String FORMAT_OPERATOR_LIKE = "( ({0}) LIKE ({1}) )";
48
    private static final String FORMAT_OPERATOR_ILIKE = "( ({0}) ILIKE ({1}) )";
49
    private static final String FORMAT_OPERATOR_ADD = "{0} + {1}";
50
    private static final String FORMAT_OPERATOR_SUBST = "{0} - {1}";
51
    private static final String FORMAT_OPERATOR_MULT = "({0} * {1})";
52
    private static final String FORMAT_OPERATOR_DIV = "({0} / {1})";
53
    private static final String FORMAT_OPERATOR_CONCAT = "{0} || {1}";
54

    
55
    public static class GroupBase extends AbstractValue implements Group {
56

    
57
        protected Value value;
58

    
59
        public GroupBase(Value value) {
60
            this.value = value;
61
        }
62

    
63
        @Override
64
        public Value value() {
65
            return value;
66
        }
67

    
68
        @Override
69
        public void accept(Visitor visitor, VisitorFilter filter) {
70
            super.accept(visitor, filter);
71
            this.value.accept(visitor, filter);
72
        }
73

    
74
        @Override
75
        public void replace(Value target, Value replacement) {
76
            if( this.value == target ) {
77
                this.value = replacement;
78
            } else {
79
                this.value.replace(target, replacement);
80
            }
81
        }
82

    
83
        @Override
84
        public String toString() {
85
            return this.toString(EMPTY_FORMATTER);
86
        }
87
        
88
        @Override
89
        public String toString(Formatter<Value> formatter) {
90
            if( formatter!=null && formatter.canApply(this) ) {
91
                return formatter.format(this);
92
            }
93
            return MessageFormat.format(FORMAT_GROUP, this.value.toString());
94
        }
95
    }
96

    
97
    public static class VariableBase extends AbstractValue implements Variable {
98

    
99
        protected String name;
100
        protected ExpressionBuilder builder;
101
        
102
        public VariableBase(ExpressionBuilder builder, String name) {
103
            this.name = name;
104
            this.builder = builder;
105
        }
106

    
107
        @Override
108
        public String name() {
109
            return this.name;
110
        }
111

    
112
        @Override
113
        public String toString() {
114
            return this.toString(EMPTY_FORMATTER);
115
        }
116
        
117
        @Override
118
        public String toString(Formatter<Value> formatter) {
119
            if( formatter!=null && formatter.canApply(this) ) {
120
                return formatter.format(this);
121
            }
122
            return this.builder.identifier(this.name);
123
        }
124

    
125
        @Override
126
        public int compareTo(Variable o) {
127
            return this.name.compareTo(o.name());
128
        }
129

    
130
        @Override
131
        public boolean equals(Object obj) {
132
            if (!(obj instanceof Variable)) {
133
                return false;
134
            }
135
            return this.name.equals(((Variable) obj).name());
136
        }
137

    
138
        @Override
139
        public int hashCode() {
140
            int hash = 7;
141
            hash = 37 * hash + Objects.hashCode(this.name);
142
            return hash;
143
        }
144
    }
145

    
146
    public static class ParameterBase extends AbstractValue implements Parameter {
147

    
148
        protected String name;
149
        protected Object value;
150
        protected int type;
151

    
152
        public ParameterBase() {
153
            this.type = PARAMETER_TYPE_CONSTANT;
154
            this.name = null;
155
            this.value = null;
156
        }
157

    
158
        @Override
159
        public Parameter as_constant() {
160
            this.type = PARAMETER_TYPE_CONSTANT;
161
            if (this.value == null && this.name != null) {
162
                this.value = this.name;
163
            }
164
            return this;
165
        }
166

    
167
        @Override
168
        public Parameter as_variable() {
169
            this.type = PARAMETER_TYPE_VARIABLE;
170
            if (this.value != null && this.name == null) {
171
                this.name = (String) this.value;
172
            }
173
            return this;
174
        }
175
        
176
        @Override
177
        public String name() {
178
            switch (this.type) {
179
                case PARAMETER_TYPE_VARIABLE:
180
                    return this.name;
181
                case PARAMETER_TYPE_CONSTANT:
182
                    if (this.value == null) {
183
                        return null;
184
                    }
185
                    return this.value.toString();
186
                default:
187
                    if (this.name != null) {
188
                        return this.name;
189
                    }
190
                    if (this.value != null) {
191
                        return this.value.toString();
192
                    }
193
                    return null;
194
            }
195
        }
196

    
197
        @Override
198
        public int type() {
199
            return this.type;
200
        }
201

    
202
        @Override
203
        public boolean is_constant() {
204
            return this.type == PARAMETER_TYPE_CONSTANT;
205
        }
206

    
207
        @Override
208
        public boolean is_variable() {
209
            return this.type == PARAMETER_TYPE_VARIABLE;
210
        }
211

    
212
        @Override
213
        public Parameter value(Object value) {
214
            this.value = value;
215
            return this;
216
        }
217

    
218
        @Override
219
        public Parameter name(String name) {
220
            this.type = PARAMETER_TYPE_VARIABLE;
221
            this.name = name;
222
            return this;
223
        }
224

    
225
        @Override
226
        public Object value() {
227
            try {
228
                switch (this.type) {
229
                    case PARAMETER_TYPE_CONSTANT:
230
                        return this.value;
231
                    case PARAMETER_TYPE_VARIABLE:
232
                    default:
233
                        return this.value;
234
                }
235
            } catch (Exception ex) {
236
                throw new RuntimeException("Can't get value from parameter.", ex);
237
            }
238
        }
239

    
240
        @Override
241
        public String toString() {
242
            return this.toString(EMPTY_FORMATTER);
243
        }
244
        
245
        @Override
246
        public String toString(Formatter<Value> formatter) {
247
            if( formatter!=null && formatter.canApply(this) ) {
248
                return formatter.format(this);
249
            }
250
            switch (this.type) {
251
                case PARAMETER_TYPE_CONSTANT:
252
                    return Objects.toString(this.value);
253
                    
254
                case PARAMETER_TYPE_VARIABLE:
255
                default:
256
                    return "?";
257
            }
258
        }
259
    }
260

    
261
    public static class ConstantBase extends AbstractValue implements Constant {
262

    
263
        protected Object value;
264
        protected ExpressionBuilder builder;
265
        
266
        public ConstantBase(ExpressionBuilder builder, Object value) {
267
            this.value = value;
268
            this.builder = builder;
269
        }
270

    
271
        @Override
272
        public Object value() {
273
            return this.value;
274
        }
275

    
276
        @Override
277
        public String toString() {
278
            return this.toString(EMPTY_FORMATTER);
279
        }
280
        
281
        @Override
282
        public String toString(Formatter<Value> formatter) {
283
            if( formatter!=null && formatter.canApply(this) ) {
284
                return formatter.format(this);
285
            }
286
            if( this.value==null ) {
287
                return "NULL";
288
            }
289
            if( this.value instanceof byte[] ) {
290
                return "DECODE('"+this.builder.bytearray_hex((byte[])this.value)+"','hex')";
291
            }
292
            if (this.value instanceof String) {
293
                return this.builder.string((String) this.value);
294
            }
295
            if (this.value instanceof Boolean) {
296
                if (((Boolean) this.value)) {
297
                    return FORMAT_TRUE;
298
                } else {
299
                    return FORMAT_FALSE;
300
                }
301
            }
302
            return Objects.toString(this.value, "");
303
        }
304
    }
305

    
306
    public static class CustomBase extends AbstractValue implements Custom {
307

    
308
        protected Object value;
309

    
310
        // Esto es para permitir declarar parametros y columnas en una seccion
311
        // custom.
312
        protected List<Value> values;
313

    
314
        public CustomBase(Object value) {
315
            this.value = value;
316
        }
317

    
318
        @Override
319
        public void accept(Visitor visitor, VisitorFilter filter) {
320
            super.accept(visitor, filter);
321
            if (this.values != null) {
322
                for (Value theValue : values) {
323
                    theValue.accept(visitor, filter);
324
                }
325
            }
326
        }
327

    
328
        @Override
329
        public void replace(Value target, Value replacement) {
330
            if( this.values == null ) {
331
                return;
332
            }
333
            for (int i = 0; i < values.size(); i++) {
334
                Value theValue = values.get(i);
335
                if( target == theValue ) {
336
                    values.set(i, replacement);
337
                } else {
338
                    theValue.replace(target, replacement);
339
                }
340
            }
341
        }
342

    
343
        @Override
344
        public Object value() {
345
            return this.value;
346
        }
347

    
348
        @Override
349
        public Custom add(Variable variable) {
350
            if (this.values == null) {
351
                this.values = new ArrayList<>();
352
            }
353
            this.values.add(variable);
354
            return this;
355
        }
356

    
357
        @Override
358
        public Custom add(Parameter parameter) {
359
            if (this.values == null) {
360
                this.values = new ArrayList<>();
361
            }
362
            this.values.add(parameter);
363
            return this;
364
        }
365

    
366
        @Override
367
        public String toString() {
368
            return this.toString(EMPTY_FORMATTER);
369
        }
370
        
371
        @Override
372
        public String toString(Formatter<Value> formatter) {
373
            if( formatter!=null && formatter.canApply(this) ) {
374
                return formatter.format(this);
375
            }
376
            return Objects.toString(this.value, "");
377
        }
378
    }
379

    
380
    public static class FunctionBase extends AbstractValue implements Function {
381

    
382
        protected String name;
383
        protected String format;
384
        protected List<Pair<String,Value>> parameters;
385

    
386
        public FunctionBase(String name, String format) {
387
            this.name = name;
388
            this.format = format;
389
        }
390

    
391
        public FunctionBase(String name) {
392
            this(name,null);
393
        }
394

    
395
        @Override
396
        public Value getParameter(String name) {
397
          for (Pair<String, Value> parameter : parameters) {
398
            if( parameter!=null && StringUtils.equalsIgnoreCase(name, parameter.getKey()) ) {
399
              return parameter.getValue();
400
            }
401
          }
402
          return null;
403
        }
404

    
405
        @Override
406
        public boolean containsParameter(String name, int index) {
407
          String argNameX = name + String.valueOf(index).trim();
408
          for (Pair<String, Value> arg : this.parameters) {
409
            if( StringUtils.equalsIgnoreCase(arg.getKey(), argNameX) ) {
410
              return true;
411
            }
412
          }
413
          return false;
414
        }
415

    
416
        @Override
417
        public Value getParameter(String name, int index) {
418
          String argNameX = name + String.valueOf(index).trim();
419
          for (Pair<String, Value> arg : this.parameters) {
420
            if( StringUtils.equalsIgnoreCase(arg.getKey(), argNameX) ) {
421
              return arg.getValue();
422
            }
423
          }
424
          return null;
425
        }
426

    
427
        @Override
428
        public List<Pair<String,Value>> parameters() {
429
            if (this.parameters == null) {
430
                this.parameters = new ArrayList<>();
431
            }
432
            return this.parameters;
433
        }
434

    
435
        @Override
436
        public Function parameter(Value parameter) {
437
            this.parameters().add(new ImmutablePair<>(null,parameter));
438
            return this;
439
        }
440

    
441
        @Override
442
        public Function parameter(String name, Value parameter) {
443
            this.parameters().add(new ImmutablePair<>(name,parameter));
444
            return this;
445
        }
446

    
447
        @Override
448
        public String name() {
449
            return this.name;
450
        }
451

    
452
        @Override
453
        public void accept(Visitor visitor, VisitorFilter filter) {
454
            super.accept(visitor, filter);
455
            if( this.parameters!=null ) {
456
                for (Pair<String,Value> argument : this.parameters) {
457
                    if( argument!=null ) {
458
                        argument.getValue().accept(visitor, filter);
459
                    }
460
                }
461
            }
462
        }
463

    
464
        @Override
465
        public void replace(Value target, Value replacement) {
466
            for (int i = 0; i < parameters.size(); i++) {
467
                Pair<String, Value> argument = parameters.get(i);
468
                if( argument.getValue() == target ) {
469
                    parameters.set(i, new ImmutablePair<>(argument.getKey(),replacement));
470
                } else {
471
                    argument.getValue().replace(target, replacement);
472
                }
473
            }
474
        }
475
        
476
        @Override
477
        public String toString() {
478
            return this.toString(EMPTY_FORMATTER);
479
        }
480
        
481
        @Override
482
        public String toString(Formatter<Value> formatter) {
483
            if( formatter!=null && formatter.canApply(this) ) {
484
                return formatter.format(this);
485
            }
486
            if( this.format==null ) {
487
                StringBuilder builder = new StringBuilder();
488
                builder.append(name);
489
                builder.append("(");
490
                if (this.parameters != null && !this.parameters.isEmpty()) {
491
                    boolean first = true;
492
                    for (Pair<String,Value> argument : this.parameters) {
493
                        if( first ) {
494
                            first=false;
495
                            if( argument.getKey()!=null ) {
496
                              builder.append(argument.getKey());
497
                              builder.append(":");  
498
                            }
499
                            builder.append(argument.getValue().toString(formatter));
500
                        } else {
501
                            builder.append(", ");
502
                            if( argument.getKey()!=null ) {
503
                              builder.append(argument.getKey());
504
                              builder.append(":");  
505
                            }
506
                            builder.append(argument.getValue().toString(formatter));
507
                        }
508
                    }
509
                }
510
                builder.append(")");
511
                return builder.toString();
512
            }
513
            if (this.parameters != null && !this.parameters.isEmpty()) {
514
                List<String> values = new ArrayList<>();
515
                for (Pair<String,Value> argument : this.parameters) {
516
                    values.add(argument.getValue().toString(formatter));
517
                }
518
                return MessageFormat.format(format, values.toArray());
519
            } else {
520
                return this.format;
521
            }
522
        }
523
    }
524

    
525
    public class MethodBase extends FunctionBase implements Method {
526

    
527
        private Value instance;
528
        
529
        public MethodBase(Value instance, String name) {
530
            super(name);
531
            this.instance = instance;
532
        }
533

    
534
        @Override
535
        public Value instance() {
536
            return this.instance;
537
        }
538

    
539
        @Override
540
        public void accept(Visitor visitor, VisitorFilter filter) {
541
            this.instance.accept(visitor, filter);
542
            super.accept(visitor, filter);
543
        }
544

    
545
        @Override
546
        public void replace(Value target, Value replacement) {
547
            if( this.instance == target ) {
548
                this.instance = replacement;
549
            } else {
550
                this.instance.replace(target, replacement);
551
            }
552
        }
553
        
554
        @Override
555
        public String toString(Formatter<Value> formatter) {
556
            if( formatter!=null && formatter.canApply(this) ) {
557
                return formatter.format(this);
558
            }
559
            StringBuilder builder = new StringBuilder();
560
            builder.append(this.instance.toString(formatter));
561
            builder.append("->");
562
            builder.append(this.name());
563
            builder.append("(");
564
            if (this.parameters != null && !this.parameters.isEmpty()) {
565
                boolean first = true;
566
                for (Pair<String,Value> argument : this.parameters) {
567
                    if( first ) {
568
                        first=false;
569
                        builder.append(argument.getValue().toString(formatter));
570
                    } else {
571
                        builder.append(", ");
572
                        builder.append(argument.getValue().toString(formatter));
573
                    }
574
                }
575
            }
576
            builder.append(")");
577
            return builder.toString();
578
        }
579
    }
580

    
581
    public class BinaryOperatorBase extends AbstractValue implements BinaryOperator {
582

    
583
        protected String name;
584
        protected String format;
585
        protected Value left;
586
        protected Value right;
587

    
588
        public BinaryOperatorBase(String name, String format) {
589
            this.name = name;
590
            this.format = format;
591
        }
592

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

    
598
        @Override
599
        public void replace(Value target, Value replacement) {
600
            if( target == this.left ) {
601
                this.left = replacement;
602
            } else {
603
                this.left.replace(target, replacement);
604
            }
605
            if( target == this.right ) {
606
                this.right = replacement;
607
            } else {
608
                this.right.replace(target, replacement);
609
            }
610
        }
611
        
612
        @Override
613
        public void accept(Visitor visitor, VisitorFilter filter) {
614
            super.accept(visitor, filter);
615
            this.left.accept(visitor, filter);
616
            this.right.accept(visitor, filter);
617
        }
618

    
619
        @Override
620
        public BinaryOperator left(Value operand) {
621
            this.left = operand;
622
            return this;
623
        }
624

    
625
        @Override
626
        public BinaryOperator right(Value operand) {
627
            this.right = operand;
628
            return this;
629
        }
630

    
631
        @Override
632
        public Value left() {
633
            return this.left;
634
        }
635

    
636
        @Override
637
        public Value right() {
638
            return this.right;
639
        }
640

    
641
        @Override
642
        public String toString() {
643
            return this.toString(EMPTY_FORMATTER);
644
        }
645
        
646
        @Override
647
        public String toString(Formatter<Value> formatter) {
648
            if( formatter!=null && formatter.canApply(this) ) {
649
                return formatter.format(this);
650
            }
651
            if( this.format==null ) {
652
                StringBuilder builder = new StringBuilder();
653
                builder.append("(");
654
                builder.append(this.left.toString(formatter));
655
                builder.append(" ");
656
                builder.append(this.name);
657
                builder.append(" ");
658
                builder.append(this.right.toString(formatter));
659
                builder.append(")");
660
                return builder.toString();
661
            } else {
662
                return MessageFormat.format(
663
                        format,
664
                        this.left.toString(formatter),
665
                        this.right.toString(formatter)
666
                );
667
            }
668
        }
669
    }
670

    
671
    protected Value value;
672
    protected ExpressionEvaluatorManager manager;
673

    
674
    public DefaultExpressionBuilder(ExpressionEvaluatorManager manager) {
675
        this.manager = manager;
676
    }
677

    
678
    @Override
679
    public boolean isEmpty() {
680
        return value == null;
681
    }
682
    
683
    @Override
684
    public ExpressionBuilder createExpressionBuilder() {
685
        return new DefaultExpressionBuilder(this.manager);
686
    }
687

    
688
    @Override
689
    public Value value() {
690
        return this.value;
691
    }
692

    
693
    @Override
694
    public ExpressionBuilder value(Value value) {
695
        this.value = value;
696
        return this;
697
    }
698

    
699
    @Override
700
    public String toString() {
701
        return this.value.toString();
702
    }
703

    
704
    @Override
705
    public String toString(Formatter<Value> formatter) {
706
        return this.value.toString(formatter);
707
    }
708

    
709
    @Override
710
    public Value toValue(String expression) {
711
        try {
712
            Code code = ExpressionUtils.compile(expression);
713
            return code.toValue(this);
714
        } catch(Throwable ex) {
715
            return custom(expression);
716
        }
717
    }
718

    
719
    @Override
720
    public void accept(Visitor visitor, VisitorFilter filter) {
721
        if( this.value == null) {
722
            return;
723
        }
724
        this.value.accept(visitor, filter);
725
    }
726

    
727
    @Override
728
    public String quote_for_identifiers() {
729
        return FORMAT_QUOTE_FOR_IDENTIFIERS;
730
    }
731
    
732
    @Override
733
    public String quote_for_strings() {
734
        return FORMAT_QUOTE_FOR_STRINGS;
735
    }
736
       
737
    @Override
738
    public String string(String s) {
739
        String quote = this.quote_for_strings();
740
//        No se porque no esta disponible wrapIfMissing
741
//        return StringUtils.wrapIfMissing(s,quote);
742
        if (s.startsWith(quote)) {
743
            return s;
744
        }
745
        return quote + StringUtils.replace(s,quote,quote+quote) + quote;
746
    }
747

    
748
    @Override
749
    public String identifier(String id) {
750
        String quote = this.quote_for_identifiers();
751
//        No se porque no esta disponible wrapIfMissing
752
//        return StringUtils.wrapIfMissing(id,quote);
753
        if (id.startsWith(quote)) {
754
            return id;
755
        }
756
        return quote + id + quote;
757
    }
758

    
759
    @Override
760
    public String bytearray_hex(byte[] data) {
761
        StringBuilder builder = new StringBuilder();
762
        for (byte abyte : data) {
763
            int v = abyte & 0xff;
764
            builder.append(String.format("%02x", v));
765
        }
766
        return builder.toString();
767
    }
768

    
769
    @Override
770
    public String bytearray_0x(byte[] data) {
771
        return "0x" + bytearray_hex(data);
772
    }
773

    
774
    @Override
775
    public String bytearray_x(byte[] data) {
776
        return "x'" + bytearray_hex(data) + "'";
777
    }
778
    
779

    
780
    @Override
781
    public Constant bytearray(byte[] data) {
782
        return new ConstantBase(this, data);
783
    }
784
    
785
    @Override
786
    public Variable variable(String name) {
787
        return new VariableBase(this, name);
788
    }
789

    
790
    @Override
791
    public Variable column(String name) {
792
        return new VariableBase(this, name);
793
    }
794
    
795
    @Override
796
    public Parameter parameter(String name) {
797
        List<Parameter> parameters = this.parameters();
798
        for (Parameter parameter : parameters) {
799
            if( StringUtils.equalsIgnoreCase(name, parameter.name()) ) {
800
                return parameter;
801
            }
802
        }
803
        Parameter parameter = this.parameter();
804
        parameter.name(name);
805
        return parameter;
806
    }
807
    
808
    @Override
809
    public Parameter parameter() {
810
        return new ParameterBase();
811
    }
812
    
813
    @Override
814
    public Constant constant(Object value) {
815
        return new ConstantBase(this, value);
816
    }
817

    
818
    @Override
819
    public Group group(Value value) {
820
        return new GroupBase(value);
821
    }
822

    
823
    @Override
824
    public Custom custom(Object value) {
825
        return new CustomBase(value);
826
    }
827

    
828
    @Override
829
    public Method method(Value instance, String name, Value... values) {
830
        MethodBase method = new MethodBase(instance, name);
831
        for (Value theValue : values) {
832
            method.parameter(theValue);
833
        }
834
        return method;
835
    }
836
    
837
    @Override
838
    public Function function(String name, Value... values) {
839
        FunctionBase func = new FunctionBase(name);
840
        for (Value theValue : values) {
841
            func.parameter(theValue);
842
        }
843
        return func;
844
    }
845

    
846
    public Function builtin_function(String name, String format, Value... values) {
847
        FunctionBase func = new FunctionBase(name, format);
848
        for (Value theValue : values) {
849
            func.parameter(theValue);
850
        }
851
        return func;
852
    }
853

    
854
    @Override
855
    public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand) {
856
        return binaryOperator(name, null, leftOperand, rightOperand);
857
    }
858
    
859
    public BinaryOperator binaryOperator(String name, String format, Value leftOperand, Value rightOperand) {
860
        BinaryOperator operator = new BinaryOperatorBase(name, format);
861
        operator.left(leftOperand);
862
        operator.right(rightOperand);
863
        return operator;
864
    }
865

    
866
    @Override
867
    public List<Variable> variables() {
868
        final Set<Variable> vars = new HashSet<>();
869
        this.accept((Visitable value1) -> {
870
          if (!vars.contains((Variable) value1)) {
871
            vars.add((Variable) value1);
872
          }
873
        }, new ClassVisitorFilter(Variable.class));
874
        List<Variable> lvars = new ArrayList<>(vars);
875
        Collections.sort(lvars);
876
        return lvars;
877
    }
878

    
879
    @Override
880
    public List<Parameter> parameters() {
881
        final List<Parameter>  params = new ArrayList<>();
882
        this.accept((Visitable value1) -> {
883
          params.add((Parameter) value1);
884
        }, new ClassVisitorFilter(Parameter.class));
885
        return params;
886
    }
887
    
888
    @Override
889
    public List<String> parameters_names() {
890
        List<String> params = new ArrayList<>();
891
        for (Parameter param : parameters()) {
892
            Object theValue = param.value();
893
            String s;
894
            switch(param.type()) {
895
                case PARAMETER_TYPE_CONSTANT:
896
                    if( theValue==null ) {
897
                        s = "NULL";
898
                    } else if( theValue instanceof String ) {
899
                        s = "'" + (String)theValue + "'";
900
                        
901
                    } else if( theValue instanceof byte[] ) {
902
                        s = bytearray_0x((byte[]) theValue);
903
                        
904
                    } else {
905
                        s = theValue.toString();
906
                    }    
907
                    break;
908
                case PARAMETER_TYPE_VARIABLE:
909
                default:
910
                    s = "\"" + param.name() + "\"";
911
            }
912
//            if( !params.contains(s) ) { // Ojo que deben ir todos, incluso duplicados.
913
                params.add(s);
914
//            }
915
        }
916
        // Collections.sort(params); Ojo, no deben ordenarse.
917
        return params;
918
    }
919
    
920
    @Override
921
    public List<String> variables_names() {
922
        List<String> vars = new ArrayList<>();
923
        for (Variable var : this.variables()) {
924
            vars.add(var.name());
925
        }
926
        Collections.sort(vars);
927
        return vars;
928
    }
929
    
930
    @Override
931
    public ExpressionBuilder set(Value value) {
932
        this.value = value;
933
        return this;
934
    }
935

    
936
    @Override
937
    public ExpressionBuilder and(Value value) {
938
        if (this.value == null) {
939
            return this.set(value);
940
        }
941
        BinaryOperator operator = binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, this.value, value);
942
        this.value = operator;
943
        return this;
944
    }
945

    
946
    @Override
947
    public ExpressionBuilder or(Value value) {
948
        if (this.value == null) {
949
            return this.set(value);
950
        }
951
        BinaryOperator operator = binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, this.value, value);
952
        this.value = operator;
953
        return this;
954
    }
955

    
956
    @Override
957
    public Function is_null(Value value) {
958
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
959
    }
960

    
961
    @Override
962
    public Function not_is_null(Value value) {
963
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
964
    }
965

    
966
    @Override
967
    public Function not(Value value) {
968
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
969
    }
970

    
971
    @Override
972
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
973
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
974
    }
975

    
976
    @Override
977
    public BinaryOperator and(Expression leftOperand, Expression rightOperand) {
978
        return binaryOperator(
979
                OPERATOR_AND, 
980
                FORMAT_OPERATOR_AND, 
981
                leftOperand.getCode().toValue(), 
982
                rightOperand.getCode().toValue()
983
        );
984
    }
985

    
986
    @Override
987
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
988
        return binaryOperator(
989
                OPERATOR_AND, 
990
                FORMAT_OPERATOR_AND, 
991
                leftOperand.getCode().toValue(), 
992
                rightOperand
993
        );
994
    }
995

    
996
    @Override
997
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
998
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
999
    }
1000

    
1001
    @Override
1002
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
1003
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
1004
    }
1005

    
1006
    @Override
1007
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
1008
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
1009
    }
1010

    
1011
    @Override
1012
    public BinaryOperator gt(Value op1, Value op2) {
1013
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
1014
    }
1015

    
1016
    @Override
1017
    public BinaryOperator ge(Value op1, Value op2) {
1018
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
1019
    }
1020

    
1021
    @Override
1022
    public BinaryOperator lt(Value op1, Value op2) {
1023
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
1024
    }
1025

    
1026
    @Override
1027
    public BinaryOperator le(Value op1, Value op2) {
1028
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
1029
    }
1030

    
1031
    @Override
1032
    public BinaryOperator like(Value op1, Value op2) {
1033
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
1034
    }
1035

    
1036
    @Override
1037
    public BinaryOperator ilike(Value op1, Value op2) {
1038
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
1039
    }
1040

    
1041
    @Override
1042
    public BinaryOperator add(Value op1, Value op2) {
1043
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1044
    }
1045

    
1046
    @Override
1047
    public BinaryOperator subst(Value op1, Value op2) {
1048
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1049
    }
1050

    
1051
    @Override
1052
    public BinaryOperator mult(Value op1, Value op2) {
1053
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1054
    }
1055

    
1056
    @Override
1057
    public BinaryOperator div(Value op1, Value op2) {
1058
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1059
    }
1060

    
1061
    @Override
1062
    public BinaryOperator concat(Value op1, Value op2) {
1063
        return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, op1, op2);
1064
    }
1065
    
1066
    @Override
1067
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1068
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1069
    }
1070

    
1071
    @Override
1072
    public Function ifnull(Value value, Value iftrue, Value iffalse) {
1073
        return function(FUNCTION_IFNULL, value, iftrue, iffalse);
1074
    }
1075
    
1076
    @Override
1077
    public Function left(Value str, Value size) {
1078
       return function(FUNCTION_LEFT, str, size);
1079
    }
1080
    
1081
    @Override
1082
    public Function right(Value str, Value len) {
1083
       return function(FUNCTION_RIGHT, str, len);
1084
    }
1085
    
1086
    @Override
1087
    public Function locate(Value search, Value str, Value start) {
1088
       return function(FUNCTION_LOCATE, search, str, start);
1089
    }
1090
    
1091
    @Override
1092
    public Function position(Value search, Value str) {
1093
       return function(FUNCTION_POSITION, search, str);
1094
    }
1095
    
1096
    @Override
1097
    public Function lpad(Value str, Value len, Value padstr) {
1098
       return function(FUNCTION_LPAD, str, len, padstr);
1099
    }
1100
    
1101
    @Override
1102
    public Function rpad(Value str, Value len, Value padstr) {
1103
       return function(FUNCTION_RPAD, str, len, padstr);
1104
    }
1105
    
1106
    @Override
1107
    public Function ltrim(Value str) {
1108
       return function(FUNCTION_LTRIM, str);
1109
    }
1110
    
1111
    @Override
1112
    public Function rtrim(Value str) {
1113
       return function(FUNCTION_RTRIM, str);
1114
    }
1115
    
1116
    @Override
1117
    public Function trim(Value str) {
1118
       return function(FUNCTION_TRIM, str);
1119
    }
1120
    
1121
    @Override
1122
    public Function repeat(Value str, Value size) {
1123
       return function(FUNCTION_REPEAT, str, size);
1124
    }
1125
    
1126
    @Override
1127
    public Function replace(Value str, Value search, Value replstr) {
1128
       return function(FUNCTION_REPLACE, str, search, replstr);
1129
    }
1130
    
1131
    @Override
1132
    public Function ascii(Value str) {
1133
       return function(FUNCTION_ASCII, str);
1134
    }
1135
    
1136
    @Override
1137
    public Function lenght(Value str) {
1138
       return function(FUNCTION_LENGHT, str);
1139
    }
1140

    
1141
    @Override
1142
    public Function instr(Value str, Value search, Value start) {
1143
       return function(FUNCTION_INSTR, str, search, start);
1144
    }
1145
    
1146
    @Override
1147
    public Function lower(Value str) {
1148
       return function(FUNCTION_LOWER, str);
1149
    }
1150
    
1151
    @Override
1152
    public Function upper(Value str) {
1153
       return function(FUNCTION_UPPER, str);
1154
    }
1155
    
1156
    @Override
1157
    public Function space(Value size) {
1158
       return function(FUNCTION_SPACE, size);
1159
    }
1160
    
1161
    @Override
1162
    public Function substring(Value str, Value start, Value len) {
1163
       return function(FUNCTION_SUBSTRING, str, start, len);
1164
    }
1165
    
1166
    @Override
1167
    public Function acos(Value num) {
1168
       return function(FUNCTION_ACOS, num);
1169
    } 
1170
    
1171
    @Override
1172
    public Function asin(Value num) {
1173
       return function(FUNCTION_ASIN, num);
1174
    }
1175
    
1176
    @Override
1177
    public Function atan(Value num) {
1178
       return function(FUNCTION_ATAN, num);
1179
    }
1180
    
1181
    @Override
1182
    public Function cos(Value num) {
1183
       return function(FUNCTION_COS, num);
1184
    }
1185
    
1186
    @Override
1187
    public Function cosh(Value num) {
1188
       return function(FUNCTION_COSH, num);
1189
    }
1190
    
1191
    @Override
1192
    public Function cot(Value num) {
1193
       return function(FUNCTION_COT, num);
1194
    }  
1195
    
1196
    @Override
1197
    public Function bitand(Value num1, Value num2) {
1198
       return function(FUNCTION_BITAND, num1, num2);
1199
    } 
1200
    
1201
    @Override
1202
    public Function bitor(Value num1, Value num2) {
1203
       return function(FUNCTION_BITOR, num1, num2);
1204
    }
1205
    
1206
    @Override
1207
    public Function bitxor(Value num1, Value num2) {
1208
       return function(FUNCTION_BITXOR, num1, num2);
1209
    }
1210
    
1211
    @Override
1212
    public Function ceil(Value num) {
1213
       return function(FUNCTION_CEIL, num);
1214
    }
1215
    
1216
    @Override
1217
    public Function degrees(Value num) {
1218
       return function(FUNCTION_DEGREES, num);
1219
    }  
1220
    
1221
    @Override
1222
    public Function exp(Value num) {
1223
       return function(FUNCTION_EXP, num);
1224
    }  
1225
    
1226
    @Override
1227
    public Function floor(Value num) {
1228
       return function(FUNCTION_FLOOR, num);
1229
    }  
1230
    
1231
    @Override
1232
    public Function log(Value num) {
1233
       return function(FUNCTION_LOG, num);
1234
    }  
1235
    
1236
    @Override
1237
    public Function log10(Value num) {
1238
       return function(FUNCTION_LOG10, num);
1239
    }  
1240
    
1241
    @Override
1242
    public Function pi() {
1243
       return function(FUNCTION_PI);
1244
    }
1245
    
1246
    @Override
1247
    public Function abs(Value num) {
1248
       return function(FUNCTION_ABS, num);
1249
    }
1250
    
1251
    @Override
1252
    public Function power(Value num) {
1253
       return function(FUNCTION_POWER, num);
1254
    }
1255
    
1256
    @Override
1257
    public Function radians(Value num) {
1258
       return function(FUNCTION_RADIANS, num);
1259
    }
1260
    
1261
    @Override
1262
    public Function rand(Value num) {
1263
       return function(FUNCTION_RAND, num);
1264
    }
1265
    
1266
    @Override
1267
    public Function round(Value num) {
1268
       return function(FUNCTION_ROUND, num);
1269
    }
1270
    
1271
    @Override
1272
    public Function sqrt(Value num) {
1273
       return function(FUNCTION_SQRT, num);
1274
    }
1275
    
1276
    @Override
1277
    public Function sign(Value num) {
1278
       return function(FUNCTION_SIGN, num);
1279
    }
1280
    
1281
    @Override
1282
    public Function sin(Value num) {
1283
       return function(FUNCTION_SIN, num);
1284
    }
1285
    
1286
    @Override
1287
    public Function sinh(Value num) {
1288
       return function(FUNCTION_SINH, num);
1289
    }
1290
    
1291
    @Override
1292
    public Function tan(Value num) {
1293
       return function(FUNCTION_TAN, num);
1294
    }
1295
    @Override
1296
    public Function tanh(Value num) {
1297
       return function(FUNCTION_TANH, num);
1298
    }  
1299
    
1300
    @Override
1301
    public Function zero() {
1302
       return function(FUNCTION_ZERO);
1303
    }
1304
    
1305
    @Override
1306
    public Function chr(Value num) {
1307
       return function(FUNCTION_CHR, num);
1308
    }    
1309

    
1310
    @Override
1311
    public Function cast(Value object, Value typeName) {
1312
       return function(FUNCTION_CAST, object, typeName);
1313
    }    
1314

    
1315
    @Override
1316
    public Function decode(Value value, Value format) {
1317
       return function(FUNCTION_DECODE, value, format);
1318
    }    
1319

    
1320
    @Override
1321
    public Function toDouble(Value num) {
1322
       return function(FUNCTION_TODOUBLE, num);
1323
    }    
1324

    
1325
    @Override
1326
    public Function toFloat(Value num) {
1327
       return function(FUNCTION_TOFLOAT, num);
1328
    }    
1329

    
1330
    @Override
1331
    public Function toLong(Value num) {
1332
       return function(FUNCTION_TOLONG, num);
1333
    }    
1334

    
1335
    @Override
1336
    public Function toInteger(Value num) {
1337
       return function(FUNCTION_TOINTEGER, num);
1338
    }    
1339

    
1340
    @Override
1341
    public Function toStr(Value object) {
1342
       return function(FUNCTION_TOSTR, object);
1343
    }    
1344

    
1345
    @Override
1346
    public Function list() {
1347
        return function(FUNCTION_LIST);
1348
    }
1349

    
1350
    @Override
1351
    public Function tuple() {
1352
        return function(FUNCTION_TUPLE);
1353
    }
1354

    
1355
    @Override
1356
    public Function tuple(Constant... values) {
1357
        Function fn = function(FUNCTION_TUPLE);
1358
        for (Value theValue : values) {
1359
            fn.parameter(this.constant(theValue));
1360
        }
1361
        return fn;
1362
    }
1363
    
1364
    @Override
1365
    public String repr(Object value) {
1366
        return this.manager.getReprMethod(value).repr(value);
1367
    }
1368

    
1369
  @Override
1370
  public Function getattr(Value object, String attrname) {
1371
        Function fn = function(FUNCTION_GETATTR);
1372
        fn.parameter(null, object);
1373
        fn.parameter(null, constant(attrname));
1374
        return fn;
1375
  }
1376

    
1377
}