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

History | View | Annotate | Download (46.2 KB)

1
package org.gvsig.expressionevaluator.impl;
2

    
3
import java.awt.Color;
4
import java.text.MessageFormat;
5
import java.text.ParseException;
6
import java.text.SimpleDateFormat;
7
import java.util.ArrayList;
8
import java.util.Collections;
9
import java.util.Date;
10
import java.util.HashSet;
11
import java.util.List;
12
import java.util.Map;
13
import java.util.Objects;
14
import java.util.Set;
15
import org.apache.commons.lang3.StringUtils;
16
import org.gvsig.expressionevaluator.Code;
17
import org.gvsig.expressionevaluator.Expression;
18

    
19
import org.gvsig.expressionevaluator.ExpressionBuilder;
20
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_CONSTANT;
21
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE;
22
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
23
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
24
import org.gvsig.expressionevaluator.ExpressionUtils;
25
import org.gvsig.expressionevaluator.Formatter;
26
import org.gvsig.expressionevaluator.ReprMethod;
27
import org.gvsig.tools.ToolsLocator;
28
import org.gvsig.tools.dataTypes.Coercion;
29
import org.gvsig.tools.dataTypes.DataTypesManager;
30
import org.gvsig.tools.util.PropertiesSupportHelper;
31

    
32
@SuppressWarnings({"UseSpecificCatch" ,"OverridableMethodCallInConstructor"})
33
public class DefaultExpressionBuilder implements ExpressionBuilder {
34
    
35
    private static final String FORMAT_QUOTE_FOR_STRINGS = "'";
36
    private static final String FORMAT_QUOTE_FOR_IDENTIFIERS = "\"";
37

    
38
    private static final String FORMAT_TRUE = "TRUE";
39
    private static final String FORMAT_FALSE = "FALSE";
40

    
41
    private static final String FORMAT_GROUP = "( {0} )";
42

    
43
    private static final String FORMAT_ISNULL = "( ({0}) IS NULL )";
44
    private static final String FORMAT_NOTISNULL = "( ({0}) IS NOT NULL )";
45
    private static final String FORMAT_OPERATOR_NOT = "( NOT ({0}) )";
46

    
47
    private static final String FORMAT_OPERATOR_AND = "({0} AND {1})";
48
    private static final String FORMAT_OPERATOR_OR = "({0} OR {1})";
49
//    private static final String FORMAT_OPERATOR_OR2 = "{0} OR {1}";
50
//    private static final String FORMAT_OPERATOR_OR2 = "({0}) OR ({1})";
51
    private static final String FORMAT_OPERATOR_EQ = "( ({0}) = ({1}) )";
52
    private static final String FORMAT_OPERATOR_NE = "( ({0}) <> ({1}) )";
53
    private static final String FORMAT_OPERATOR_GT = "( ({0}) > ({1}) )";
54
    private static final String FORMAT_OPERATOR_GE = "( ({0}) >= ({1}) )";
55
    private static final String FORMAT_OPERATOR_LT = "( ({0}) < ({1}) )";
56
    private static final String FORMAT_OPERATOR_LE = "( ({0}) <= ({1}) )";
57
    private static final String FORMAT_OPERATOR_LIKE = "( ({0}) LIKE ({1}) )";
58
    private static final String FORMAT_OPERATOR_ILIKE = "( ({0}) ILIKE ({1}) )";
59
    private static final String FORMAT_OPERATOR_ADD = "{0} + {1}";
60
    private static final String FORMAT_OPERATOR_SUBST = "{0} - {1}";
61
    private static final String FORMAT_OPERATOR_MULT = "({0} * {1})";
62
    private static final String FORMAT_OPERATOR_DIV = "({0} / {1})";
63
    private static final String FORMAT_OPERATOR_CONCAT = "{0} || {1}";
64
    private final PropertiesSupportHelper propertiesHelper;
65

    
66
    public class GroupBase extends AbstractValue implements Group {
67

    
68
        protected Value value;
69

    
70
        public GroupBase(Value value) {
71
            this.value = value;
72
        }
73

    
74
        @Override
75
        public Value value() {
76
            return value;
77
        }
78

    
79
        @Override
80
        public void accept(Visitor visitor, VisitorFilter filter) {
81
            super.accept(visitor, filter);
82
            this.value.accept(visitor, filter);
83
        }
84

    
85
        @Override
86
        public void replace(Value target, Value replacement) {
87
            if( this.value == target ) {
88
                this.value = replacement;
89
            } else {
90
                this.value.replace(target, replacement);
91
            }
92
        }
93

    
94
        @Override
95
        public String toString() {
96
            return this.toString(formatter());
97
        }
98
        
99
        @Override
100
        public String toString(Formatter<Value> formatter) {
101
            if( formatter!=null && formatter.canApply(this) ) {
102
                return formatter.format(this);
103
            }
104
            return MessageFormat.format(FORMAT_GROUP, this.value.toString());
105
        }
106
    }
107

    
108
    public class VariableBase extends AbstractValue implements Variable {
109

    
110
        protected String name;
111
        protected ExpressionBuilder builder;
112
        
113
        public VariableBase(ExpressionBuilder builder, String name) {
114
            this.name = name;
115
            this.builder = builder;
116
        }
117

    
118
        @Override
119
        public String name() {
120
            return this.name;
121
        }
122

    
123
        @Override
124
        public String toString() {
125
            return this.toString(formatter());
126
        }
127
        
128
        @Override
129
        public String toString(Formatter<Value> formatter) {
130
            if( formatter!=null && formatter.canApply(this) ) {
131
                return formatter.format(this);
132
            }
133
            return this.builder.identifier(this.name);
134
        }
135

    
136
        @Override
137
        public int compareTo(Variable o) {
138
            return this.name.compareTo(o.name());
139
        }
140

    
141
        @Override
142
        public boolean equals(Object obj) {
143
            if (!(obj instanceof Variable)) {
144
                return false;
145
            }
146
            return this.name.equals(((Variable) obj).name());
147
        }
148

    
149
        @Override
150
        public int hashCode() {
151
            int hash = 7;
152
            hash = 37 * hash + Objects.hashCode(this.name);
153
            return hash;
154
        }
155
    }
156

    
157
    public class ParameterBase extends AbstractValue implements Parameter {
158

    
159
        protected String name;
160
        protected Object value;
161
        protected int type;
162

    
163
        public ParameterBase() {
164
            this.type = PARAMETER_TYPE_CONSTANT;
165
            this.name = null;
166
            this.value = null;
167
        }
168

    
169
        @Override
170
        public Parameter as_constant() {
171
            this.type = PARAMETER_TYPE_CONSTANT;
172
            if (this.value == null && this.name != null) {
173
                this.value = this.name;
174
            }
175
            return this;
176
        }
177

    
178
        @Override
179
        public Parameter as_variable() {
180
            this.type = PARAMETER_TYPE_VARIABLE;
181
            if (this.value != null && this.name == null) {
182
                this.name = (String) this.value;
183
            }
184
            return this;
185
        }
186
        
187
        @Override
188
        public String name() {
189
            switch (this.type) {
190
                case PARAMETER_TYPE_VARIABLE:
191
                    return this.name;
192
                case PARAMETER_TYPE_CONSTANT:
193
                    if (this.value == null) {
194
                        return null;
195
                    }
196
                    return this.value.toString();
197
                default:
198
                    if (this.name != null) {
199
                        return this.name;
200
                    }
201
                    if (this.value != null) {
202
                        return this.value.toString();
203
                    }
204
                    return null;
205
            }
206
        }
207

    
208
        @Override
209
        public int type() {
210
            return this.type;
211
        }
212

    
213
        @Override
214
        public boolean is_constant() {
215
            return this.type == PARAMETER_TYPE_CONSTANT;
216
        }
217

    
218
        @Override
219
        public boolean is_variable() {
220
            return this.type == PARAMETER_TYPE_VARIABLE;
221
        }
222

    
223
        @Override
224
        public Parameter value(Object value) {
225
            this.value = value;
226
            return this;
227
        }
228

    
229
        @Override
230
        public Parameter name(String name) {
231
            this.type = PARAMETER_TYPE_VARIABLE;
232
            this.name = name;
233
            return this;
234
        }
235

    
236
        @Override
237
        public Object value() {
238
            try {
239
                switch (this.type) {
240
                    case PARAMETER_TYPE_CONSTANT:
241
                        return this.value;
242
                    case PARAMETER_TYPE_VARIABLE:
243
                    default:
244
                        return this.value;
245
                }
246
            } catch (Exception ex) {
247
                throw new RuntimeException("Can't get value from parameter.", ex);
248
            }
249
        }
250

    
251
        @Override
252
        public String toString() {
253
            return this.toString(formatter());
254
        }
255
        
256
        @Override
257
        public String toString(Formatter<Value> formatter) {
258
            if( formatter!=null && formatter.canApply(this) ) {
259
                return formatter.format(this);
260
            }
261
            switch (this.type) {
262
                case PARAMETER_TYPE_CONSTANT:
263
                    return Objects.toString(this.value);
264
                    
265
                case PARAMETER_TYPE_VARIABLE:
266
                default:
267
                    return "?";
268
            }
269
        }
270
    }
271

    
272
    public class ConstantBase extends AbstractValue implements Constant {
273

    
274
        protected Object value;
275
        protected ExpressionBuilder builder;
276
        
277
        public ConstantBase(ExpressionBuilder builder, Object value) {
278
            this.value = value;
279
            this.builder = builder;
280
        }
281

    
282
        @Override
283
        public Object value() {
284
            return this.value;
285
        }
286

    
287
        @Override
288
        public String toString() {
289
            return this.toString(formatter());
290
        }
291
        
292
        @Override
293
        public String toString(Formatter<Value> formatter) {
294
            if( formatter!=null && formatter.canApply(this) ) {
295
                return formatter.format(this);
296
            }
297
            if( this.value==null ) {
298
                return "NULL";
299
            }
300
            if( this.value instanceof byte[] ) {
301
                return "DECODE('"+this.builder.bytearray_hex((byte[])this.value)+"','hex')";
302
            }
303
            if (this.value instanceof String) {
304
                return this.builder.string((String) this.value);
305
            }
306
            if (this.value instanceof Boolean) {
307
                if (((Boolean) this.value)) {
308
                    return FORMAT_TRUE;
309
                } else {
310
                    return FORMAT_FALSE;
311
                }
312
            }
313
            ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
314
            ReprMethod repr = manager.getReprMethod(this.value);            
315
            return repr.repr(value);
316
        }
317
        
318
        public ExpressionBuilder builder() {
319
            return this.builder; // Ojo, no esta en el API.
320
        }
321
    }
322

    
323
    public class CustomBase extends AbstractValue implements Custom {
324

    
325
        protected Object value;
326

    
327
        // Esto es para permitir declarar parametros y columnas en una seccion
328
        // custom.
329
        protected List<Value> values;
330

    
331
        public CustomBase(Object value) {
332
            this.value = value;
333
        }
334

    
335
        @Override
336
        public void accept(Visitor visitor, VisitorFilter filter) {
337
            super.accept(visitor, filter);
338
            if (this.values != null) {
339
                for (Value theValue : values) {
340
                    theValue.accept(visitor, filter);
341
                }
342
            }
343
        }
344

    
345
        @Override
346
        public void replace(Value target, Value replacement) {
347
            if( this.values == null ) {
348
                return;
349
            }
350
            for (int i = 0; i < values.size(); i++) {
351
                Value theValue = values.get(i);
352
                if( target == theValue ) {
353
                    values.set(i, replacement);
354
                } else {
355
                    theValue.replace(target, replacement);
356
                }
357
            }
358
        }
359

    
360
        @Override
361
        public Object value() {
362
            return this.value;
363
        }
364

    
365
        @Override
366
        public Custom add(Variable variable) {
367
            if (this.values == null) {
368
                this.values = new ArrayList<>();
369
            }
370
            this.values.add(variable);
371
            return this;
372
        }
373

    
374
        @Override
375
        public Custom add(Parameter parameter) {
376
            if (this.values == null) {
377
                this.values = new ArrayList<>();
378
            }
379
            this.values.add(parameter);
380
            return this;
381
        }
382

    
383
        @Override
384
        public String toString() {
385
            return this.toString(formatter());
386
        }
387
        
388
        @Override
389
        public String toString(Formatter<Value> formatter) {
390
            if( formatter!=null && formatter.canApply(this) ) {
391
                return formatter.format(this);
392
            }
393
            return Objects.toString(this.value, "");
394
        }
395
    }
396

    
397
    public class FunctionBase extends AbstractValue implements Function {
398

    
399
        protected String name;
400
        protected String format;
401
        protected List<Value> parameters;
402

    
403
        public FunctionBase(String name, String format) {
404
            this.name = name;
405
            this.format = format;
406
        }
407

    
408
        public FunctionBase(String name) {
409
            this(name,null);
410
        }
411

    
412
        @Override
413
        public List<Value> parameters() {
414
            if (this.parameters == null) {
415
                this.parameters = new ArrayList<>();
416
            }
417
            return this.parameters;
418
        }
419

    
420
        @Override
421
        public Function format(String format) {
422
          this.format = format;
423
          return this;
424
        }
425

    
426
        @Override
427
        public Function parameter(Value parameter) {
428
            this.parameters().add(parameter);
429
            return this;
430
        }
431

    
432
        @Override
433
        public String name() {
434
            return this.name;
435
        }
436

    
437
        @Override
438
        public void accept(Visitor visitor, VisitorFilter filter) {
439
            super.accept(visitor, filter);
440
            if( this.parameters!=null ) {
441
                for (Value argument : this.parameters) {
442
                    if( argument!=null ) {
443
                        argument.accept(visitor, filter);
444
                    }
445
                }
446
            }
447
        }
448

    
449
        @Override
450
        public void replace(Value target, Value replacement) {
451
          if( this.parameters!=null ) {
452
            for (int i = 0; i < parameters.size(); i++) {
453
                Value argument = parameters.get(i);
454
                if (argument != null) {
455
                    if( argument == target ) {
456
                        parameters.set(i, replacement);
457
                    } else {
458
                        argument.replace(target, replacement);
459
                    }
460
                }
461
            }
462
          }
463
        }
464
        
465
        @Override
466
        public String toString() {
467
            return this.toString(formatter());
468
        }
469
        
470
        @Override
471
        public String toString(Formatter<Value> formatter) {
472
            if( formatter!=null && formatter.canApply(this) ) {
473
                return formatter.format(this);
474
            }
475
            if( this.format==null ) {
476
                StringBuilder builder = new StringBuilder();
477
                builder.append(name);
478
                builder.append("(");
479
                if (this.parameters != null && !this.parameters.isEmpty()) {
480
                    boolean first = true;
481
                    for (Value argument : this.parameters) {
482
                        if( first ) {
483
                            first=false;
484
                            builder.append(argument.toString(formatter));
485
                        } else {
486
                            builder.append(", ");
487
                            builder.append(argument.toString(formatter));
488
                        }
489
                    }
490
                }
491
                builder.append(")");
492
                return builder.toString();
493
            }
494
            if (this.parameters != null && !this.parameters.isEmpty()) {
495
                List<String> values = new ArrayList<>();
496
                for (Value argument : this.parameters) {
497
                    values.add(argument.toString(formatter));
498
                }
499
                return MessageFormat.format(format, values.toArray());
500
            } else {
501
                return this.format;
502
            }
503
        }
504
    }
505

    
506
    public class MethodBase extends FunctionBase implements Method {
507

    
508
        private Value instance;
509
        
510
        public MethodBase(Value instance, String name) {
511
            super(name);
512
            this.instance = instance;
513
        }
514

    
515
        @Override
516
        public Value instance() {
517
            return this.instance;
518
        }
519

    
520
        @Override
521
        public void accept(Visitor visitor, VisitorFilter filter) {
522
            this.instance.accept(visitor, filter);
523
            super.accept(visitor, filter);
524
        }
525

    
526
        @Override
527
        public void replace(Value target, Value replacement) {
528
            if( this.instance == target ) {
529
                this.instance = replacement;
530
            } else {
531
                this.instance.replace(target, replacement);
532
            }
533
        }
534
        
535
        @Override
536
        public String toString(Formatter<Value> formatter) {
537
            if( formatter!=null && formatter.canApply(this) ) {
538
                return formatter.format(this);
539
            }
540
            StringBuilder builder = new StringBuilder();
541
            builder.append(this.instance.toString(formatter));
542
            builder.append("->");
543
            builder.append(this.name());
544
            builder.append("(");
545
            if (this.parameters != null && !this.parameters.isEmpty()) {
546
                boolean first = true;
547
                for (Value argument : this.parameters) {
548
                    if( first ) {
549
                        first=false;
550
                        builder.append(argument.toString(formatter));
551
                    } else {
552
                        builder.append(", ");
553
                        builder.append(argument.toString(formatter));
554
                    }
555
                }
556
            }
557
            builder.append(")");
558
            return builder.toString();
559
        }
560
    }
561

    
562
    public class BinaryOperatorBase extends FunctionBase implements BinaryOperator {
563

    
564
        private static final int LEFT = 0;
565
        private static final int RIGHT = 1;
566
        
567
        public BinaryOperatorBase(String name, String format) {
568
            super(name, format);
569
            this.parameters = new ArrayList<>();
570
            this.parameters.add(null);
571
            this.parameters.add(null);
572
        }
573

    
574
        @Override
575
        public Function parameter(Value parameter) {
576
            throw new UnsupportedOperationException("BinaryOperator can support add parameters.");
577
        }
578
        
579
        @Override
580
        public String name() {
581
            return this.name;
582
        }
583

    
584
        @Override
585
        public BinaryOperator left(Value operand) {
586
            this.parameters.set(LEFT, operand);
587
            return this;
588
        }
589

    
590
        @Override
591
        public BinaryOperator right(Value operand) {
592
            this.parameters.set(RIGHT, operand);
593
            return this;
594
        }
595

    
596
        @Override
597
        public Value left() {
598
            return this.parameters.get(LEFT);
599
        }
600

    
601
        @Override
602
        public Value right() {
603
            return this.parameters.get(RIGHT);
604
        }
605

    
606
        @Override
607
        public String toString() {
608
            return this.toString(formatter());
609
        }
610
        
611
        @Override
612
        public String toString(Formatter<Value> formatter) {
613
            if( formatter!=null && formatter.canApply(this) ) {
614
                return formatter.format(this);
615
            }
616
            if( this.format==null ) {
617
                StringBuilder builder = new StringBuilder();
618
                builder.append("(");
619
                builder.append(this.left().toString(formatter));
620
                builder.append(" ");
621
                builder.append(this.name);
622
                builder.append(" ");
623
                builder.append(this.right().toString(formatter));
624
                builder.append(")");
625
                return builder.toString();
626
            } else {
627
                return MessageFormat.format(
628
                        format,
629
                        this.left().toString(formatter),
630
                        this.right().toString(formatter)
631
                );
632
            }
633
        }
634
    }
635

    
636
    protected Value value;
637
    protected ExpressionEvaluatorManager manager;
638
    protected Formatter<ExpressionBuilder.Value> formatter;
639

    
640
    public DefaultExpressionBuilder(ExpressionEvaluatorManager manager) {
641
        this.manager = manager;
642
        this.propertiesHelper = new PropertiesSupportHelper();
643
    }
644
    
645
        @Override
646
    public Object getProperty(String name) {
647
        return this.propertiesHelper.getProperty(name);
648
    }
649

    
650
    @Override
651
    public void setProperty(String name, Object value) {
652
        this.propertiesHelper.setProperty(name, value);
653
    }
654

    
655
    @Override
656
    public Map<String, Object> getProperties() {
657
        return this.propertiesHelper.getProperties();
658
    }
659
    
660
    @Override
661
    public void setProperties(Class filter, final Object... values) {
662
        for (int i = 0; i < values.length; i+=2) {
663
              propertiesHelper.setProperty((String) values[i], values[i+1]);
664
        }
665
        this.accept(new Visitor() {
666
            @Override
667
            public void visit(Visitable v) {
668
                for (int i = 0; i < values.length; i+=2) {
669
                    ((Value)v).setProperty((String) values[i], values[i+1]);
670
                }
671
            }
672
        }, new ClassVisitorFilter(filter) );
673
    }
674
    
675
    @Override
676
    public Formatter<ExpressionBuilder.Value> formatter() {
677
      if( this.formatter == null ) {
678
        this.formatter = this.manager.getExpressionBuilderFormatter();
679
      }
680
      return this.formatter;
681
    }
682

    
683
    @Override
684
    public boolean isEmpty() {
685
        return value == null;
686
    }
687
    
688
    @Override
689
    public ExpressionBuilder createExpressionBuilder() {
690
        return new DefaultExpressionBuilder(this.manager);
691
    }
692

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

    
698
    @Override
699
    public ExpressionBuilder value(Value value) {
700
        this.value = value;
701
        return this;
702
    }
703

    
704
    @Override
705
    public String toString() {
706
        if (this.value == null) {
707
            return "";
708
        }
709
        return this.value.toString();
710
    }
711

    
712
    @Override
713
    public String toString(Formatter<Value> formatter) {
714
        if (this.value == null) {
715
            return "";
716
        }
717
        return this.value.toString(formatter);
718
    }
719
    
720
    @Override
721
    public String build() {
722
        if (this.value == null) {
723
            return null;
724
        }
725
        return this.value.toString();
726
    }
727
    
728
    @Override
729
    public String build(Formatter<Value> formatter) {
730
        if (this.value == null) {
731
            return null;
732
        }
733
        return this.value.toString(formatter);
734
    }
735

    
736
    @Override
737
    public Value toValue(String expression) {
738
        try {
739
            Code code = ExpressionUtils.compile(expression);
740
            return code.toValue(this);
741
        } catch(Throwable ex) {
742
            return custom(expression);
743
        }
744
    }
745

    
746
    @Override
747
    public void accept(Visitor visitor, VisitorFilter filter) {
748
        if( this.value == null) {
749
            return;
750
        }
751
        this.value.accept(visitor, filter);
752
    }
753

    
754
    @Override
755
    public String quote_for_identifiers() {
756
        return FORMAT_QUOTE_FOR_IDENTIFIERS;
757
    }
758
    
759
    @Override
760
    public String quote_for_strings() {
761
        return FORMAT_QUOTE_FOR_STRINGS;
762
    }
763
       
764
    @Override
765
    public String string(String s) {
766
        String quote = this.quote_for_strings();
767
//        No se porque no esta disponible wrapIfMissing
768
//        return StringUtils.wrapIfMissing(s,quote);
769
        if (s.startsWith(quote)) {
770
            return s;
771
        }
772
        return quote + StringUtils.replace(s,quote,quote+quote) + quote;
773
    }
774

    
775
    @Override
776
    public String identifier(String id) {
777
        String quote = this.quote_for_identifiers();
778
//        No se porque no esta disponible wrapIfMissing
779
//        return StringUtils.wrapIfMissing(id,quote);
780
        if (id.startsWith(quote)) {
781
            return id;
782
        }
783
        return quote + id + quote;
784
    }
785

    
786
    @Override
787
    public String bytearray_hex(byte[] data) {
788
        StringBuilder builder = new StringBuilder();
789
        for (byte abyte : data) {
790
            int v = abyte & 0xff;
791
            builder.append(String.format("%02x", v));
792
        }
793
        return builder.toString();
794
    }
795

    
796
    @Override
797
    public String bytearray_0x(byte[] data) {
798
        return "0x" + bytearray_hex(data);
799
    }
800

    
801
    @Override
802
    public String bytearray_x(byte[] data) {
803
        return "x'" + bytearray_hex(data) + "'";
804
    }
805
    
806

    
807
    @Override
808
    public Constant bytearray(byte[] data) {
809
        return new ConstantBase(this, data);
810
    }
811
    
812
    @Override
813
    public Variable variable(String name) {
814
        return new VariableBase(this, name);
815
    }
816

    
817
    @Override
818
    public Variable column(String name) {
819
        return new VariableBase(this, name);
820
    }
821

    
822
    @Override
823
    public Value column(String tableName, String columnName) {
824
      return getattr(tableName,columnName);
825
    }
826

    
827
    @Override
828
    public Parameter parameter(String name) {
829
        List<Parameter> parameters = this.parameters();
830
        for (Parameter parameter : parameters) {
831
            if( StringUtils.equalsIgnoreCase(name, parameter.name()) ) {
832
                return parameter;
833
            }
834
        }
835
        Parameter parameter = this.parameter();
836
        parameter.name(name);
837
        return parameter;
838
    }
839
    
840
    @Override
841
    public Parameter parameter() {
842
        return new ParameterBase();
843
    }
844
    
845
    @Override
846
    public Constant constant(Object value) {
847
        return new ConstantBase(this, value);
848
    }
849

    
850
    @Override
851
    public Constant constant(Object value, Class theClass) {
852
      try {
853
        DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
854
        Coercion coercion = dataTypeManager.getDataType(theClass).getCoercion();
855
        return this.constant(coercion.coerce(value));
856
      } catch (Exception ex) {
857
        throw new RuntimeException("Can't coerce value ("+Objects.toString(value)+") to "+theClass.getSimpleName()+".", ex);
858
      }
859
    }
860

    
861
    @Override
862
    public Constant constant(Object value, int type) {
863
      try {
864
        DataTypesManager dataTypeManager = ToolsLocator.getDataTypesManager();
865
        Coercion coercion = dataTypeManager.getCoercion(type);
866
        return this.constant(coercion.coerce(value));
867
      } catch (Exception ex) {
868
        throw new RuntimeException("Can't coerce value ("+Objects.toString(value)+") to "+type+".", ex);
869
      }
870
    }
871
  
872
    @Override
873
    public Group group(Value value) {
874
        return new GroupBase(value);
875
    }
876

    
877
    @Override
878
    public Custom custom(Object value) {
879
        return new CustomBase(value);
880
    }
881

    
882
    @Override
883
    public Method method(Value instance, String name, Value... values) {
884
        MethodBase method = new MethodBase(instance, name);
885
        for (Value theValue : values) {
886
            method.parameter(theValue);
887
        }
888
        return method;
889
    }
890
    
891
    @Override
892
    public Function function(String name, Value... values) {
893
        FunctionBase func = new FunctionBase(name);
894
        for (Value theValue : values) {
895
            func.parameter(theValue);
896
        }
897
        return func;
898
    }
899

    
900
    public Function builtin_function(String name, String format, Value... values) {
901
        FunctionBase func = new FunctionBase(name, format);
902
        for (Value theValue : values) {
903
            func.parameter(theValue);
904
        }
905
        return func;
906
    }
907

    
908
    @Override
909
    public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand) {
910
        return binaryOperator(name, null, leftOperand, rightOperand);
911
    }
912
    
913
    public BinaryOperator binaryOperator(String name, String format, Value leftOperand, Value rightOperand) {
914
        BinaryOperator operator = new BinaryOperatorBase(name, format);
915
        operator.left(leftOperand);
916
        operator.right(rightOperand);
917
        return operator;
918
    }
919

    
920
    @Override
921
    public List<Variable> variables() {
922
        final Set<Variable> vars = new HashSet<>();
923
        this.accept((Visitable value1) -> {
924
          if (!vars.contains((Variable) value1)) {
925
            vars.add((Variable) value1);
926
          }
927
        }, new ClassVisitorFilter(Variable.class));
928
        List<Variable> lvars = new ArrayList<>(vars);
929
        Collections.sort(lvars);
930
        return lvars;
931
    }
932

    
933
    @Override
934
    public List<Parameter> parameters() {
935
        final List<Parameter>  params = new ArrayList<>();
936
        this.accept((Visitable value1) -> {
937
          params.add((Parameter) value1);
938
        }, new ClassVisitorFilter(Parameter.class));
939
        return params;
940
    }
941
    
942
    @Override
943
    public List<String> parameters_names() {
944
        List<String> params = new ArrayList<>();
945
        for (Parameter param : parameters()) {
946
            Object theValue = param.value();
947
            String s;
948
            switch(param.type()) {
949
                case PARAMETER_TYPE_CONSTANT:
950
                    if( theValue==null ) {
951
                        s = "NULL";
952
                    } else if( theValue instanceof String ) {
953
                        s = "'" + (String)theValue + "'";
954
                        
955
                    } else if( theValue instanceof byte[] ) {
956
                        s = bytearray_0x((byte[]) theValue);
957
                        
958
                    } else {
959
                        s = theValue.toString();
960
                    }    
961
                    break;
962
                case PARAMETER_TYPE_VARIABLE:
963
                default:
964
                    s = "\"" + param.name() + "\"";
965
            }
966
//            if( !params.contains(s) ) { // Ojo que deben ir todos, incluso duplicados.
967
                params.add(s);
968
//            }
969
        }
970
        // Collections.sort(params); Ojo, no deben ordenarse.
971
        return params;
972
    }
973
    
974
    @Override
975
    public List<String> variables_names() {
976
        List<String> vars = new ArrayList<>();
977
        for (Variable var : this.variables()) {
978
            vars.add(var.name());
979
        }
980
        Collections.sort(vars);
981
        return vars;
982
    }
983
    
984
    @Override
985
    public ExpressionBuilder set(Value value) {
986
        this.value = value;
987
        return this;
988
    }
989

    
990
    @Override
991
    public ExpressionBuilder and(Value value) {
992
        if (this.value == null) {
993
            return this.set(value);
994
        }
995
        BinaryOperator operator = binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, this.value, value);
996
        this.value = operator;
997
        return this;
998
    }
999

    
1000
    @Override
1001
    public ExpressionBuilder or(Value value) {
1002
        if (this.value == null) {
1003
            return this.set(value);
1004
        }
1005
        BinaryOperator operator = binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, this.value, value);
1006
        this.value = operator;
1007
        return this;
1008
    }
1009

    
1010
    @Override
1011
    public Function is_null(Value value) {
1012
        return builtin_function("IS NULL", FORMAT_ISNULL, value);
1013
    }
1014

    
1015
    @Override
1016
    public Function not_is_null(Value value) {
1017
        return builtin_function("IS NOT NULL", FORMAT_NOTISNULL, value);
1018
    }
1019

    
1020
    @Override
1021
    public Function not(Value value) {
1022
        return builtin_function(OPERATOR_NOT, FORMAT_OPERATOR_NOT, value);
1023
    }
1024

    
1025
    @Override
1026
    public BinaryOperator and(Value leftOperand, Value rightOperand) {
1027
        return binaryOperator(OPERATOR_AND, FORMAT_OPERATOR_AND, leftOperand, rightOperand);
1028
    }
1029

    
1030
    @Override
1031
    public BinaryOperator and(Expression leftOperand, Expression rightOperand) {
1032
        return binaryOperator(
1033
                OPERATOR_AND, 
1034
                FORMAT_OPERATOR_AND, 
1035
                leftOperand.getCode().toValue(), 
1036
                rightOperand.getCode().toValue()
1037
        );
1038
    }
1039

    
1040
    @Override
1041
    public BinaryOperator and(Expression leftOperand, Value rightOperand) {
1042
        return binaryOperator(
1043
                OPERATOR_AND, 
1044
                FORMAT_OPERATOR_AND, 
1045
                leftOperand.getCode().toValue(), 
1046
                rightOperand
1047
        );
1048
    }
1049

    
1050
    @Override
1051
    public BinaryOperator or(Value leftOperand, Value rightOperand) {
1052
        return binaryOperator(OPERATOR_OR, FORMAT_OPERATOR_OR, leftOperand, rightOperand);
1053
    }
1054

    
1055
    @Override
1056
    public BinaryOperator eq(Value leftOperand, Value rightOperand) {
1057
        return binaryOperator("=", FORMAT_OPERATOR_EQ, leftOperand, rightOperand);
1058
    }
1059

    
1060
    @Override
1061
    public BinaryOperator ne(Value leftOperand, Value rightOperand) {
1062
        return binaryOperator("<>", FORMAT_OPERATOR_NE, leftOperand, rightOperand);
1063
    }
1064

    
1065
    @Override
1066
    public BinaryOperator gt(Value op1, Value op2) {
1067
        return binaryOperator(">", FORMAT_OPERATOR_GT, op1, op2);
1068
    }
1069

    
1070
    @Override
1071
    public BinaryOperator ge(Value op1, Value op2) {
1072
        return binaryOperator(">=", FORMAT_OPERATOR_GE, op1, op2);
1073
    }
1074

    
1075
    @Override
1076
    public BinaryOperator lt(Value op1, Value op2) {
1077
        return binaryOperator("<", FORMAT_OPERATOR_LT, op1, op2);
1078
    }
1079

    
1080
    @Override
1081
    public BinaryOperator le(Value op1, Value op2) {
1082
        return binaryOperator("<=", FORMAT_OPERATOR_LE, op1, op2);
1083
    }
1084

    
1085
    @Override
1086
    public BinaryOperator like(Value op1, Value op2) {
1087
        return binaryOperator(OPERATOR_LIKE, FORMAT_OPERATOR_LIKE, op1, op2);
1088
    }
1089

    
1090
    @Override
1091
    public BinaryOperator ilike(Value op1, Value op2) {
1092
        return binaryOperator(OPERATOR_ILIKE, FORMAT_OPERATOR_ILIKE, op1, op2);
1093
    }
1094

    
1095
    @Override
1096
    public BinaryOperator add(Value op1, Value op2) {
1097
        return binaryOperator(OPERATOR_ADD, FORMAT_OPERATOR_ADD, op1, op2);
1098
    }
1099

    
1100
    @Override
1101
    public BinaryOperator subst(Value op1, Value op2) {
1102
        return binaryOperator(OPERATOR_SUBST, FORMAT_OPERATOR_SUBST, op1, op2);
1103
    }
1104

    
1105
    @Override
1106
    public BinaryOperator mult(Value op1, Value op2) {
1107
        return binaryOperator(OPERATOR_MULT, FORMAT_OPERATOR_MULT, op1, op2);
1108
    }
1109

    
1110
    @Override
1111
    public BinaryOperator div(Value op1, Value op2) {
1112
        return binaryOperator(OPERATOR_DIV, FORMAT_OPERATOR_DIV, op1, op2);
1113
    }
1114

    
1115
    @Override
1116
    public Function concat(Value... values) {
1117
        if( values.length==2 ) {
1118
            return binaryOperator(OPERATOR_CONCAT, FORMAT_OPERATOR_CONCAT, values[0], values[1]);
1119
        }
1120
        FunctionBase func = new FunctionBase(FUNCTION_CONCAT);
1121
        for (Value theValue : values) {
1122
            func.parameter(theValue);
1123
        }
1124
        return func;        
1125
    }
1126

    
1127
    @Override
1128
    public Function iif(Value condition, Value iftrue, Value iffalse) {
1129
        return function(FUNCTION_IIF, condition, iftrue, iffalse);
1130
    }
1131

    
1132
    @Override
1133
    public Function ifnull(Value value, Value iftrue, Value iffalse) {
1134
        return function(FUNCTION_IFNULL, value, iftrue, iffalse);
1135
    }
1136
    
1137
    @Override
1138
    public Function left(Value str, Value size) {
1139
       return function(FUNCTION_LEFT, str, size);
1140
    }
1141
    
1142
    @Override
1143
    public Function right(Value str, Value len) {
1144
       return function(FUNCTION_RIGHT, str, len);
1145
    }
1146
    
1147
    @Override
1148
    public Function locate(Value search, Value str, Value start) {
1149
       return function(FUNCTION_LOCATE, search, str, start);
1150
    }
1151
    
1152
    @Override
1153
    public Function position(Value search, Value str) {
1154
       return function(FUNCTION_POSITION, search, str);
1155
    }
1156
    
1157
    @Override
1158
    public Function lpad(Value str, Value len, Value padstr) {
1159
       return function(FUNCTION_LPAD, str, len, padstr);
1160
    }
1161
    
1162
    @Override
1163
    public Function rpad(Value str, Value len, Value padstr) {
1164
       return function(FUNCTION_RPAD, str, len, padstr);
1165
    }
1166
    
1167
    @Override
1168
    public Function ltrim(Value str) {
1169
       return function(FUNCTION_LTRIM, str);
1170
    }
1171
    
1172
    @Override
1173
    public Function rtrim(Value str) {
1174
       return function(FUNCTION_RTRIM, str);
1175
    }
1176
    
1177
    @Override
1178
    public Function trim(Value str) {
1179
       return function(FUNCTION_TRIM, str);
1180
    }
1181
    
1182
    @Override
1183
    public Function repeat(Value str, Value size) {
1184
       return function(FUNCTION_REPEAT, str, size);
1185
    }
1186
    
1187
    @Override
1188
    public Function replace(Value str, Value search, Value replstr) {
1189
       return function(FUNCTION_REPLACE, str, search, replstr);
1190
    }
1191
    
1192
    @Override
1193
    public Function ascii(Value str) {
1194
       return function(FUNCTION_ASCII, str);
1195
    }
1196
    
1197
    @Override
1198
    public Function lenght(Value str) {
1199
       return function(FUNCTION_LENGHT, str);
1200
    }
1201

    
1202
    @Override
1203
    public Function instr(Value str, Value search, Value start) {
1204
       return function(FUNCTION_INSTR, str, search, start);
1205
    }
1206
    
1207
    @Override
1208
    public Function lower(Value str) {
1209
       return function(FUNCTION_LOWER, str);
1210
    }
1211
    
1212
    @Override
1213
    public Function upper(Value str) {
1214
       return function(FUNCTION_UPPER, str);
1215
    }
1216
    
1217
    @Override
1218
    public Function space(Value size) {
1219
       return function(FUNCTION_SPACE, size);
1220
    }
1221
    
1222
    @Override
1223
    public Function substring(Value str, Value start, Value len) {
1224
       return function(FUNCTION_SUBSTRING, str, start, len);
1225
    }
1226
    
1227
    @Override
1228
    public Function acos(Value num) {
1229
       return function(FUNCTION_ACOS, num);
1230
    } 
1231
    
1232
    @Override
1233
    public Function asin(Value num) {
1234
       return function(FUNCTION_ASIN, num);
1235
    }
1236
    
1237
    @Override
1238
    public Function atan(Value num) {
1239
       return function(FUNCTION_ATAN, num);
1240
    }
1241
    
1242
    @Override
1243
    public Function cos(Value num) {
1244
       return function(FUNCTION_COS, num);
1245
    }
1246
    
1247
    @Override
1248
    public Function cosh(Value num) {
1249
       return function(FUNCTION_COSH, num);
1250
    }
1251
    
1252
    @Override
1253
    public Function cot(Value num) {
1254
       return function(FUNCTION_COT, num);
1255
    }  
1256
    
1257
    @Override
1258
    public Function bitand(Value num1, Value num2) {
1259
       return function(FUNCTION_BITAND, num1, num2);
1260
    } 
1261
    
1262
    @Override
1263
    public Function bitor(Value num1, Value num2) {
1264
       return function(FUNCTION_BITOR, num1, num2);
1265
    }
1266
    
1267
    @Override
1268
    public Function bitxor(Value num1, Value num2) {
1269
       return function(FUNCTION_BITXOR, num1, num2);
1270
    }
1271
    
1272
    @Override
1273
    public Function ceil(Value num) {
1274
       return function(FUNCTION_CEIL, num);
1275
    }
1276
    
1277
    @Override
1278
    public Function degrees(Value num) {
1279
       return function(FUNCTION_DEGREES, num);
1280
    }  
1281
    
1282
    @Override
1283
    public Function exp(Value num) {
1284
       return function(FUNCTION_EXP, num);
1285
    }  
1286
    
1287
    @Override
1288
    public Function floor(Value num) {
1289
       return function(FUNCTION_FLOOR, num);
1290
    }  
1291
    
1292
    @Override
1293
    public Function log(Value num) {
1294
       return function(FUNCTION_LOG, num);
1295
    }  
1296
    
1297
    @Override
1298
    public Function log10(Value num) {
1299
       return function(FUNCTION_LOG10, num);
1300
    }  
1301
    
1302
    @Override
1303
    public Function pi() {
1304
       return function(FUNCTION_PI);
1305
    }
1306
    
1307
    @Override
1308
    public Function abs(Value num) {
1309
       return function(FUNCTION_ABS, num);
1310
    }
1311
    
1312
    @Override
1313
    public Function power(Value num) {
1314
       return function(FUNCTION_POWER, num);
1315
    }
1316
    
1317
    @Override
1318
    public Function radians(Value num) {
1319
       return function(FUNCTION_RADIANS, num);
1320
    }
1321
    
1322
    @Override
1323
    public Function rand(Value num) {
1324
       return function(FUNCTION_RAND, num);
1325
    }
1326
    
1327
    @Override
1328
    public Function round(Value num) {
1329
       return function(FUNCTION_ROUND, num);
1330
    }
1331
    
1332
    @Override
1333
    public Function sqrt(Value num) {
1334
       return function(FUNCTION_SQRT, num);
1335
    }
1336
    
1337
    @Override
1338
    public Function sign(Value num) {
1339
       return function(FUNCTION_SIGN, num);
1340
    }
1341
    
1342
    @Override
1343
    public Function sin(Value num) {
1344
       return function(FUNCTION_SIN, num);
1345
    }
1346
    
1347
    @Override
1348
    public Function sinh(Value num) {
1349
       return function(FUNCTION_SINH, num);
1350
    }
1351
    
1352
    @Override
1353
    public Function tan(Value num) {
1354
       return function(FUNCTION_TAN, num);
1355
    }
1356
    @Override
1357
    public Function tanh(Value num) {
1358
       return function(FUNCTION_TANH, num);
1359
    }  
1360
    
1361
    @Override
1362
    public Function zero() {
1363
       return function(FUNCTION_ZERO);
1364
    }
1365
    
1366
    @Override
1367
    public Function chr(Value num) {
1368
       return function(FUNCTION_CHR, num);
1369
    }    
1370

    
1371
    @Override
1372
    public Function cast(Value object, Value typeName) {
1373
       return function(FUNCTION_CAST, object, typeName);
1374
    }    
1375

    
1376
    @Override
1377
    public Function decode(Value value, Value format) {
1378
       return function(FUNCTION_DECODE, value, format);
1379
    }    
1380

    
1381
    @Override
1382
    public Function toDouble(Value num) {
1383
       return function(FUNCTION_TODOUBLE, num);
1384
    }    
1385

    
1386
    @Override
1387
    public Function toFloat(Value num) {
1388
       return function(FUNCTION_TOFLOAT, num);
1389
    }    
1390

    
1391
    @Override
1392
    public Function toLong(Value num) {
1393
       return function(FUNCTION_TOLONG, num);
1394
    }    
1395

    
1396
    @Override
1397
    public Function toInteger(Value num) {
1398
       return function(FUNCTION_TOINTEGER, num);
1399
    }    
1400

    
1401
    @Override
1402
    public Function toStr(Value object) {
1403
       return function(FUNCTION_TOSTR, object);
1404
    }    
1405

    
1406
    @Override
1407
    public Function list() {
1408
        return function(FUNCTION_LIST);
1409
    }
1410

    
1411
    @Override
1412
    public Function tuple() {
1413
        return function(FUNCTION_TUPLE);
1414
    }
1415

    
1416
    @Override
1417
    public Function tuple(Object... values) {
1418
        Function fn = function(FUNCTION_TUPLE);
1419
        for (Object theValue : values) {
1420
            if( theValue instanceof ExpressionBuilder.Value ) {
1421
              fn.parameter((Value) theValue);
1422
            } else {
1423
              fn.parameter(constant(theValue));
1424
            }
1425
        }
1426
        return fn;
1427
    }
1428
    
1429
    @Override
1430
    public String repr(Object value) {
1431
        return this.manager.getReprMethod(value).repr(value);
1432
    }
1433

    
1434
  @Override
1435
  public Function getattr(String objectId, String attributeId) {
1436
        Function fn = function(FUNCTION_GETATTR);
1437
        fn.parameter(variable(objectId));
1438
        fn.parameter(variable(attributeId));
1439
        return fn;
1440
  }
1441

    
1442
  @Override
1443
  public Function date(Date date) {
1444
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1445
    return function(FUNCTION_DATE, constant(df.format(date)));
1446
  }
1447

    
1448
  @Override
1449
  public Function time(Date time) {
1450
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1451
    return function(FUNCTION_TIME, constant(df.format(time)));
1452
  }
1453

    
1454
  @Override
1455
  public Function timestamp(Date timestamp) {
1456
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1457
    return function(FUNCTION_TIMESTAMP, constant(df.format(timestamp)));
1458
  }
1459

    
1460
  @Override
1461
  public Function date(String date) {
1462
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
1463
    Date d;
1464
    try {
1465
      d = df.parse(date);
1466
    } catch (ParseException ex) {
1467
      throw new IllegalArgumentException("Can't parse argument '"+date+"' as date.", ex);
1468
    }
1469
    return function(FUNCTION_DATE, constant(df.format(d)));
1470
  }
1471

    
1472
  @Override
1473
  public Function time(String time) {
1474
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
1475
    Date t;
1476
    try {
1477
      t = df.parse(time);
1478
    } catch (ParseException ex) {
1479
      throw new IllegalArgumentException("Can't parse argument '"+time+"' as date.", ex);
1480
    }
1481
    return function(FUNCTION_TIME, constant(df.format(t)));
1482
  }
1483

    
1484
  @Override
1485
  public Function timestamp(String timestamp) {
1486
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1487
    Date ts;
1488
    try {
1489
      ts = df.parse(timestamp);
1490
    } catch (ParseException ex) {
1491
      throw new IllegalArgumentException("Can't parse argument '"+timestamp+"' as date.", ex);
1492
    }
1493
    return function(FUNCTION_TIMESTAMP, constant(df.format(ts)));
1494
  }
1495

    
1496
  @Override
1497
  public Function color(Color color) {
1498
    return function(FUNCTION_COLOR, constant(color.getRed()), constant(color.getGreen()), constant(color.getBlue()), constant(color.getAlpha()));
1499
  }
1500

    
1501
  @Override
1502
  public Function color(Value red, Value green, Value blue, Value alfa) {
1503
    return function(FUNCTION_COLOR, red, green, blue, alfa);
1504
  }
1505

    
1506
  @Override
1507
  public Function date(Value date) {
1508
    return function(FUNCTION_DATE, date);
1509
  }
1510

    
1511
  @Override
1512
  public Function time(Value time) {
1513
    return function(FUNCTION_TIME, time);
1514
  }
1515

    
1516
  @Override
1517
  public Function timestamp(Value timestamp) {
1518
    return function(FUNCTION_TIMESTAMP, timestamp);
1519
  }
1520

    
1521
  @Override
1522
  public Function current_date() {
1523
    return function(FUNCTION_CURRENT_DATE);
1524
  }
1525

    
1526
  @Override
1527
  public Function current_time() {
1528
    return function(FUNCTION_CURRENT_TIME);
1529
  }
1530

    
1531
  @Override
1532
  public Function current_timestamp() {
1533
    return function(FUNCTION_CURRENT_TIMESTAMP);
1534
  }
1535

    
1536
  @Override
1537
  public Function date_add(Value datefield, Value valueToAdd, Value date) {
1538
    return function(FUNCTION_DATEADD, datefield, valueToAdd, date);
1539
  }
1540
  
1541
  @Override
1542
  public Function let(String name, Value value) {
1543
    return function(FUNCTION_LET, this.variable(name), value);
1544
  }
1545

    
1546
  @Override
1547
  public Function date_diff(Value datefield, Value valueToSubst, Value date) {
1548
    return function(FUNCTION_DATEDIFF, datefield, valueToSubst, date);
1549
  }
1550

    
1551
  @Override
1552
  public Function to_date(Value date, Value format) {
1553
    return function(FUNCTION_TO_DATE, date, format);
1554
  }
1555

    
1556
  @Override
1557
  public Function to_timestamp(Value timestamp, Value format) {
1558
    return function(FUNCTION_TO_TIMESTAMP, timestamp, format);
1559
  }
1560

    
1561
  @Override
1562
  public Function extract(Value datefield, Value source) {
1563
    return function(FUNCTION_EXTRACT, datefield, source);
1564
  }
1565
  
1566
}