Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.lib / org.gvsig.expressionevaluator.lib.api / src / main / java / org / gvsig / expressionevaluator / ExpressionBuilder.java @ 47435

History | View | Annotate | Download (21.4 KB)

1
package org.gvsig.expressionevaluator;
2

    
3
import java.awt.Color;
4
import java.util.Collections;
5
import java.util.Date;
6
import java.util.List;
7
import java.util.Map;
8
import org.apache.commons.lang3.StringUtils;
9
import org.gvsig.tools.util.PropertiesSupport;
10
import org.gvsig.tools.util.PropertiesSupportHelper;
11

    
12
public interface ExpressionBuilder extends PropertiesSupport {
13

    
14
    public static boolean isFunction(Value value, String name) {
15
        return ( value instanceof Function &&
16
                StringUtils.equalsIgnoreCase(name, ((Function) value).name()));
17
    }    
18
    
19
    public static final String OPERATOR_NOT = "NOT";
20
    public static final String OPERATOR_NEGATE = "NEGATE";
21
    public static final String OPERATOR_IS = "IS";
22
    public static final String OPERATOR_IS_NULL = "IS NULL";
23
    public static final String OPERATOR_IS_NOT_NULL = "IS NOT NULL";
24
    public static final String OPERATOR_AND = "AND";
25
    public static final String OPERATOR_OR = "OR";
26
    public static final String OPERATOR_EQ = "=";
27
    public static final String OPERATOR_NE = "<>";
28
    public static final String OPERATOR_GT = ">";
29
    public static final String OPERATOR_GE = ">=";
30
    public static final String OPERATOR_LT = "<";
31
    public static final String OPERATOR_LE = "<=";
32
    public static final String OPERATOR_LIKE = "LIKE";
33
    public static final String OPERATOR_ILIKE = "ILIKE";
34
    public static final String OPERATOR_ADD = "+";
35
    public static final String OPERATOR_SUBST = "-";
36
    public static final String OPERATOR_MULT = "*";
37
    public static final String OPERATOR_DIV = "/";
38
    public static final String OPERATOR_MOD = "%";
39
    public static final String OPERATOR_CONCAT = "||";
40
    public static final String OPERATOR_REGEXP = "~";
41
    public static final String OPERATOR_AND2 = "&&";
42
    public static final String OPERATOR_IN = "IN";
43
    public static final String OPERATOR_BETWEEN = "BETWEEN";
44
    
45
    public static final String FUNCTION_CASE = "CASE";
46
    public static final String FUNCTION_IIF = "IIF";
47
    public static final String FUNCTION_IF = "IF";
48
    public static final String FUNCTION_IFNULL = "IFNULL";
49
    
50
    public static final String FUNCTION_LEFT = "LEFT";
51
    public static final String FUNCTION_RIGHT = "RIGHT";
52
    public static final String FUNCTION_LOCATE = "LOCATE";
53
    public static final String FUNCTION_POSITION = "POSITION";
54
    public static final String FUNCTION_LPAD = "LPAD";
55
    public static final String FUNCTION_RPAD = "RPAD";
56
    public static final String FUNCTION_LTRIM = "LTRIM";
57
    public static final String FUNCTION_RTRIM = "RTRIM";
58
    public static final String FUNCTION_TRIM = "TRIM";
59
    public static final String FUNCTION_REPEAT = "REPEAT";
60
    public static final String FUNCTION_REPLACE = "REPLACE";
61
    public static final String FUNCTION_ASCII = "ASCII";
62
    public static final String FUNCTION_LENGHT = "LENGHT";
63
    public static final String FUNCTION_INSTR = "INSTR";
64
    public static final String FUNCTION_REVERSEINSTR = "REVERSEINSTR";
65
    public static final String FUNCTION_LOWER = "LOWER";
66
    public static final String FUNCTION_UPPER = "UPPER";
67
    public static final String FUNCTION_SPACE = "SPACE";
68
    public static final String FUNCTION_SUBSTRING = "SUBSTRING";
69
    public static final String FUNCTION_CONCAT = "CONCAT";
70
    public static final String FUNCTION_ABS = "ABS";
71
    public static final String FUNCTION_ACOS = "ACOS";
72
    public static final String FUNCTION_ASIN = "ASIN";
73
    public static final String FUNCTION_ATAN = "ATAN";
74
    public static final String FUNCTION_COS = "COS";
75
    public static final String FUNCTION_COSH = "COSH";
76
    public static final String FUNCTION_COT = "COT";
77
    public static final String FUNCTION_BITAND = "BITAND";
78
    public static final String FUNCTION_BITOR = "BITOR";
79
    public static final String FUNCTION_BITXOR = "BITXOR";
80
    public static final String FUNCTION_CEIL = "CEIL";
81
    public static final String FUNCTION_DEGREES = "DEGREES";
82
    public static final String FUNCTION_EXP = "EXP";
83
    public static final String FUNCTION_FLOOR = "FLOOR";
84
    public static final String FUNCTION_LOG = "LOG";
85
    public static final String FUNCTION_LOG10 = "LOG10";
86
    public static final String FUNCTION_PI = "PI";
87
    public static final String FUNCTION_POWER = "POWER";
88
    public static final String FUNCTION_RADIANS = "RADIANS";
89
    public static final String FUNCTION_RAND = "RAND";
90
    public static final String FUNCTION_ROUND = "ROUND";
91
    public static final String FUNCTION_SQRT = "SQRT";
92
    public static final String FUNCTION_SIGN = "SIGN";
93
    public static final String FUNCTION_SIN = "SIN";
94
    public static final String FUNCTION_SINH = "SINH";
95
    public static final String FUNCTION_TAN = "TAN";
96
    public static final String FUNCTION_TANH = "TANH";
97
    public static final String FUNCTION_ZERO = "ZERO";
98
    public static final String FUNCTION_CHR = "CHR";
99
    public static final String FUNCTION_MOD = "MOD";
100
    public static final String FUNCTION_UUID = "UUID";
101
    
102
    public static final String FUNCTION_COUNT = "COUNT";
103
    public static final String FUNCTION_MAX = "MAX";
104
    public static final String FUNCTION_MIN = "MIN";
105
    public static final String FUNCTION_SUM = "SUM";
106
    public static final String FUNCTION_AVG = "AVG";
107

    
108
    public static final String FUNCTION_DATE = "DATE";
109
    public static final String FUNCTION_TIME = "TIME";
110
    public static final String FUNCTION_TIMESTAMP = "TIMESTAMP";  
111

    
112
    public static final String FUNCTION_TO_DATE = "TO_DATE";
113
    public static final String FUNCTION_TO_TIMESTAMP = "TO_TIMESTAMP";  
114
    public static final String FUNCTION_DATEDIFF = "DATEDIFF";
115
    public static final String FUNCTION_DATEADD = "DATEADD";
116
    public static final String FUNCTION_CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP";
117
    public static final String FUNCTION_CURRENT_TIME = "CURRENT_TIME";
118
    public static final String FUNCTION_CURRENT_DATE = "CURRENT_DATE";
119
    public static final String FUNCTION_EXTRACT = "EXTRACT";
120
    
121
    public static final String FUNCTION_CAST = "CAST";
122
    public static final String FUNCTION_DECODE = "DECODE";
123
    public static final String FUNCTION_ENCODE = "ENCODE";
124
    public static final String FUNCTION_TODOUBLE = "TODOUBLE";
125
    public static final String FUNCTION_TOFLOAT = "TOFLOAT";
126
    public static final String FUNCTION_TOINTEGER = "TOINTEGER";
127
    public static final String FUNCTION_TOLONG = "TOLONG";
128
    public static final String FUNCTION_TOSTR = "TOSTR";
129
    public static final String FUNCTION_TOJSON = "TO_JSON";
130
    public static final String FUNCTION_MAP = "MAP";
131
    
132
    public static final String FUNCTION_LET = "LET";
133

    
134
    public static final String FUNCTION_INCR = "INCR";
135
    public static final String FUNCTION_DECR = "DECR";
136
    
137
    public static final String FUNCTION_RANGE = "RANGE";
138
    public static final String FUNCTION_EVAL = "EVAL";
139
    public static final String FUNCTION_LIST = "LIST";
140
    public static final String FUNCTION_TUPLE = "TUPLE";
141
    public static final String FUNCTION_DICT = "DICT";
142
    
143
    @Deprecated // Use HOST EXPRESSION
144
    public static final String FUNCTION_$CONSTANT = "$CONSTANT";
145
    @Deprecated // Use HOST EXPRESSION
146
    public static final String FUNCTION_$IDENTIFIER = "$IDENTIFIER";
147
    
148
    public static final String FUNCTION_$HOSTEXPRESSION = "$HOSTEXPRESSION";
149
    
150
    public static final String FUNCTION_GETATTR = "GETATTR";
151
    public static final String FUNCTION_SETATTR = "SETATTR";
152
    public static final String FUNCTION_GETITEM = "GETITEM";
153
    public static final String FUNCTION_URLREAD = "URL_READ";
154
    public static final String FUNCTION_URLREADBYTES = "URL_READBYTES";
155
    public static final String FUNCTION_URL = "URL";
156

    
157
    public static final String FUNCTION_DESKTOPBROWSE = "DESKTOP_BROWSE";
158
    public static final String FUNCTION_DESKTOPOPEN = "DESKTOP_OPEN";
159
    public static final String FUNCTION_DESKTOPEDIT = "DESKTOP_EDIT";
160

    
161
    public static final String FUNCTION_CRC32 = "CRC";
162
    public static final String FUNCTION_MD5HEX = "MD5HEX";
163
    
164
    public static final String FUNCTION_COLOR = "COLOR";
165
    
166
    public static final String FUNCTION_JSON_VALUE = "JSON_VALUE";
167
    
168
    public static final int PARAMETER_TYPE_CONSTANT = 0;
169
    public static final int PARAMETER_TYPE_VARIABLE = 1;
170
    
171
    public interface VisitorFilter {
172
        boolean accept(Visitable visitable);
173
        default boolean skipChildren() { return false; }
174
    }
175

    
176
     public interface Visitor {
177
        public void visit(Visitable value);
178
    }
179

    
180
    public interface Visitable {
181
        public void accept(Visitor visitor, VisitorFilter filter);
182
    }
183
        
184
    public interface Value extends Visitable, PropertiesSupport, org.gvsig.tools.lang.Cloneable {
185
        public String toString(Formatter<Value> formatter);
186
        public void replace(Value target, Value replacement);
187
        public void copyPropertiesFrom(PropertiesSupport properties);
188

    
189
        @Override
190
        public Value clone() throws CloneNotSupportedException;
191
        
192
    }
193

    
194
    public interface Group extends Value {
195
        public Value value();
196
    }
197

    
198
    public interface Constant extends Value {
199
        public Object value();
200
    }
201

    
202
    public static final Constant VALUE_NULL = new Constant() {
203
        @Override
204
        public Object value() {
205
            return null;
206
        }
207

    
208
        @Override
209
        public String toString() {
210
            return "NULL";
211
        }
212

    
213
        @Override
214
        public String toString(Formatter<Value> formatter) {
215
            return "NULL";
216
        }
217

    
218
        @Override
219
        public void replace(Value target, Value replacement) {
220
        }
221

    
222
        @Override
223
        public void copyPropertiesFrom(PropertiesSupport properties) {
224
        }
225

    
226
        @Override
227
        @SuppressWarnings("CloneDoesntCallSuperClone")
228
        public Value clone() throws CloneNotSupportedException {
229
            return this;
230
        }
231

    
232
        @Override
233
        public void accept(Visitor visitor, VisitorFilter filter) {
234
        }
235

    
236
        @Override
237
        public Object getProperty(String name) {
238
            return null;
239
        }
240

    
241
        @Override
242
        public void setProperty(String name, Object value) {
243
        }
244

    
245
        @Override
246
        public Map<String, Object> getProperties() {
247
            return Collections.EMPTY_MAP;
248
        }
249
    };
250
    
251
    public interface Custom extends Value {
252
        public Object value();
253
        public Custom add(Variable variable);
254
        public Custom add(Parameter parameter);
255
    }
256

    
257
    public interface Variable extends Value, Comparable<Variable> {
258
        public String name();
259
    }
260

    
261
    public interface Parameter extends Value {
262
        public Parameter as_constant();
263
        public Parameter as_variable();        
264
        public Parameter value(Object value);
265
        public Parameter name(String value);
266
        public int type();
267
        public String name();
268
        public Object value();
269
        public boolean is_constant();
270
        public boolean is_variable();
271
    }
272
    
273
    public interface Function extends Value {
274
        public String name();
275
        public String name(String name);
276
        public List<Value> parameters();
277
        public Function parameter(Value parameter);
278
        public Function format(String format);
279
    }
280

    
281
    public interface Method extends Value {
282
        public String name();
283
        public Value instance();
284
        public List<Value> parameters();
285
        public Function parameter(Value parameter);
286
    }
287

    
288
    public interface BinaryOperator extends Function {
289
        @Override
290
        public String name();
291
        public Value left();
292
        public Value right();
293
        public BinaryOperator left(Value operand);
294
        public BinaryOperator right(Value operand);
295
    }
296

    
297
    public abstract class AbstractValue implements Value {
298

    
299
        protected PropertiesSupportHelper properties;
300
        
301
        protected AbstractValue() {
302
            this.properties = new PropertiesSupportHelper();
303
        }
304

    
305
        @Override
306
        public Value clone() throws CloneNotSupportedException {
307
            AbstractValue other = (AbstractValue) super.clone();
308
            other.properties = properties.clone();
309
            return other;
310
        }
311
        
312
        
313
        @Override
314
        public void copyPropertiesFrom(PropertiesSupport properties) {
315
            for (Map.Entry<String, Object> entry : properties.getProperties().entrySet()) {
316
                String key = entry.getKey();
317
                Object value1 = entry.getValue();
318
                this.setProperty(key, value1);
319
            }
320
        }
321
        
322
        @Override
323
        public void accept(Visitor visitor, VisitorFilter filter) {
324
            if (filter == null || filter.accept(this)) {
325
                visitor.visit(this);
326
            }
327
        }
328

    
329
        @Override
330
        public Map<String, Object> getProperties() {
331
            return this.properties.getProperties();
332
        }
333

    
334
        @Override
335
        public Object getProperty(String name) {
336
            return this.properties.getProperty(name);
337
        }
338

    
339
        @Override
340
        public void setProperty(String name, Object value) {
341
            this.properties.setProperty(name, value);
342
        }
343

    
344
        @Override
345
        public void replace(Value target, Value replacement) {
346
            // Do nothing
347
        }
348
    }
349

    
350
    public class ClassVisitorFilter implements VisitorFilter {
351

    
352
        private final Class classFilter;
353

    
354
        public ClassVisitorFilter(Class classFilter) {
355
            this.classFilter = classFilter;
356
        }
357

    
358
        @Override
359
        public boolean accept(Visitable visitable) {
360
            if( classFilter==null ) {
361
                return true;
362
            }
363
            return classFilter.isInstance(visitable);
364
        }
365

    
366
    }
367

    
368
    public static final Formatter<Value> EMPTY_FORMATTER = new Formatter<Value>() {
369
        @Override
370
        public boolean canApply(Value value) {
371
            return false;
372
        }
373

    
374
        @Override
375
        public String format(Value value) {
376
            return "";
377
        }
378
    };
379
            
380
    public Formatter<Value> formatter();
381

    
382
    public String quote_for_identifiers();
383
    
384
    public String quote_for_strings();
385
    
386
    public void accept(Visitor visitor, VisitorFilter filter);
387

    
388
    public List<Variable> variables();
389
    
390
    public List<String> variables_names();
391
    
392
    public List<Parameter> parameters();
393
    
394
    public List<String> parameters_names();
395
    
396
    public String identifier(String name);
397

    
398
    public String bytearray_hex(byte[] data);
399

    
400
    public String bytearray_0x(byte[] data);
401

    
402
    public String bytearray_x(byte[] data);
403

    
404
    public String string(String s);
405
   
406
    public Value value();
407
    
408
    public ExpressionBuilder value(Value value);
409

    
410
    public Group group(Value group);
411
    
412
    public Constant bytearray(byte[] data);
413
    
414
    public Variable variable(String name);
415
    
416
    public Variable column(String name); // Alias for variable(name)
417

    
418
    public Value column(String tableName, String columnName);
419

    
420
    public Parameter parameter(String name);
421

    
422
    public Parameter parameter();
423

    
424
    public Constant constant(Object value);
425
    
426
    public Constant constant(Object value, int type);
427
    
428
    public Constant constant(Object value, Class theClass);
429
        
430
    public Custom custom(Object value);
431

    
432
    public Method method(Value instance, String name, Value... values);
433

    
434
    public Function function(String name, Value... values);
435
    
436
    public BinaryOperator binaryOperator(String name, Value leftOperand, Value rightOperand);
437

    
438
    public Value toValue(String expression);
439

    
440
    public String repr(Object value);
441
    
442
    public String toString(Formatter<Value> formatter);
443
    
444
    public Function not(Value value);
445

    
446
    public Function not_is_null(Value value);
447
    
448
    public Function is_null(Value value);
449

    
450
      
451
    public BinaryOperator and(Value op1, Value op2);
452

    
453
    public BinaryOperator and(Expression op1, Expression op2);
454

    
455
    public BinaryOperator and(Expression op1, Value op2);
456

    
457
    public BinaryOperator or(Value op1, Value op2);
458

    
459
    public BinaryOperator eq(Value op1, Value op2);
460
    
461
    public BinaryOperator ne(Value op1, Value op2);
462
    
463
    public BinaryOperator gt(Value op1, Value op2);
464
    
465
    public BinaryOperator ge(Value op1, Value op2);
466

    
467
    public BinaryOperator lt(Value op1, Value op2);
468
    
469
    public BinaryOperator le(Value op1, Value op2);
470

    
471
    public BinaryOperator like(Value op1, Value op2);
472

    
473
    public BinaryOperator ilike(Value op1, Value op2);
474

    
475
    public BinaryOperator add(Value op1, Value op2);
476

    
477
    public BinaryOperator subst(Value op1, Value op2);
478

    
479
    public BinaryOperator mult(Value op1, Value op2);
480

    
481
    public BinaryOperator div(Value op1, Value op2);
482

    
483
    public Function concat(Value...values);
484

    
485
    public ExpressionBuilder set(Value value);
486
    
487
    public ExpressionBuilder and(Value value);
488

    
489
    public ExpressionBuilder or(Value value);
490

    
491
    public Function iif(Value condition, Value iftrue, Value iffalse);
492
    
493
    public Function ifnull(Value value, Value iftrue, Value iffalse);
494

    
495
    public ExpressionBuilder createExpressionBuilder();
496
   
497
    public Function left(Value str, Value size);
498
    
499
    public Function right(Value str, Value len);
500
    
501
    public Function locate(Value search, Value str, Value start) ;
502
    
503
    public Function position(Value search, Value str);
504
    
505
    public Function lpad(Value str, Value len, Value padstr) ;
506
    
507
    public Function rpad(Value str, Value len, Value padstr);
508
    
509
    public Function ltrim(Value str);
510
    
511
    public Function rtrim(Value str);
512
    
513
    public Function trim(Value str);
514
    
515
    public Function repeat(Value str, Value size);
516
    
517
    public Function replace(Value str, Value search, Value replstr);
518
    
519
    public Function ascii(Value str);
520
    
521
    public Function lenght(Value str);
522

    
523
    public Function instr(Value str, Value search, Value start);
524
    
525
    public Function lower(Value str);
526
    
527
    public Function upper(Value str);
528
    
529
    public Function space(Value size);
530
    
531
    public Function substring(Value str, Value start, Value len);
532
    
533
    public Function abs(Value num);
534
    
535
    public Function acos(Value num);
536
    
537
    public Function asin(Value num);
538
    
539
    public Function atan(Value num);
540
    
541
    public Function cos(Value num);
542
    
543
    public Function cosh(Value num);
544
    
545
    public Function cot(Value num);
546
    
547
    public Function bitand(Value num1, Value num2);
548
    
549
    public Function bitor(Value num1, Value num2);
550
    
551
    public Function bitxor(Value num1, Value num2);
552
    
553
    public Function ceil(Value num);
554
    
555
    public Function degrees(Value num);
556
    
557
    public Function exp(Value num);
558
    
559
    public Function floor(Value num);
560
    
561
    public Function log(Value num);
562
    
563
    public Function log10(Value num);
564
    
565
    public Function pi();
566
    
567
    public Function power(Value num);
568
    
569
    public Function radians(Value num);
570
    
571
    public Function rand(Value num);
572
    
573
    public Function round(Value num);
574
    
575
    public Function sqrt(Value num);
576
    
577
    public Function sign(Value num);
578
    
579
    public Function sin(Value num);
580
    
581
    public Function sinh(Value num);
582
    
583
    public Function tan(Value num);
584
    
585
    public Function tanh(Value num);
586
    
587
    public Function zero();
588
    
589
    public Function chr(Value num);
590

    
591
    public Function decode(Value value, Value format);
592

    
593
    public Function cast(Value object, Value typeName);
594
    
595
    public Function cast(Value object, int type);
596

    
597
    public Function toDouble(Value object);
598

    
599
    public Function toFloat(Value object);
600

    
601
    public Function toLong(Value object);
602

    
603
    public Function toInteger(Value object);
604

    
605
    public Function toStr(Value object);
606

    
607
    public Function list();
608
    
609
    public Function tuple();
610
    
611
    public Function tuple(Object... values);
612
    
613
    public Function getattr(String objectId, String attributeId);
614
    
615
    public boolean isEmpty();
616

    
617
    public Function color(Value red, Value green, Value blue, Value alfa);
618
    
619
    public Function color(Color color);
620
    
621
    public Function date(Value date);
622
    
623
    public Function time(Value date);
624
    
625
    public Function timestamp(Value date);
626

    
627
    public Function date(Date date);
628
    
629
    public Function time(Date time);
630
    
631
    public Function timestamp(Date timestamp);
632

    
633
    public Function date(String date);
634
    
635
    public Function time(String time);
636
    
637
    public Function timestamp(String timestamp);
638

    
639
    public Function to_date(Value date, Value format);
640
    
641
    public Function to_timestamp(Value timestamp, Value format);
642

    
643
    public Function current_date();
644
    
645
    public Function current_time();
646
    
647
    public Function current_timestamp();
648
    
649
    public Function let(String name, Value value);
650
    
651
    public Function date_add(Value datefield, Value valueToAdd, Value date);
652

    
653
    public Function date_diff(Value datefield, Value valueToSubst, Value date);
654
    
655
    public Function extract(Value datefield, Value source);
656
    
657
    public String build(Formatter<Value> formatter);
658
    
659
    public String build();
660
    
661
    public void setProperties(Class filter, final Object... values);
662
    
663
}