Revision 44769

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestDateExpressionBuilder.java
62 62
    protected SymbolTable createSymbolTable() {
63 63
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
64 64
        MutableSymbolTable symbolTable = manager.createSymbolTable();
65
        symbolTable.setVar("precio", 200);
66
        symbolTable.setVar("1990", 0.168873933773767);
67 65
        return symbolTable;
68 66
    }
69 67

  
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/DefaultStatement.java
21 21
import org.gvsig.expressionevaluator.impl.function.programming.CodeBlockFunction;
22 22
import org.gvsig.expressionevaluator.impl.DefaultCodeBuilder.BaseCodes;
23 23
import org.gvsig.expressionevaluator.Code.Callable;
24
import org.gvsig.expressionevaluator.ExpressionBuilder;
25
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_TUPLE;
24 26

  
25 27
/**
26 28
 *
......
666 668
                if( context.isReservedWord(identifier) ) {
667 669
                    break;
668 670
                }
669
                Code code = context.getCodeBuilder().constant(identifier);
671
                Code code = context.getCodeBuilder().identifier(identifier);
670 672
                args.add(code);
671 673
                context.next_token();
672 674
                token = context.look_token();
......
683 685
                );
684 686
            }
685 687
            if( this.id!=null ) {
686
              Code code = context.getCodeBuilder().function(FUNCTION_LIST, args);
688
              Code code = context.getCodeBuilder().function(FUNCTION_TUPLE, args);
687 689
              context.setCode(id, code);
688 690
            }
689 691
        }
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
22 22
import org.gvsig.expressionevaluator.ExpressionUtils;
23 23
import org.gvsig.expressionevaluator.Formatter;
24 24
import org.gvsig.expressionevaluator.ReprMethod;
25
import static org.gvsig.expressionevaluator.ExpressionBuilder.BASE_FORMATTER;
26 25

  
27 26
@SuppressWarnings({"UseSpecificCatch" ,"OverridableMethodCallInConstructor"})
28 27
public class DefaultExpressionBuilder implements ExpressionBuilder {
......
55 54
    private static final String FORMAT_OPERATOR_DIV = "({0} / {1})";
56 55
    private static final String FORMAT_OPERATOR_CONCAT = "{0} || {1}";
57 56

  
58
    public static class GroupBase extends AbstractValue implements Group {
57
    public class GroupBase extends AbstractValue implements Group {
59 58

  
60 59
        protected Value value;
61 60

  
......
85 84

  
86 85
        @Override
87 86
        public String toString() {
88
            return this.toString(BASE_FORMATTER);
87
            return this.toString(formatter());
89 88
        }
90 89
        
91 90
        @Override
......
97 96
        }
98 97
    }
99 98

  
100
    public static class VariableBase extends AbstractValue implements Variable {
99
    public class VariableBase extends AbstractValue implements Variable {
101 100

  
102 101
        protected String name;
103 102
        protected ExpressionBuilder builder;
......
114 113

  
115 114
        @Override
116 115
        public String toString() {
117
            return this.toString(BASE_FORMATTER);
116
            return this.toString(formatter());
118 117
        }
119 118
        
120 119
        @Override
......
146 145
        }
147 146
    }
148 147

  
149
    public static class ParameterBase extends AbstractValue implements Parameter {
148
    public class ParameterBase extends AbstractValue implements Parameter {
150 149

  
151 150
        protected String name;
152 151
        protected Object value;
......
242 241

  
243 242
        @Override
244 243
        public String toString() {
245
            return this.toString(BASE_FORMATTER);
244
            return this.toString(formatter());
246 245
        }
247 246
        
248 247
        @Override
......
261 260
        }
262 261
    }
263 262

  
264
    public static class ConstantBase extends AbstractValue implements Constant {
263
    public class ConstantBase extends AbstractValue implements Constant {
265 264

  
266 265
        protected Object value;
267 266
        protected ExpressionBuilder builder;
......
278 277

  
279 278
        @Override
280 279
        public String toString() {
281
            return this.toString(BASE_FORMATTER);
280
            return this.toString(formatter());
282 281
        }
283 282
        
284 283
        @Override
......
308 307
        }
309 308
    }
310 309

  
311
    public static class CustomBase extends AbstractValue implements Custom {
310
    public class CustomBase extends AbstractValue implements Custom {
312 311

  
313 312
        protected Object value;
314 313

  
......
370 369

  
371 370
        @Override
372 371
        public String toString() {
373
            return this.toString(BASE_FORMATTER);
372
            return this.toString(formatter());
374 373
        }
375 374
        
376 375
        @Override
......
382 381
        }
383 382
    }
384 383

  
385
    public static class FunctionBase extends AbstractValue implements Function {
384
    public class FunctionBase extends AbstractValue implements Function {
386 385

  
387 386
        protected String name;
388 387
        protected String format;
......
406 405
        }
407 406

  
408 407
        @Override
408
        public Function format(String format) {
409
          this.format = format;
410
          return this;
411
        }
412

  
413
        @Override
409 414
        public Function parameter(Value parameter) {
410 415
            this.parameters().add(parameter);
411 416
            return this;
......
444 449
        
445 450
        @Override
446 451
        public String toString() {
447
            return this.toString(BASE_FORMATTER);
452
            return this.toString(formatter());
448 453
        }
449 454
        
450 455
        @Override
......
601 606

  
602 607
        @Override
603 608
        public String toString() {
604
            return this.toString(BASE_FORMATTER);
609
            return this.toString(formatter());
605 610
        }
606 611
        
607 612
        @Override
......
631 636

  
632 637
    protected Value value;
633 638
    protected ExpressionEvaluatorManager manager;
639
    protected Formatter<ExpressionBuilder.Value> formatter;
634 640

  
635 641
    public DefaultExpressionBuilder(ExpressionEvaluatorManager manager) {
636 642
        this.manager = manager;
637 643
    }
644
    
645
    @Override
646
    public Formatter<ExpressionBuilder.Value> formatter() {
647
      if( this.formatter == null ) {
648
        this.formatter = this.manager.getExpressionBuilderFormatter();
649
      }
650
      return this.formatter;
651
    }
638 652

  
639 653
    @Override
640 654
    public boolean isEmpty() {
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/DefaultExpressionEvaluatorManager.java
29 29
import org.gvsig.expressionevaluator.SymbolTable;
30 30
import org.gvsig.expressionevaluator.SymbolTableFactory;
31 31
import org.gvsig.expressionevaluator.Compiler;
32
import org.gvsig.expressionevaluator.Formatter;
32 33
import org.gvsig.expressionevaluator.GrammarSet;
33 34
import org.gvsig.expressionevaluator.ReprMethod;
34 35
import org.gvsig.expressionevaluator.impl.repr.ReprNull;
35 36
import org.gvsig.expressionevaluator.impl.repr.ReprObject;
37
import org.gvsig.expressionevaluator.spi.formatter.value.BaseFormatter;
36 38
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
37 39
import org.gvsig.tools.bookmarksandhistory.History;
38 40
import org.gvsig.tools.bookmarksandhistory.impl.BaseBookmarks;
......
56 58
    private SymbolTable inmutableSymbolTable;
57 59
    private ResourcesStorage scriptsResourcesStorage;
58 60
    private List<ClassLoader> loaders;
61
    private Formatter<ExpressionBuilder.Value> expressionBuilderFormatter;
59 62

  
60 63
    public DefaultExpressionEvaluatorManager() {
61 64
        this.symbolTableFactories = new HashMap<>();
......
63 66
        this.loaders = new ArrayList<>();
64 67
        this.scriptsResourcesStorage = ResourcesStorage.EMPTY_RESOURCESSTORAGE;
65 68
        this.loaders.add(this.getClass().getClassLoader());
69
        this.expressionBuilderFormatter = new BaseFormatter();
66 70
    }
67 71

  
68 72
    @Override
......
471 475
    public List<ClassLoader> getClassLoaders() {
472 476
      return Collections.unmodifiableList(loaders);
473 477
    }
478

  
479
    @Override
480
    public Formatter<ExpressionBuilder.Value> getExpressionBuilderFormatter() {
481
      return expressionBuilderFormatter;
482
    }
483

  
484
    @Override
485
    public void registerExpressionBuilderFormatter(Formatter<ExpressionBuilder.Value> formatter) {
486
      this.expressionBuilderFormatter = formatter;
487
    }
488
    
474 489
}
475 490

  
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
167 167
        public String name();
168 168
        public List<Value> parameters();
169 169
        public Function parameter(Value parameter);
170
        public Function format(String format);
170 171
    }
171 172

  
172 173
    public interface Method extends Value {
......
250 251
        }
251 252
    };
252 253
            
253
    public static final Formatter<Value> BASE_FORMATTER = new BaseFormatter();
254
    public Formatter<Value> formatter();
254 255

  
255 256
    public String quote_for_identifiers();
256 257
    
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/ExpressionEvaluatorManager.java
57 57
    
58 58
    public ExpressionBuilder createExpressionBuilder();
59 59

  
60
    public void registerExpressionBuilderFormatter(Formatter<ExpressionBuilder.Value> formatter);
61

  
62
    public Formatter<ExpressionBuilder.Value> getExpressionBuilderFormatter();
63
    
60 64
    public void registerGrammar(GrammarFactory factory) ;
61 65

  
62 66
    public Collection<GrammarFactory> getGrammarFactories();
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/ExpressionUtils.java
125 125
            return null;
126 126
        }
127 127
        if( formatter==null ) {
128
            formatter = ExpressionBuilder.BASE_FORMATTER;
128
            ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
129
            formatter = manager.getExpressionBuilderFormatter();
129 130
        }
130 131
        return value.toString(formatter);
131 132
    }
132 133

  
133 134
    public static String toString(Value value) {
134
        if( value == null ) {
135
            return null;
136
        }
137
        return value.toString(ExpressionBuilder.BASE_FORMATTER);
135
      return toString(value, null);
138 136
    }
139 137

  
140 138
    public static String toString(Code code, Formatter formatter) {
......
148 146
    }
149 147

  
150 148
    public static String toString(Code code) {
151
        if( code == null ) {
152
            return null;
153
        }
154
        return code.toString(Code.EMPTY_FORMATTER);
149
      return toString(code, null);
155 150
    }
156 151

  
157 152
    public static Expression createExpressionFromJSON(String json) {
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.geometry/org.gvsig.expressionevaluator.geometry.lib/org.gvsig.expressionevaluator.geometry.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultGeometryExpressionBuilderHelper.java
7 7
import org.gvsig.fmap.geom.Geometry;
8 8
import org.gvsig.fmap.geom.primitive.Envelope;
9 9

  
10
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE;
11 10
import org.gvsig.expressionevaluator.ExpressionBuilder.AbstractValue;
12 11
import org.gvsig.expressionevaluator.ExpressionBuilder.Constant;
13 12
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
14 13
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_CONSTANT;
14
import static org.gvsig.expressionevaluator.ExpressionBuilder.PARAMETER_TYPE_VARIABLE;
15 15
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
16 16
import org.gvsig.expressionevaluator.ExpressionBuilder.Visitor;
17 17
import org.gvsig.expressionevaluator.ExpressionBuilder.VisitorFilter;
18 18
import org.gvsig.expressionevaluator.Formatter;
19
import org.gvsig.expressionevaluator.impl.DefaultExpressionBuilder.FunctionBase;
20
import org.gvsig.expressionevaluator.impl.DefaultExpressionBuilder.ParameterBase;
21 19
import org.gvsig.fmap.geom.GeometryUtils;
22 20
import org.gvsig.expressionevaluator.GeometryExpressionBuilderHelper;
23 21
import static org.gvsig.expressionevaluator.GeometryExpressionBuilderHelper.PARAMETER_TYPE_GEOMETRY;
......
45 43
    private static final String FORMAT_ST_GEOMFROMEWKB = "ST_GeomFromEWKB(({0}), ({1}))";
46 44
    private static final String FORMAT_ST_SIMPLIFY = "ST_Simplify(({0}), ({1}))";
47 45

  
48
    public static class GeometryParameterBase 
49
            extends ParameterBase 
46
    public class GeometryParameterBase 
47
            extends AbstractValue 
50 48
            implements GeometryParameter {
51 49

  
52 50
        protected Value srs;
53 51
        protected GeometryExpressionBuilderHelper builder;
54

  
52
        protected String name;
53
        protected Object value;
54
        protected int type;
55 55
        /*
56 56
        Para un parametro de tipo Geometria, el srs sera siempre un Constant
57 57
        excepto cuando se le asigne una geometria contante al parametro y esta
......
61 61
        Si se quiere que el SRS sea un Parameter, se construira como tal.
62 62
        */
63 63
        public GeometryParameterBase(GeometryExpressionBuilderHelper builder) {
64
            super();
64
            this.type = PARAMETER_TYPE_CONSTANT;
65
            this.name = null;
66
            this.value = null;
65 67
            this.builder = builder;
66 68
        }
67 69

  
......
122 124
            return (Geometry) this.value;
123 125
        }
124 126

  
127

  
125 128
        @Override
126
        public GeometryParameter name(String value) {
127
            return (GeometryParameter) super.name(value);
129
        public GeometryParameter as_constant() {
130
            this.type = PARAMETER_TYPE_CONSTANT;
131
            if (this.value == null && this.name != null) {
132
                this.value = this.name;
133
            }
134
            return this;
128 135
        }
129 136

  
130 137
        @Override
131 138
        public GeometryParameter as_variable() {
132
            return (GeometryParameter) super.as_variable();
139
            this.type = PARAMETER_TYPE_VARIABLE;
140
            if (this.value != null && this.name == null) {
141
                this.name = (String) this.value;
142
            }
143
            return this;
133 144
        }
145

  
146
        @Override
147
        public GeometryParameter name(String name) {
148
            this.type = PARAMETER_TYPE_VARIABLE;
149
            this.name = name;
150
            return this;
151
        }
134 152
        
135 153
        @Override
154
        public String name() {
155
            switch (this.type) {
156
                case PARAMETER_TYPE_VARIABLE:
157
                    return this.name;
158
                case PARAMETER_TYPE_CONSTANT:
159
                    if (this.value == null) {
160
                        return null;
161
                    }
162
                    return this.value.toString();
163
                default:
164
                    if (this.name != null) {
165
                        return this.name;
166
                    }
167
                    if (this.value != null) {
168
                        return this.value.toString();
169
                    }
170
                    return null;
171
            }
172
        }
173

  
174
        @Override
175
        public int type() {
176
            return this.type;
177
        }
178

  
179
        @Override
180
        public boolean is_constant() {
181
            return this.type == PARAMETER_TYPE_CONSTANT;
182
        }
183

  
184
        @Override
185
        public boolean is_variable() {
186
            return this.type == PARAMETER_TYPE_VARIABLE;
187
        }
188

  
189
        @Override
136 190
        public GeometryParameter as_geometry_variable() {
137 191
            this.type = PARAMETER_TYPE_GEOMETRY;
138 192
            if (this.value == null && this.name != null) {
......
147 201
        }
148 202

  
149 203
        @Override
150
        public GeometryParameter as_constant() {
151
            return (GeometryParameter) super.as_constant();
152
        }
153

  
154
        @Override
155
        public String name() {
156
            if( this.type == PARAMETER_TYPE_VARIABLE ) {
157
                return this.name;
158
            }
159
            return super.name();
160
        }
161

  
162
        @Override
163 204
        public Object value() {
164 205
            try {
165 206
                switch (this.type) {
......
188 229
                throw new RuntimeException("Can't get value from parameter.", ex);
189 230
            }
190 231
        }
232
        
233
        @Override
234
        public String toString() {
235
          return this.toString(this.builder.builder().formatter()); 
236
        }
191 237

  
192 238
        @Override
193 239
        public String toString(Formatter<Value> formatter) {
......
310 356
        }
311 357

  
312 358
        @Override
359
        public String toString() {
360
          return this.toString(builder.builder().formatter()); 
361
        }
362

  
363
        @Override
313 364
        public String toString(Formatter<Value> formatter) {
314 365
            if( formatter!=null && formatter.canApply(this) ) {
315 366
                return formatter.format(this);
......
368 419
        }
369 420

  
370 421
        @Override
422
        public String toString() {
423
          return this.toString(this.builder.builder().formatter()); 
424
        }
425

  
426
        @Override
371 427
        public String toString(Formatter<Value> formatter) {
372 428
            if( formatter!=null && formatter.canApply(this) ) {
373 429
                return formatter.format(this);
......
474 530
    }
475 531

  
476 532
    public Function builtin_function(String name, String format, Value... values) {
477
        FunctionBase func = new FunctionBase(name, format);
478
        for (Value theValue : values) {
479
            func.parameter(theValue);
480
        }
533
        Function func = this.builder.function(name, values);
534
        func.format(format);
481 535
        return func;
482 536
    }    
483 537
    
484 538
    public Function function(String name, Value... values) {
485
        FunctionBase func = new FunctionBase(name);
486
        for (Value theValue : values) {
487
            func.parameter(theValue);
488
        }
539
        Function func = this.builder.function(name, values);
489 540
        return func;
490 541
    }    
491 542
    
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/expressionevaluator/DALExpressionBuilder.java
3 3
import org.gvsig.expressionevaluator.ExpressionBuilder;
4 4
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
5 5
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
6
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CURRENT_ROW;
7
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CURRENT_STORE;
6
import org.gvsig.expressionevaluator.Formatter;
8 7

  
9 8
/**
10 9
 *
......
18 17
    
19 18
    public SelectBuilder column_all();
20 19
    
21
    public SelectBuilder table(String tableName);
20
    public SelectBuilder from(String tableName); // from === table
22 21
    
23 22
    public SelectBuilder where(Value where);
24 23
    
......
30 29
    
31 30
    @Override
32 31
    public String toString();
32
    
33
    public String toString(Formatter<Value> formatter);
34
    
33 35
  }
34 36
  
35 37
  public interface SelectCountBuilder {
......
46 48

  
47 49
  public ExpressionBuilder expression();
48 50
  
51
  public Formatter<Value> formatter();
52
  
53
  public Formatter<Value> formatter(Formatter<Value> formatter);
54
  
49 55
  public SelectBuilder select();
50 56
  
51 57
  public SelectCountBuilder select_count();
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/SQLBuilderBase.java
52 52
import org.gvsig.tools.dataTypes.DataType;
53 53
import org.slf4j.Logger;
54 54
import org.slf4j.LoggerFactory;
55
import static org.gvsig.expressionevaluator.ExpressionBuilder.BASE_FORMATTER;
56 55

  
57 56
@SuppressWarnings("UseSpecificCatch")
58 57
public class SQLBuilderBase implements SQLBuilder {
......
346 345

  
347 346
        @Override
348 347
        public String toString() {
349
            return this.toString(BASE_FORMATTER);
348
            return this.toString(formatter());
350 349
        }
351 350
        
352 351
        @Override
......
2980 2979
    }
2981 2980

  
2982 2981
    protected Formatter formatter() {
2983
        return ExpressionBuilder.BASE_FORMATTER;
2982
        return expression().formatter();
2984 2983
    }
2985 2984

  
2986 2985
    @Override
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/DALExpressionEvaluatorImplLibrary.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2020 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.expressionevaluator.impl;
25

  
26
import org.gvsig.expressionevaluator.ExpressionEvaluatorLibrary;
27
import org.gvsig.expressionevaluator.impl.symboltable.DALSymbolTableFactory;
28
import org.gvsig.fmap.dal.DALLibrary;
29
import org.gvsig.tools.ToolsLibrary;
30
import org.gvsig.tools.library.AbstractLibrary;
31
import org.gvsig.tools.library.LibraryException;
32

  
33
public class DALExpressionEvaluatorImplLibrary extends AbstractLibrary {
34

  
35
    @Override
36
    public void doRegistration() {
37
        registerAsServiceOf(ExpressionEvaluatorLibrary.class);
38
        require(ToolsLibrary.class);
39
        require(DALLibrary.class);
40
    }
41

  
42
    @Override
43
    protected void doInitialize() throws LibraryException {
44
    }
45

  
46
    @Override
47
    protected void doPostInitialize() throws LibraryException {
48
        DALSymbolTableFactory.selfRegister();
49
    }
50
}
51

  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultDALExpressionBuilder.java
4 4
import org.gvsig.expressionevaluator.ExpressionBuilder;
5 5
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
6 6
import org.gvsig.expressionevaluator.ExpressionUtils;
7
import org.gvsig.expressionevaluator.Formatter;
8
import org.gvsig.expressionevaluator.impl.expressionbuilder.formatters.DALFormatter;
7 9
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CURRENT_ROW;
8 10
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CURRENT_STORE;
9 11
import static org.gvsig.fmap.dal.DataManager.FUNCTION_EXISTS;
......
49 51
    }
50 52

  
51 53
    @Override
52
    public SelectBuilder table(String tableName) {
54
    public SelectBuilder from(String tableName) {
53 55
      this.tableName = tableName;
54 56
      return this;
55 57
    }
......
89 91

  
90 92
    @Override
91 93
    public String toString() {
92
      return this.toValue().toString();
94
      return this.toString(formatter());
93 95
    }
94 96
    
97
    @Override
98
    public String toString(Formatter<Value> formatter) {
99
      return this.toValue().toString(formatter);
100
    }
101
    
95 102
  }
96 103
  
104
  
97 105
  private class DefaultSelectCountBuilder implements SelectCountBuilder {
98 106
    
99 107
    private String tableName;
......
143 151
  }
144 152
  
145 153
  @Override
154
  public Formatter<Value> formatter() {
155
    return this.formatter(null);
156
  }
157
  
158
  @Override
159
  public Formatter<Value> formatter(Formatter<Value> formatter) {
160
    return new DALFormatter(formatter);
161
  }
162
  
163
  @Override
146 164
  public SelectBuilder select() {
147 165
    return new DefaultSelectBuilder();
148 166
  }
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/expressionbuilder/formatters/Exists.java
1
package org.gvsig.expressionevaluator.impl.expressionbuilder.formatters;
2

  
3
import org.apache.commons.lang3.StringUtils;
4
import org.gvsig.expressionevaluator.ExpressionBuilder;
5
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
6
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
7
import org.gvsig.expressionevaluator.Formatter;
8
import static org.gvsig.fmap.dal.DataManager.FUNCTION_EXISTS;
9

  
10
/**
11
 *
12
 * @author jjdelcerro
13
 */
14
public class Exists implements Formatter<Value> {
15
    
16
    private final Formatter<Value> formatter;
17
    
18
    public Exists(Formatter<Value> formatter) {
19
        this.formatter = formatter;
20
    }
21
    @Override
22
    public boolean canApply(ExpressionBuilder.Value value) {
23
        if (value instanceof ExpressionBuilder.Function) {
24
            return StringUtils.equalsIgnoreCase(FUNCTION_EXISTS, ((Function) value).name());
25
        }
26
        return false;
27
    }
28

  
29
    @Override
30
    public String format(Value function0) {
31
        Function function = (Function) function0;
32
        Value exp = function.parameters().get(0);
33
        return "EXISTS("+exp.toString(formatter)+")";
34
    }
35
    
36
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/expressionbuilder/formatters/Select.java
1
package org.gvsig.expressionevaluator.impl.expressionbuilder.formatters;
2

  
3
import org.apache.commons.lang3.StringUtils;
4
import org.gvsig.expressionevaluator.ExpressionBuilder;
5
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_TUPLE;
6
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
7
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
8
import org.gvsig.expressionevaluator.Formatter;
9
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT;
10

  
11
/**
12
 *
13
 * @author jjdelcerro
14
 */
15
@SuppressWarnings("UseSpecificCatch")
16
public class Select implements Formatter<Value> {
17

  
18
  private final Formatter<Value> formatter;
19

  
20
  public Select(Formatter<Value> formatter) {
21
    this.formatter = formatter;
22
  }
23

  
24
  @Override
25
  public boolean canApply(ExpressionBuilder.Value value) {
26
    if (value instanceof ExpressionBuilder.Function) {
27
      return StringUtils.equalsIgnoreCase(FUNCTION_SELECT, ((Function) value).name());
28
    }
29
    return false;
30
  }
31

  
32
  private static final int COLUMNS = 0;
33
  private static final int TABLE = 1;
34
  private static final int WHERE = 2;
35
  private static final int ORDER = 3;
36
  private static final int ORDER_MODE = 4;
37
  private static final int LIMIT = 5;
38

  
39
  @Override
40
  public String format(Value function0) {
41
    Function function = (Function) function0;
42
    String tableName = (String) function.parameters().get(TABLE).toString();
43
    Value where = function.parameters().get(WHERE);
44
    Value order = function.parameters().get(ORDER);
45
    Value limit = function.parameters().get(LIMIT);
46
    Value order_mode = function.parameters().get(ORDER_MODE);
47

  
48
    StringBuilder builder = new StringBuilder();
49
    builder.append("(SELECT ");
50

  
51
    try {
52
      Function columns = (Function) function.parameters().get(COLUMNS);
53
      if (!StringUtils.equalsIgnoreCase(((ExpressionBuilder.Function) columns).name(), FUNCTION_TUPLE)) {
54
        throw new IllegalArgumentException();
55
      }
56
      if( columns.parameters().isEmpty() ) {
57
            builder.append("* ");
58
      } else {
59
        boolean needcomma = false;
60
        for (Value parameter : columns.parameters()) {
61
          if(needcomma) {
62
            builder.append(", ");
63
          } else {
64
            needcomma = true;
65
          }
66
          builder.append(parameter.toString(formatter));
67
        }
68
      }
69
    } catch (Exception ex) {
70
      throw new IllegalArgumentException("Invalid columns, need a tuple function as columns.");
71
    }
72

  
73
    builder.append(" FROM ");
74
    builder.append(tableName);
75
    if (where != null) {
76
      builder.append(" WHERE ");
77
      builder.append(where.toString(formatter));
78
    }
79
//        for( int n=0 ; function.containsParameter("ORDER", n); n++) {
80
//          if( n>0 ) {
81
//            builder.append(", ");
82
//          }
83
//          builder.append(function.getParameter("ORDER",n).toString(formatter));
84
//          if( StringUtils.equalsIgnoreCase(function.getParameter("ORDER_MODE",n).toString(),"true") ) {
85
//            builder.append(" ASC ");
86
//          } else {
87
//            builder.append(" DESC ");
88
//          }
89
//        }
90
    if (limit != null) {
91
      builder.append(" LIMIT ");
92
      builder.append(limit.toString(formatter));
93
    }
94
    builder.append(")");
95
    return builder.toString();
96
  }
97

  
98
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/expressionbuilder/formatters/DALFormatter.java
1
package org.gvsig.expressionevaluator.impl.expressionbuilder.formatters;
2

  
3
import org.gvsig.expressionevaluator.ExpressionBuilder;
4
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
5
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
6
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
7
import org.gvsig.expressionevaluator.Formatter;
8
import org.gvsig.expressionevaluator.spi.formatter.value.BaseFormatter;
9

  
10
/**
11
 *
12
 * @author jjdelcerro
13
 */
14
public class DALFormatter implements Formatter<Value> {
15

  
16
    private final Formatter<ExpressionBuilder.Value>[] formatters;
17

  
18
    public DALFormatter() {
19
      this(null);
20
    }
21
    
22
    public DALFormatter(Formatter<Value> formatter) {
23
        if( formatter==null ) {
24
          formatter = this;
25
        }
26
        this.formatters = new Formatter[]{
27
            // new Exists(formatter),
28
            new Select(formatter),
29
            new BaseFormatter(formatter)
30
        };
31
    }
32

  
33
    @Override
34
    public boolean canApply(Value value) {
35
        for (Formatter<Value> formatter : formatters) {
36
            if (formatter.canApply(value)) {
37
                return true;
38
            }
39
        }
40
        return false;
41
    }
42

  
43
    @Override
44
    public String format(Value value) {
45
        for (Formatter<Value> formatter : formatters) {
46
            if (formatter.canApply(value)) {
47
                return formatter.format(value);
48
            }
49
        }
50
        return value.toString(this);
51
    }
52
    
53
    public static void selfRegister() {
54
      ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getExpressionEvaluatorManager();
55
      manager.registerExpressionBuilderFormatter(new DALFormatter());
56
    }
57
    
58
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/DALFunctions.java
23 23
 */
24 24
package org.gvsig.expressionevaluator.impl;
25 25

  
26
import org.gvsig.expressionevaluator.impl.expressionbuilder.formatters.DALFormatter;
27
import org.gvsig.expressionevaluator.impl.grammars.DataAccessGrammarFactory;
28
import org.gvsig.expressionevaluator.impl.symboltable.DALSymbolTableFactory;
29

  
26 30
/**
27 31
 *
28 32
 * @author jjdelcerro
......
34 38

  
35 39
  public static final String GROUP_DATA_ACCESS = "Data access";
36 40

  
41
  public static void register() {
42
    DataAccessGrammarFactory.selfRegister();
43
    DALSymbolTableFactory.selfRegister();
44
    DALFormatter.selfRegister();
45
  }
37 46
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/grammars/DataAccessGrammarFactory.java
24 24
package org.gvsig.expressionevaluator.impl.grammars;
25 25

  
26 26
import java.util.UUID;
27
import org.apache.commons.lang3.StringUtils;
28 27
import org.gvsig.expressionevaluator.Code;
29 28
import org.gvsig.expressionevaluator.CodeBuilder;
30 29
import org.gvsig.expressionevaluator.Codes;
31 30
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
32 31
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
33
import org.gvsig.expressionevaluator.ExpressionSyntaxException;
34 32
import org.gvsig.expressionevaluator.Grammar;
35 33
import org.gvsig.expressionevaluator.Statement;
36 34
import org.gvsig.expressionevaluator.Statement.ArgsBuilder;
......
97 95
    @Override
98 96
    public Codes build(StatementContext context) {
99 97
      context.trace(this.toString() + ".build");
98
      int n;
99
      BaseCodes argsX;
100
      
100 101
      CodeBuilder codeBuilder = context.getCodeBuilder();
101 102
      BaseCodes args = (BaseCodes) codeBuilder.args();
102 103

  
103 104
      Code columns = context.getCode("COLUMNS");
104
      Code table = context.getCode("TABLE");
105
      Code where = context.getCode("WHERE");
106
//      Code order = context.getCode("ORDER");
107
//      Code order_mode = context.getCode("ORDER_MODE");
108
      Code limit = context.getCode("LIMIT");
109

  
110
      if (columns == null) {
111
        throw new ExpressionSyntaxException();
112
      }
113
      Callable tuple = codeBuilder.tuple();
114
      args.add(tuple);
115
      String s = (String) ((Code.Constant) columns).value();
116
      if (!StringUtils.equalsIgnoreCase(s, "*")) {
117
        ((BaseCodes) (tuple.parameters())).add(codeBuilder.constant(1));
118
      }
105
      args.add(columns);
119 106
      
107
      Code table = context.getCode("TABLE");
120 108
      args.add(codeBuilder.identifier((String) ((Code.Constant) table).value()));
121 109

  
110
      Code where = context.getCode("WHERE");
122 111
      if (where == null) {
123 112
        args.add(codeBuilder.constant(null));
124 113
      } else {
125 114
        args.add(where);
126 115
      }
127 116

  
128
      int n = 1;
129
      BaseCodes argsX = (BaseCodes) codeBuilder.args();
117
      n = 1;
118
      argsX = (BaseCodes) codeBuilder.args();
130 119
      while (true) {
131 120
        String argNameX = "ORDER" + String.valueOf(n);
132 121
        Code code = context.getCode(argNameX);
......
151 140
      }
152 141
      args.add(codeBuilder.tuple(argsX));
153 142

  
143
      Code limit = context.getCode("LIMIT");
154 144
      if (limit == null) {
155 145
        args.add(codeBuilder.constant(null));
156 146
      } else {
......
201 191
  public Grammar create(Object... parameters) {
202 192
    ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
203 193
    if (this.grammar == null) {
194
      CodeBuilder codeBuilder = manager.createCodeBuilder();
204 195
      Grammar theGrammar = manager.createGrammar(this.getName());
196
      
205 197
      Statement stmt;
206

  
198
      
207 199
      theGrammar.addReservedWord("EXISTS");
208 200
      theGrammar.addReservedWord("SELECT");
209 201
      theGrammar.addReservedWord("FROM");
......
237 229

  
238 230
      stmt = theGrammar.createStatement("SELECT");
239 231
      stmt.addRule(stmt.require_any_token("SELECT"));
240
      stmt.addRule(stmt.switch_token()
241
              .addCase("*", stmt.set_expression("COLUMNS", "*"))
242
              .addCase("1", stmt.set_expression("COLUMNS", "1"))
243
              .addDefault(stmt.fail())
232
      stmt.addRule(stmt.optional_any_token("*")
233
              .addRuleOnTrue(stmt.set_expression("COLUMNS", codeBuilder.tuple()))
234
              .addRuleOnFalse(stmt.require_identifiers(",").capture_as("COLUMNS"))
244 235
      );
245 236
      stmt.addRule(stmt.require_any_token("FROM"));
246 237
      stmt.addRule(stmt.require_identifier().capture_as("TABLE"));
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/DALDefaultImplLibrary.java
28 28
import java.util.List;
29 29
import java.util.Map;
30 30
import org.gvsig.expressionevaluator.ExpressionEvaluatorLibrary;
31
import org.gvsig.expressionevaluator.impl.DALFunctions;
31 32
import org.gvsig.expressionevaluator.impl.grammars.DataAccessGrammarFactory;
32 33
import org.gvsig.expressionevaluator.impl.symboltable.DALSymbolTableFactory;
33 34

  
......
193 194
        registerTags();
194 195
        DefaultFeatureAttributeDescriptor.registerPersistenceDefinition();
195 196
        DefaultFeatureType.registerPersistenceDefinition();
196
        DataAccessGrammarFactory.selfRegister();
197
        DALSymbolTableFactory.selfRegister();
197

  
198
        DALFunctions.register();
198 199
        
199 200
        if (exs.size() > 0) {
200 201
            throw new LibraryException(this.getClass(), exs);
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/test/java/org/gvsig/expressionevaluator/TestGrammarCompiler.java
1 1
package org.gvsig.expressionevaluator;
2 2

  
3 3
import junit.framework.TestCase;
4
import org.gvsig.expressionevaluator.impl.expressionbuilder.formatters.DALFormatter;
4 5
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
5 6

  
6 7
/**
......
67 68

  
68 69
        Code code = compiler.compileExpression(source.toString());
69 70
        link(code);
70
        assertEquals("SELECT(NULL, \"countries\", NULL, TUPLE(), TUPLE(), NULL)", code.toString());
71
        assertEquals("SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL)", code.toString());
71 72
    }
72 73

  
73 74
    public void testSelect1() {
......
78 79

  
79 80
        Code code = compiler.compileExpression(source.toString());
80 81
        link(code);
81
        assertEquals("SELECT(NULL, \"countries\", NULL, TUPLE(), TUPLE(), NULL)", code.toString());
82
        assertEquals("SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL)", code.toString());
82 83
    }
83 84
    
84 85
    public void testSelect2() {
......
97 98

  
98 99
        Code code = compiler.compileExpression(source.toString());
99 100
        link(code);
100
        assertEquals("BLOCK(LET('X', 0), FOREACH('row', SELECT(NULL, \"countries\", NULL, TUPLE(), TUPLE(), NULL), IFF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
101
        assertEquals("BLOCK(LET('X', 0), FOREACH('row', SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL), IFF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
101 102
    }
102 103

  
103 104
    public void testSelect3() {
......
116 117

  
117 118
        Code code = compiler.compileExpression(source.toString());
118 119
        link(code);
119
        assertEquals("BLOCK(LET('X', 0), FOREACH('row', SELECT(NULL, \"countries\", NULL, TUPLE(), TUPLE(), NULL), IFF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
120
        assertEquals("BLOCK(LET('X', 0), FOREACH('row', SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL), IFF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
120 121
    }
121 122

  
122 123
    public void testSelectWhere() {
......
128 129

  
129 130
        Code code = compiler.compileExpression(source.toString());
130 131
        link(code);
131
        assertEquals("SELECT(NULL, \"countries\", (\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL)", code.toString());
132
        assertEquals("SELECT(TUPLE(), \"countries\", (\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL)", code.toString());
132 133
    }
133 134

  
134 135
    public void testSelectCountWhere() {
......
152 153

  
153 154
        Code code = compiler.compileExpression(source.toString());
154 155
        link(code);
155
        assertEquals("SELECT(NULL, \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL)", code.toString());
156
        assertEquals("SELECT(TUPLE(), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL)", code.toString());
156 157
    }
157 158

  
158 159
    public void testSelectOrder() {
......
164 165

  
165 166
        Code code = compiler.compileExpression(source.toString());
166 167
        link(code);
167
        assertEquals("SELECT(NULL, \"countries\", NULL, TUPLE(\"CONTINENT\", \"LASTCENSUS\"), TUPLE(TRUE, FALSE), NULL)", code.toString());
168
        assertEquals("SELECT(TUPLE(), \"countries\", NULL, TUPLE(\"CONTINENT\", \"LASTCENSUS\"), TUPLE(TRUE, FALSE), NULL)", code.toString());
168 169
    }
169 170

  
170 171
    public void testSelectWhereOrder() {
......
177 178

  
178 179
        Code code = compiler.compileExpression(source.toString());
179 180
        link(code);
180
        assertEquals("SELECT(NULL, \"countries\", (\"LASTCENSUS\" > 0), TUPLE(\"ID\"), TUPLE(TRUE), NULL)", code.toString());
181
        assertEquals("SELECT(TUPLE(), \"countries\", (\"LASTCENSUS\" > 0), TUPLE(\"ID\"), TUPLE(TRUE), NULL)", code.toString());
181 182
    }
182 183

  
183 184
    public void testSelectWhereOrderLimit() {
......
191 192

  
192 193
        Code code = compiler.compileExpression(source.toString());
193 194
        link(code);
194
        assertEquals("SELECT(NULL, \"countries\", (\"LASTCENSUS\" > 0), TUPLE(\"LASTCENSUS\"), TUPLE(FALSE), 3)", code.toString());
195
        assertEquals("SELECT(TUPLE(), \"countries\", (\"LASTCENSUS\" > 0), TUPLE(\"LASTCENSUS\"), TUPLE(FALSE), 3)", code.toString());
195 196
    }
196 197

  
197 198
    public void testSelectLimit() {
......
203 204

  
204 205
        Code code = compiler.compileExpression(source.toString());
205 206
        link(code);
206
        assertEquals("SELECT(NULL, \"countries\", NULL, TUPLE(), TUPLE(), 3)", code.toString());
207
        assertEquals("SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), 3)", code.toString());
207 208
    }
208 209

  
209 210
    public void testExists() {
......
223 224
    public void testExistsSelect1() {
224 225
        StringBuilder source = new StringBuilder();
225 226
        source.append("EXISTS(");
226
        source.append(" SELECT 1 FROM countries");
227
        source.append(" SELECT \"ISO_A2\" FROM countries");
227 228
        source.append("   WHERE countries.LASTCENSUS > 0 ; ");
228 229
        source.append(")");
229 230

  
......
234 235
        String id = "????????????????????????????????";
235 236
        String s = code.toString();
236 237
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
237
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
238
        assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
238 239
    }
239 240

  
240 241
    public void testExistsSelect2() {
241 242
        StringBuilder source = new StringBuilder();
242 243
        source.append("EXISTS(");
243
        source.append(" SELECT 1 FROM countries");
244
        source.append(" SELECT \"ISO_A2\" FROM countries");
244 245
        source.append("   WHERE countries.LASTCENSUS > 0 ");
245 246
        source.append(")");
246 247

  
......
251 252
        String id = "????????????????????????????????";
252 253
        String s = code.toString();
253 254
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
254
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
255
        assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
255 256
    }
256 257

  
257 258
    public void testExistsSelectLimit1() {
258 259
        StringBuilder source = new StringBuilder();
259 260
        source.append("EXISTS(");
260
        source.append(" SELECT 1 FROM countries  ");
261
        source.append(" SELECT \"ISO_A2\" FROM countries  ");
261 262
        source.append("   WHERE countries.LASTCENSUS > 0  ");
262 263
        source.append("   LIMIT 1; ");
263 264
        source.append(")");
......
269 270
        String id = "????????????????????????????????";
270 271
        String s = code.toString();
271 272
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
272
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
273
        assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
273 274
    }
274 275

  
275 276
    public void testExistsSelectLimit2() {
......
278 279
        // Filtramos continentes por un campo del pais.
279 280
        StringBuilder source = new StringBuilder();
280 281
        source.append("EXISTS(");
281
        source.append(" SELECT 1 FROM countries");
282
        source.append(" SELECT \"ISO_A2\" FROM countries");
282 283
        source.append("   WHERE ");
283 284
        source.append("     continents.NAME = countries.CONTINENT AND ");
284 285
        source.append("     countries.LASTCENSUS < 0 ");
......
292 293
        String id = "????????????????????????????????";
293 294
        String s = code.toString();
294 295
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
295
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", ((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
296
        assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", ((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
296 297
    }
297 298

  
298 299
    public void testExistsSelectLimit3() {
......
301 302
        // Filtramos continentes por un campo del pais.
302 303
        StringBuilder source = new StringBuilder();
303 304
        source.append("EXISTS(");
304
        source.append(" SELECT 1 FROM countries");
305
        source.append(" SELECT \"ISO_A2\" FROM countries");
305 306
        source.append("   WHERE ");
306 307
        source.append("     continents.NAME = countries.CONTINENT AND ");
307 308
        source.append("     countries.LASTCENSUS < 0 ");
......
314 315

  
315 316
        Code code = compiler.compileExpression(source.toString());
316 317
        link(code);
317
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", ((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), TUPLE(), TUPLE(), 1), 'patata')", code.toString());
318
        assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", ((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), TUPLE(), TUPLE(), 1), 'patata')", code.toString());
318 319
    }
319 320

  
320 321
    public void testExistsSelectLimit4() {
321 322
        StringBuilder source = new StringBuilder();
322 323
        source.append("EXISTS(");
323 324
        source.append(" SELECT(");
324
        source.append("   TUPLE(1), ");
325
        source.append("   TUPLE(\"ISO_A2\"), ");
325 326
        source.append("   countries, ");
326 327
        source.append("   (countries.LASTCENSUS > 0), ");
327 328
        source.append("   TUPLE(), ");
......
339 340
        String id = "????????????????????????????????";
340 341
        String s = code.toString();
341 342
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
342
        assertEquals("EXISTS(SELECT(TUPLE(1), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
343
        assertEquals("EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
343 344
    }
344 345

  
345 346
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/test/java/org/gvsig/expressionevaluator/TestExpressionBuilder.java
1
package org.gvsig.expressionevaluator;
2

  
3
import junit.framework.TestCase;
4
import org.gvsig.expressionevaluator.impl.expressionbuilder.formatters.DALFormatter;
5
import org.gvsig.fmap.dal.DALLocator;
6
import org.gvsig.fmap.dal.DataManager;
7
import org.gvsig.fmap.dal.expressionevaluator.DALExpressionBuilder;
8
import org.gvsig.fmap.dal.expressionevaluator.DALExpressionBuilder.SelectBuilder;
9
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
10

  
11
/**
12
 *
13
 * @author jjdelcerro
14
 */
15
public class TestExpressionBuilder extends TestCase {
16

  
17
    public TestExpressionBuilder(String testName) {
18
        super(testName);
19
    }
20

  
21
    @Override
22
    protected void setUp() throws Exception {
23
        super.setUp();
24
        new DefaultLibrariesInitializer().fullInitialize();
25
    }
26

  
27
    @Override
28
    protected void tearDown() throws Exception {
29
        super.tearDown();
30
    }
31

  
32
    // TODO add test methods here. The name must begin with 'test'. For example:
33
    // public void testHello() {}
34
    
35
    protected LexicalAnalyzer createLexicalAnalyzer() {
36
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
37
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
38
        return lexer;
39
    }
40

  
41
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
42
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
43
        Compiler compiler = manager.createCompiler();
44
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
45
        return compiler;
46
    }
47

  
48
    protected SymbolTable createSymbolTable() {
49
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
50
        MutableSymbolTable symbolTable = manager.createSymbolTable();
51
        return symbolTable;
52
    }
53

  
54
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
55
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
56
        Interpreter interpreter = manager.createInterpreter();
57
        interpreter.setSymbolTable(symbolTable);
58
        return interpreter;
59
    }
60
    
61
    private void link(Code code) {
62
      code.link(createSymbolTable());
63
    }
64

  
65
    public void testUseCase1() {
66
      DataManager dataManager = DALLocator.getDataManager();
67
      DALExpressionBuilder builder = dataManager.createDALExpressionBuilder();
68

  
69
      SelectBuilder select = builder.select()
70
              .column("LID_ACCIDENTE")
71
              .from("ARENA2_VEHICULOS")
72
              .where(
73
                      builder.expression().and(
74
                              builder.expression().eq(
75
                                      builder.expression().getattr("ARENA2_VEHICULOS","ID_ACCIDENTE"),
76
                                      builder.expression().getattr("ARENA2_ACCIDENTES","LID_ACCIDENTE")
77
                              ),
78
                              builder.expression().eq(
79
                                      builder.expression().column("MODELO"),
80
                                      builder.expression().constant("307")
81
                              )
82
                      )
83
              )
84
              .limit(1);
85
        ExpressionBuilder.Value exists = builder.exists(select.toValue(), "EXISTS123");
86

  
87
        String filter = exists.toString(new DALFormatter());
88
        
89
        assertEquals("EXISTS((SELECT \"LID_ACCIDENTE\" FROM \"ARENA2_VEHICULOS\" WHERE (( (\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\") = (\"ARENA2_ACCIDENTES\".\"LID_ACCIDENTE\") ) AND ( (\"MODELO\") = ('307') )) LIMIT 1), 'EXISTS123')", filter);
90
        
91
        // Comprobamos que con el formatter por defecto obtenemos lo mismo.
92
        assertEquals(filter, exists.toString());
93

  
94
        Compiler compiler = createCompiler();
95

  
96
        Code code = compiler.compileExpression(filter);
97
        link(code);
98
        assertEquals("EXISTS(SELECT(TUPLE(\"LID_ACCIDENTE\"), \"ARENA2_VEHICULOS\", ((\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\" = \"ARENA2_ACCIDENTES\".\"LID_ACCIDENTE\") AND (\"MODELO\" = '307')), TUPLE(), TUPLE(), 1), 'EXISTS123')", code.toString());
99
    }
100
    
101
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.h2/src/main/java/org/gvsig/fmap/dal/store/h2/expressionbuilderformatter/H2SpatialFormatter.java
3 3
import org.gvsig.expressionevaluator.ExpressionBuilder;
4 4
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
5 5
import org.gvsig.expressionevaluator.Formatter;
6
import org.gvsig.expressionevaluator.spi.formatter.value.BaseFormatter;
6
import org.gvsig.fmap.dal.DALLocator;
7 7
import org.gvsig.fmap.dal.SQLBuilder;
8
import org.gvsig.fmap.dal.store.jdbc2.spi.expressionbuilderformatter.JDBCFormatter;
9
import org.gvsig.fmap.dal.store.jdbc2.spi.expressionbuilderformatter.Select;
10 8

  
11 9
/**
12 10
 *
......
33 31
            new Constant(this.builder, this),
34 32
            new ST_AsBinary(this.builder, this),
35 33
            new Exists(this.builder, this),
36
            new BaseFormatter(this),
37
            new JDBCFormatter(this),
34
            DALLocator.getDataManager().createDALExpressionBuilder().formatter(this),
38 35
        };
39 36
    }
40 37

  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.h2/src/test/resources/org/gvsig/fmap/dal/store/h2/resultSetForSetProvider.sql
24 24
    "String", "Bool3", "Double", "Bool4", "Float", "Bool5", "Decimal", 
25 25
    NVL2("Geometry",ST_AsBinary("Geometry"),NULL), 
26 26
    NVL2(COALESCE((
27
      SELECT 1 
27
      SELECT "ISO_A2" 
28 28
      FROM "countries" 
29 29
      WHERE (("TEST"."STRING" = "countries"."CONTINENT") AND 
30 30
        ("countries"."LASTCENSUS" < 0)) LIMIT 1)),TRUE,FALSE) 
31 31
    AS "EXISTS62a964cd7bc24f409b97c03b9170408d" 
32 32
  FROM "PUBLIC"."test" 
33 33
  WHERE NVL2(COALESCE((
34
    SELECT 1 
34
    SELECT "ISO_A2" 
35 35
    FROM "countries" 
36 36
    WHERE (("TEST"."STRING" = "countries"."CONTINENT") AND 
37 37
      ("countries"."LASTCENSUS" < 0)) LIMIT 1)),TRUE,FALSE);
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.h2/src/test/java/org/gvsig/fmap/dal/store/h2/operations/sql/TestResultSetForSetProvider.java
122 122
    );
123 123
    StringBuilder filter = new StringBuilder();
124 124
    filter.append("EXISTS(");
125
    filter.append(" SELECT 1 FROM countries");
125
    filter.append(" SELECT \"ISO_A2\" FROM countries");
126 126
    filter.append("   WHERE ");
127 127
    filter.append("     TEST.STRING = countries.CONTINENT AND ");
128 128
    filter.append("     countries.LASTCENSUS < 0 ");
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/expressionbuilder/formatters/Exists.java
1
package org.gvsig.expressionevaluator.impl.expressionbuilder.formatters;
2

  
3
import org.apache.commons.lang3.StringUtils;
4
import org.gvsig.expressionevaluator.ExpressionBuilder;
5
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
6
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
7
import org.gvsig.expressionevaluator.Formatter;
8
import static org.gvsig.fmap.dal.DataManager.FUNCTION_EXISTS;
9

  
10
/**
11
 *
12
 * @author jjdelcerro
13
 */
14
public class Exists implements Formatter<Value> {
15
    
16
    private final Formatter<Value> formatter;
17
    
18
    public Exists(Formatter<Value> formatter) {
19
        this.formatter = formatter;
20
    }
21
    @Override
22
    public boolean canApply(ExpressionBuilder.Value value) {
23
        if (value instanceof ExpressionBuilder.Function) {
24
            return StringUtils.equalsIgnoreCase(FUNCTION_EXISTS, ((Function) value).name());
25
        }
26
        return false;
27
    }
28

  
29
    @Override
30
    public String format(Value function0) {
31
        Function function = (Function) function0;
32
        Value exp = function.parameters().get(0);
33
        return "EXISTS("+exp.toString(formatter)+")";
34
    }
35
    
36
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/src/main/java/org/gvsig/fmap/dal/swing/impl/searchpanel/SearchConditionFieldController.java
696 696
        case DynField.RELATION_TYPE_COMPOSITION:
697 697
          filter = builder.exists(builder.select()
698 698
                  .column(parentDescriptor.getFeatureType().getPrimaryKey()[0].getName())
699
                  .table(field.getFeatureStore().getName())
699
                  .from(field.getFeatureStore().getName())
700 700
                  .limit(1)
701 701
                  .where(
702 702
                          builder.expression().and(

Also available in: Unified diff