Revision 44748

View differences:

trunk/org.gvsig.desktop/pom.xml
2566 2566

  
2567 2567
        <jython.artifactId>jython-standalone</jython.artifactId>
2568 2568
        <!-- External project versions -->
2569
        <gvsig.tools.version>3.0.219</gvsig.tools.version>
2570
        <gvsig.proj.version>1.0.7</gvsig.proj.version>
2571
        <gvsig.projection.api.version>2.0.29</gvsig.projection.api.version>
2569
        <gvsig.tools.version>3.0.221</gvsig.tools.version>
2570
        <gvsig.proj.version>1.0.8</gvsig.proj.version>
2571
        <gvsig.projection.api.version>2.0.30</gvsig.projection.api.version>
2572 2572

  
2573 2573
    </properties>
2574 2574

  
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/test/java/org/gvsig/expresionevaluator/impl/TestExpressionBuilderFormatter.java
6 6
import junit.framework.TestCase;
7 7
import org.apache.commons.lang3.ArrayUtils;
8 8
import org.apache.commons.lang3.StringUtils;
9
import org.apache.commons.lang3.tuple.Pair;
9 10
import org.cresques.cts.IProjection;
10 11
import org.gvsig.expressionevaluator.Formatter;
11 12
import org.gvsig.expressionevaluator.ExpressionBuilder;
......
97 98

  
98 99
            @Override
99 100
            public String format(Value function) {
100
                List<Value> parameters = ((Function)function).parameters();
101
                String p1 = parameters.get(0).toString(formatter());
102
                String p2 = parameters.get(1).toString(formatter());
101
                List<Pair<String,Value>> parameters = ((Function)function).parameters();
102
                String p1 = parameters.get(0).getValue().toString(formatter());
103
                String p2 = parameters.get(1).getValue().toString(formatter());
103 104
                String r = MessageFormat.format(
104 105
                        "( (({0}) && ({1})) AND ST_Intersects(({0}),({1}) ))", 
105 106
                        p1,
......
121 122

  
122 123
            @Override
123 124
            public String format(Value function) {
124
                List<Value> parameters = ((Function)function).parameters();
125
                String p1 = parameters.get(0).toString(formatter());
126
                String p2 = parameters.get(1).toString(formatter());
125
                List<Pair<String,Value>> parameters = ((Function)function).parameters();
126
                String p1 = parameters.get(0).getValue().toString(formatter());
127
                String p2 = parameters.get(1).getValue().toString(formatter());
127 128
                String r = MessageFormat.format(
128 129
                        "GeomFromWKB({0}, {1})", 
129 130
                        p1,
......
145 146

  
146 147
            @Override
147 148
            public String format(Value function) {
148
                List<Value> parameters = ((Function)function).parameters();
149
                String p1 = parameters.get(0).toString(formatter());
150
                String p2 = parameters.get(1).toString(formatter());
151
                String p3 = parameters.get(2).toString(formatter());
149
                List<Pair<String,Value>> parameters = ((Function)function).parameters();
150
                String p1 = parameters.get(0).getValue().toString(formatter());
151
                String p2 = parameters.get(1).getValue().toString(formatter());
152
                String p3 = parameters.get(2).getValue().toString(formatter());
152 153
                String r = MessageFormat.format(
153 154
                        "NVL2({0}, {1}, {2})", 
154 155
                        p1,
......
171 172

  
172 173
            @Override
173 174
            public String format(Value function) {
174
                List<Value> parameters = ((Function)function).parameters();
175
                String p1 = parameters.get(0).toString(formatter());
175
                List<Pair<String,Value>> parameters = ((Function)function).parameters();
176
                String p1 = parameters.get(0).getValue().toString(formatter());
176 177
                String r = MessageFormat.format(
177 178
                        "AsWKB(({0}))", 
178 179
                        p1
......
193 194

  
194 195
            @Override
195 196
            public String format(Value function) {
196
                List<Value> parameters = ((Function)function).parameters();
197
                String p1 = parameters.get(0).toString(MyFormatter.this);
197
                List<Pair<String,Value>> parameters = ((Function)function).parameters();
198
                String p1 = parameters.get(0).getValue().toString(formatter());
198 199
                String r = MessageFormat.format(
199 200
                        "( ({0}) IS NOT NULL )", 
200 201
                        p1
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/function/programming/GetattrFunction.java
2 2

  
3 3
import java.lang.reflect.Field;
4 4
import org.apache.commons.lang3.Range;
5
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_GETATTR;
5 6
import org.gvsig.expressionevaluator.Function;
6 7
import org.gvsig.expressionevaluator.Interpreter;
7 8
import org.gvsig.expressionevaluator.spi.AbstractFunction;
......
9 10

  
10 11
public class GetattrFunction extends AbstractFunction {
11 12

  
12
    public static final String NAME = "GETATTR";
13

  
14 13
    public GetattrFunction() {
15
        super(Function.GROUP_PROGRAMMING, NAME, Range.is(2));
14
        super(Function.GROUP_PROGRAMMING, FUNCTION_GETATTR, Range.is(2));
16 15
    }
17 16
    
18 17
    @Override
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
8 8
import java.util.Objects;
9 9
import java.util.Set;
10 10
import org.apache.commons.lang3.StringUtils;
11
import org.apache.commons.lang3.tuple.ImmutablePair;
12
import org.apache.commons.lang3.tuple.Pair;
11 13
import org.gvsig.expressionevaluator.Code;
12 14
import org.gvsig.expressionevaluator.Expression;
13 15

  
......
379 381

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

  
384 386
        public FunctionBase(String name, String format) {
385 387
            this.name = name;
......
389 391
        public FunctionBase(String name) {
390 392
            this(name,null);
391 393
        }
392
        
394

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

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

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

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

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

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

  
447
        @Override
408 448
        public String name() {
409 449
            return this.name;
410 450
        }
......
413 453
        public void accept(Visitor visitor, VisitorFilter filter) {
414 454
            super.accept(visitor, filter);
415 455
            if( this.parameters!=null ) {
416
                for (Value value : this.parameters) {
417
                    if( value!=null ) {
418
                        value.accept(visitor, filter);
456
                for (Pair<String,Value> argument : this.parameters) {
457
                    if( argument!=null ) {
458
                        argument.getValue().accept(visitor, filter);
419 459
                    }
420 460
                }
421 461
            }
......
424 464
        @Override
425 465
        public void replace(Value target, Value replacement) {
426 466
            for (int i = 0; i < parameters.size(); i++) {
427
                Value value = parameters.get(i);
428
                if( value == target ) {
429
                    parameters.set(i, replacement);
467
                Pair<String, Value> argument = parameters.get(i);
468
                if( argument.getValue() == target ) {
469
                    parameters.set(i, new ImmutablePair<>(argument.getKey(),replacement));
430 470
                } else {
431
                    value.replace(target, replacement);
471
                    argument.getValue().replace(target, replacement);
432 472
                }
433 473
            }
434 474
        }
......
449 489
                builder.append("(");
450 490
                if (this.parameters != null && !this.parameters.isEmpty()) {
451 491
                    boolean first = true;
452
                    for (Value value : this.parameters) {
492
                    for (Pair<String,Value> argument : this.parameters) {
453 493
                        if( first ) {
454 494
                            first=false;
455
                            builder.append(value.toString(formatter));
495
                            if( argument.getKey()!=null ) {
496
                              builder.append(argument.getKey());
497
                              builder.append(":");  
498
                            }
499
                            builder.append(argument.getValue().toString(formatter));
456 500
                        } else {
457 501
                            builder.append(", ");
458
                            builder.append(value.toString(formatter));
502
                            if( argument.getKey()!=null ) {
503
                              builder.append(argument.getKey());
504
                              builder.append(":");  
505
                            }
506
                            builder.append(argument.getValue().toString(formatter));
459 507
                        }
460 508
                    }
461 509
                }
......
464 512
            }
465 513
            if (this.parameters != null && !this.parameters.isEmpty()) {
466 514
                List<String> values = new ArrayList<>();
467
                for (Value value : this.parameters) {
468
                    values.add(value.toString(formatter));
515
                for (Pair<String,Value> argument : this.parameters) {
516
                    values.add(argument.getValue().toString(formatter));
469 517
                }
470 518
                return MessageFormat.format(format, values.toArray());
471 519
            } else {
......
515 563
            builder.append("(");
516 564
            if (this.parameters != null && !this.parameters.isEmpty()) {
517 565
                boolean first = true;
518
                for (Value value : this.parameters) {
566
                for (Pair<String,Value> argument : this.parameters) {
519 567
                    if( first ) {
520 568
                        first=false;
521
                        builder.append(value.toString(formatter));
569
                        builder.append(argument.getValue().toString(formatter));
522 570
                    } else {
523 571
                        builder.append(", ");
524
                        builder.append(value.toString(formatter));
572
                        builder.append(argument.getValue().toString(formatter));
525 573
                    }
526 574
                }
527 575
            }
......
818 866
    @Override
819 867
    public List<Variable> variables() {
820 868
        final Set<Variable> vars = new HashSet<>();
821
        this.accept(new Visitor() {
822
            @Override
823
            public void visit(Visitable value) {
824
                if( !vars.contains((Variable)value) ) {
825
                    vars.add((Variable)value);
826
                }
827
            }
869
        this.accept((Visitable value1) -> {
870
          if (!vars.contains((Variable) value1)) {
871
            vars.add((Variable) value1);
872
          }
828 873
        }, new ClassVisitorFilter(Variable.class));
829 874
        List<Variable> lvars = new ArrayList<>(vars);
830 875
        Collections.sort(lvars);
......
834 879
    @Override
835 880
    public List<Parameter> parameters() {
836 881
        final List<Parameter>  params = new ArrayList<>();
837
        this.accept(new Visitor() {
838
            @Override
839
            public void visit(Visitable value) {
840
                params.add((Parameter) value);
841
            }
882
        this.accept((Visitable value1) -> {
883
          params.add((Parameter) value1);
842 884
        }, new ClassVisitorFilter(Parameter.class));
843 885
        return params;
844 886
    }
......
1323 1365
    public String repr(Object value) {
1324 1366
        return this.manager.getReprMethod(value).repr(value);
1325 1367
    }
1326
    
1368

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

  
1327 1377
}
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/DefaultCodeBuilder.java
49 49
import org.gvsig.expressionevaluator.Function;
50 50
import org.gvsig.expressionevaluator.Interpreter;
51 51
import org.gvsig.expressionevaluator.SymbolTable;
52
import org.gvsig.expressionevaluator.impl.function.programming.GetattrFunction;
53 52
import org.gvsig.expressionevaluator.impl.function.programming.GetitemFunction;
54 53
import org.gvsig.tools.dynobject.DynObject;
55 54
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
......
272 271
            return this.codes.size();
273 272
        }
274 273

  
275
        public void add(String name, Code arg) {
276
            this.codes.add(new ImmutablePair<>(name, arg));
274
        public void add(String name, Code parameter) {
275
          if( !StringUtils.isBlank(name) ) {
276
            for (int i = 0; i < codes.size(); i++) {
277
              Pair<String, Code> arg = codes.get(i);
278
              if( StringUtils.equalsIgnoreCase(name, arg.getKey()) ) {
279
                codes.set(i, new ImmutablePair<>(name, parameter));
280
                return;
281
              }              
282
            }
283
          }
284
          this.codes.add(new ImmutablePair<>(name, parameter));
277 285
        }
278 286

  
279 287
        public void add(Code arg) {
......
285 293
        }
286 294

  
287 295
        @Override
296
        public boolean contains(String name) {
297
          for (Pair<String, Code> arg : this.codes) {
298
            if( StringUtils.equalsIgnoreCase(arg.getKey(), name) ) {
299
              return true;
300
            }
301
          }
302
          return false;
303
        }
304
        
305
        @Override
288 306
        public boolean contains(String name, int index) {
289 307
          String argNameX = name + String.valueOf(index).trim();
290 308
          for (Pair<String, Code> arg : this.codes) {
......
327 345
          return null;
328 346
        }
329 347

  
348
        @Override
330 349
        public String getName(int n) {
331 350
            return this.codes.get(n).getKey();
332 351
        }
......
548 567
                    break;
549 568
                case FUNCTION:
550 569
                default:
551
                    if( StringUtils.equalsIgnoreCase(this.name(),GetattrFunction.NAME) ) {
570
                    if( StringUtils.equalsIgnoreCase(this.name(),ExpressionBuilder.FUNCTION_GETATTR) ) {
552 571
                      Code arg0 = this.parameters().get(0);
553 572
                      Code arg1 = this.parameters().get(1);
554 573
                      if( arg0 instanceof Code.Identifier && arg1 instanceof Code.Constant ) {
......
845 864
        BaseCodes args = args();
846 865
        args.add(obj);
847 866
        args.add(constant(attrname));
848
        return function(GetattrFunction.NAME, args);
867
        return function(ExpressionBuilder.FUNCTION_GETATTR, args);
849 868
    }    
850 869

  
851 870
    @Override
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
2 2

  
3 3
import java.util.List;
4 4
import java.util.Map;
5
import org.apache.commons.lang3.tuple.Pair;
5 6
import org.gvsig.tools.util.PropertiesSupport;
6 7
import org.gvsig.tools.util.PropertiesSupportHelper;
7 8

  
......
102 103
    public static final String FUNCTION_LIST = "LIST";
103 104
    public static final String FUNCTION_TUPLE = "TUPLE";
104 105
    
106
    public static final String FUNCTION_GETATTR = "GETATTR";
107
    
105 108
    public static final int PARAMETER_TYPE_CONSTANT = 0;
106 109
    public static final int PARAMETER_TYPE_VARIABLE = 1;
107 110
    
......
154 157
    
155 158
    public interface Function extends Value {
156 159
        public String name();
157
        public List<Value> parameters();
160
        public List<Pair<String,Value>> parameters();
158 161
        public Function parameter(Value parameter);
162
        public Function parameter(String name, Value parameter);
163
        public Value getParameter(String name);
164
        public Value getParameter(String name, int index);
165
        public boolean containsParameter(String name, int index);
159 166
    }
160 167

  
161 168
    public interface Method extends Value {
162 169
        public String name();
163 170
        public Value instance();
164
        public List<Value> parameters();
171
        public List<Pair<String,Value>> parameters();
165 172
        public Function parameter(Value parameter);
173
        public Function parameter(String name, Value parameter);
166 174
    }
167 175

  
168 176
    public interface BinaryOperator extends Value {
......
462 470
    
463 471
    public Function tuple(Constant... values);
464 472
    
473
    public Function getattr(Value object, String attrname);
474
    
465 475
    public boolean isEmpty();
466 476
}
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/Codes.java
14 14
  
15 15
  public boolean useArgNames(boolean useNames);
16 16
  
17
  public boolean contains(String name);
18
  
17 19
  public boolean contains(String name, int index);
18 20
  
19 21
  public String getName(int index);
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
187 187
        String id = "????????????????????????????????";
188 188
        String s = code.toString();
189 189
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
190
        assertEquals("EXISTS(NULL, '????????????????????????????????')", s);
190
        assertEquals("EXISTS(NULL, 'EXISTS????????????????????????????????')", s);
191 191
    }
192 192

  
193 193
    public void testExistsSelect1() {
......
204 204
        String id = "????????????????????????????????";
205 205
        String s = code.toString();
206 206
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
207
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:(\"countries\".\"LASTCENSUS\" > 0)), '????????????????????????????????')", s);
207
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:(\"countries\".\"LASTCENSUS\" > 0)), 'EXISTS????????????????????????????????')", s);
208 208
    }
209 209

  
210 210
    public void testExistsSelectLimit1() {
......
222 222
        String id = "????????????????????????????????";
223 223
        String s = code.toString();
224 224
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
225
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:(\"countries\".\"LASTCENSUS\" > 0), LIMIT:1), '????????????????????????????????')", s);
225
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:(\"countries\".\"LASTCENSUS\" > 0), LIMIT:1), 'EXISTS????????????????????????????????')", s);
226 226
    }
227 227

  
228 228
    public void testExistsSelectLimit2() {
......
245 245
        String id = "????????????????????????????????";
246 246
        String s = code.toString();
247 247
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
248
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), LIMIT:1), '????????????????????????????????')", s);
248
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), LIMIT:1), 'EXISTS????????????????????????????????')", s);
249 249
    }
250 250

  
251
    public void testExistsSelectLimit3() {
252
        // Sobre la tabla de continentes, para obtener la lista de continentes 
253
        // que tienen paises sin censo.
254
        // Filtramos continentes por un campo del pais.
255
        StringBuilder source = new StringBuilder();
256
        source.append("EXISTS(");
257
        source.append(" SELECT 1 FROM countries");
258
        source.append("   WHERE ");
259
        source.append("     continents.NAME = countries.CONTINENT AND ");
260
        source.append("     countries.LASTCENSUS < 0 ");
261
        source.append("   LIMIT 1; ");
262
        source.append(" ,");
263
        source.append(" 'patata'");
264
        source.append(")");
265

  
266
        Compiler compiler = createCompiler();
267

  
268
        Code code = compiler.compileExpression(source.toString());
269
        link(code);
270
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), LIMIT:1), 'patata')", code.toString());
271
    }
272

  
273
    public void testExistsSelectLimit4() {
274
        StringBuilder source = new StringBuilder();
275
        source.append("EXISTS(");
276
        source.append(" SELECT(");
277
        source.append("   TABLE:'countries', ");
278
        source.append("   WHERE:(countries.LASTCENSUS > 0), ");
279
        source.append("   LIMIT:1 ");
280
        source.append("  ) ");
281
        source.append(" , ");
282
        source.append(" 'EXISTS1234567890ABCDEFGHHIJKLMNOPQRSTU' ");
283
        source.append(") ");
284

  
285
        Compiler compiler = createCompiler();
286

  
287
        Code code = compiler.compileExpression(source.toString());
288
        link(code);
289
        String id = "????????????????????????????????";
290
        String s = code.toString();
291
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
292
        assertEquals("EXISTS(SELECT(TABLE:'countries', WHERE:(\"countries\".\"LASTCENSUS\" > 0), LIMIT:1), 'EXISTS????????????????????????????????')", s);
293
    }
294

  
251 295
}
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/symboltable/FeatureSymbolTableImpl.java
34 34
import org.gvsig.expressionevaluator.spi.AbstractFunction;
35 35
import org.gvsig.expressionevaluator.spi.AbstractSymbolTable;
36 36
import org.gvsig.fmap.dal.DataManager;
37
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CURRENT_ROW;
37 38
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
38 39
import org.gvsig.fmap.dal.feature.Feature;
39 40
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
......
61 62
    super(DataManager.DAL_SYMBOL_TABLE_FEATURE);
62 63
    this.current_row = new AbstractFunction(
63 64
            DALFunctions.GROUP_DATA_ACCESS,
64
            DALFunctions.FUNCTION_CURRENT_ROW,
65
            FUNCTION_CURRENT_ROW,
65 66
            Range.is(0),
66 67
            "Return the current row when used in a table filter.\n"
67 68
            + "Return null if used outer a table filter.",
68
            DALFunctions.FUNCTION_CURRENT_ROW + "()",
69
            FUNCTION_CURRENT_ROW + "()",
69 70
            null,
70 71
            "Feature"
71 72
    ) {
......
103 104

  
104 105
  @Override
105 106
  public Function function(String name) {
106
    if (StringUtils.equalsIgnoreCase(name, DALFunctions.FUNCTION_CURRENT_ROW)) {
107
    if (StringUtils.equalsIgnoreCase(name, FUNCTION_CURRENT_ROW)) {
107 108
      return this.current_row;
108 109
    }
109 110
    return super.function(name);
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/function/dataaccess/ForeingValueFunction.java
27 27
import java.util.List;
28 28
import org.apache.commons.lang3.Range;
29 29
import org.apache.commons.lang3.StringUtils;
30
import org.gvsig.expressionevaluator.ExpressionBuilder;
31 30
import org.gvsig.expressionevaluator.ExpressionRuntimeException;
32
import org.gvsig.expressionevaluator.ExpressionUtils;
33 31
import org.gvsig.expressionevaluator.Interpreter;
34 32
import org.gvsig.expressionevaluator.impl.DALFunctions;
35 33
import org.gvsig.expressionevaluator.spi.AbstractFunction;
36 34
import org.gvsig.fmap.dal.DataManager;
35
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CURRENT_ROW;
36
import static org.gvsig.fmap.dal.DataManager.FUNCTION_FOREING_VALUE;
37 37
import org.gvsig.fmap.dal.feature.Feature;
38 38
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
39 39
import org.gvsig.fmap.dal.feature.ForeingKey;
40 40
import org.gvsig.tools.util.UnmodifiableBasicList;
41 41
import org.gvsig.tools.util.UnmodifiableBasicListAdapter;
42
import org.gvsig.tools.util.UnmodifiableBasicListArrayAdapter;
42 43

  
43 44
public class ForeingValueFunction extends AbstractFunction {
44 45

  
45 46
  public ForeingValueFunction() {
46 47
    super(
47 48
            DALFunctions.GROUP_DATA_ACCESS, 
48
            DALFunctions.FUNCTION_FOREING_VALUE, 
49
            FUNCTION_FOREING_VALUE, 
49 50
            Range.is(1), 
50 51
            "Return the value of a field throw a relation from other tables.", 
51 52
            "FOREING VALUE FROM {{field1_name.field2_name}}", 
......
58 59

  
59 60
  private Feature current_row(Interpreter interpreter) {
60 61
    try {
61
      Feature f = (Feature) interpreter.call(DALFunctions.FUNCTION_CURRENT_ROW);
62
      Feature f = (Feature) interpreter.call(FUNCTION_CURRENT_ROW);
62 63
      return f;
63 64
    } catch (Exception ex) {
64 65
      return null;
......
67 68
  
68 69
  @Override
69 70
  public Object call(Interpreter interpreter, Object[] args) throws Exception {
70
    ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
71 71
    UnmodifiableBasicList<String> fieldNames;
72 72
    Object fields_o = getObject(args, 0);
73
    if (fields_o instanceof List) {
73
    if (fields_o instanceof String[]) {
74
      fieldNames = new UnmodifiableBasicListArrayAdapter<>((String[]) fields_o);
75
    } else if (fields_o instanceof List) {
74 76
      fieldNames = new UnmodifiableBasicListAdapter<>((List<String>) fields_o);
75 77
    } else if (fields_o instanceof String) {
76 78
      fieldNames = new UnmodifiableBasicListAdapter<>(Arrays.asList(((String) fields_o).split("[.]")));
......
110 112
    }
111 113
  }
112 114
  
115

  
116
  
113 117
}
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/function/dataaccess/SelectCountFunction.java
32 32
import org.gvsig.expressionevaluator.spi.AbstractFunction;
33 33
import org.gvsig.fmap.dal.DALLocator;
34 34
import org.gvsig.fmap.dal.DataManager;
35
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT;
36
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_COUNT;
35 37
import org.gvsig.fmap.dal.DataStore;
36 38
import org.gvsig.fmap.dal.feature.FeatureQuery;
37 39
import org.gvsig.fmap.dal.feature.FeatureSet;
......
47 49

  
48 50
  public SelectCountFunction() {
49 51
    super(DALFunctions.GROUP_DATA_ACCESS,
50
            DALFunctions.FUNCTION_SELECT_COUNT,
52
            FUNCTION_SELECT_COUNT,
51 53
            Range.between(1,2),
52 54
            "Returns the number of features of the table by applying the filter indicated.\n" +
53 55
                    "The syntax is:\n\n"+
......
60 62
              "filter - boolean expression with the filter to apply",
61 63
            },
62 64
            "Long",
63
            true
65
            false
64 66
    );
65 67
  }
66 68

  
......
100 102
    try {
101 103
      DataStore store = this.getStore(storeName);
102 104
      if (store == null ) {
103
        throw new ExpressionRuntimeException("Cant locate the store '" + storeName + "' in function '" + DALFunctions.FUNCTION_SELECT + "'.");
105
        throw new ExpressionRuntimeException("Cant locate the store '" + storeName + "' in function '" + FUNCTION_SELECT_COUNT + "'.");
104 106
      }
105 107
      if (!(store instanceof FeatureStore)) {
106
        throw new ExpressionRuntimeException("The store'" + storeName + "' is not valid for function '" + DALFunctions.FUNCTION_SELECT + "', a FeatureStore is required.");
108
        throw new ExpressionRuntimeException("The store'" + storeName + "' is not valid for function '" + FUNCTION_SELECT_COUNT + "', a FeatureStore is required.");
107 109
      }
108 110
      featureStore = (FeatureStore) store;
109 111
      if (where == null ) {
......
118 120
    } catch (ExpressionRuntimeException ex) {
119 121
      throw ex;
120 122
    } catch (Exception ex) {
121
      throw new ExpressionRuntimeException("Problems calling '" + DALFunctions.FUNCTION_SELECT + "' function", ex);
123
      throw new ExpressionRuntimeException("Problems calling '" + FUNCTION_SELECT_COUNT + "' function", ex);
122 124
    } finally {
123 125
      DisposeUtils.disposeQuietly(set);
124 126
      DisposeUtils.disposeQuietly(featureStore);
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/function/dataaccess/CurrentRowFunction.java
27 27
import org.gvsig.expressionevaluator.Interpreter;
28 28
import org.gvsig.expressionevaluator.impl.DALFunctions;
29 29
import org.gvsig.expressionevaluator.spi.AbstractFunction;
30
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CURRENT_ROW;
30 31

  
31 32
/**
32 33
 *
......
37 38
  public CurrentRowFunction() {
38 39
    super(
39 40
            DALFunctions.GROUP_DATA_ACCESS,
40
            DALFunctions.FUNCTION_CURRENT_ROW,
41
            FUNCTION_CURRENT_ROW,
41 42
            Range.is(0),
42 43
            "Return the current row when used in a table filter.\n"
43 44
            + "Return null if used outer a table filter.",
44
            DALFunctions.FUNCTION_CURRENT_ROW + "()",
45
            FUNCTION_CURRENT_ROW + "()",
45 46
            null,
46
            "Feature"
47
            "Feature",
48
            false
47 49
    );
48 50
  }
49 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/function/dataaccess/CurrentStoreFunction.java
27 27
import org.gvsig.expressionevaluator.Interpreter;
28 28
import org.gvsig.expressionevaluator.impl.DALFunctions;
29 29
import org.gvsig.expressionevaluator.spi.AbstractFunction;
30
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CURRENT_ROW;
31
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CURRENT_STORE;
30 32
import org.gvsig.fmap.dal.feature.Feature;
31 33

  
32 34
/**
......
38 40
  public CurrentStoreFunction() {
39 41
    super(
40 42
            DALFunctions.GROUP_DATA_ACCESS, 
41
            DALFunctions.FUNCTION_CURRENT_STORE, 
43
            FUNCTION_CURRENT_STORE, 
42 44
            Range.is(0), 
43 45
            "Return the current store when used in a table filter.\n" 
44 46
                    + "Return null if used outer a table filter.", 
45
            DALFunctions.FUNCTION_CURRENT_STORE+"()", 
47
            FUNCTION_CURRENT_STORE+"()", 
46 48
            null, 
47 49
            "FeatureStore",
48 50
            false
......
51 53

  
52 54
  private Feature current_row(Interpreter interpreter) {
53 55
    try {
54
      Feature f = (Feature) interpreter.call(DALFunctions.FUNCTION_CURRENT_ROW);
56
      Feature f = (Feature) interpreter.call(FUNCTION_CURRENT_ROW);
55 57
      return f;
56 58
    } catch (Exception ex) {
57 59
      return null;
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/function/dataaccess/ExistsFunction.java
30 30
import org.gvsig.expressionevaluator.Interpreter;
31 31
import org.gvsig.expressionevaluator.impl.DALFunctions;
32 32
import org.gvsig.expressionevaluator.spi.AbstractFunction;
33
import static org.gvsig.fmap.dal.DataManager.FUNCTION_EXISTS;
33 34
import org.gvsig.tools.util.UnmodifiableBasicCollection;
34 35
import org.gvsig.tools.util.UnmodifiableBasicCollection64;
35 36

  
......
51 52
    //   NVL2(COALESCE(lista-subselect),FALSE,TRUE)
52 53
    //
53 54
    super(DALFunctions.SYMBOLTABLE_NAME,
54
            DALFunctions.FUNCTION_EXISTS,
55
            FUNCTION_EXISTS,
55 56
            Range.between(1, 2),
56 57
            "Receive a list as an argument. Returns true if the list has some value and false if the list is empty.",
57
            DALFunctions.FUNCTION_EXISTS + "({{list}})",
58
            FUNCTION_EXISTS + "({{list}})",
58 59
            new String[]{
59 60
              "list - a list of values or null"
60 61
            },
61 62
            "Boolean",
62
            true
63
            false
63 64
    );
64 65
  }
65 66

  
......
100 101
      return false;
101 102
    }
102 103
    boolean isEmpty = true;
103
    if (list instanceof List) {
104
    if (list instanceof Object[]) {
105
      isEmpty = (((Object[]) list).length==0);
106
    } else if (list instanceof List) {
104 107
      isEmpty = ((List) list).isEmpty();
105 108
    } else if (list instanceof UnmodifiableBasicCollection) {
106 109
      isEmpty = ((UnmodifiableBasicCollection) list).isEmpty();
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/function/dataaccess/IsSelectedCurrentRowFunction.java
27 27
import org.gvsig.expressionevaluator.Interpreter;
28 28
import org.gvsig.expressionevaluator.impl.DALFunctions;
29 29
import org.gvsig.expressionevaluator.spi.AbstractFunction;
30
import static org.gvsig.fmap.dal.DataManager.FUNCTION_CURRENT_ROW;
31
import static org.gvsig.fmap.dal.DataManager.FUNCTION_ISSELECTED_CURRENT_ROW;
30 32
import org.gvsig.fmap.dal.feature.Feature;
31 33
import org.gvsig.fmap.dal.feature.FeatureSelection;
32 34
import org.gvsig.fmap.dal.feature.FeatureStore;
......
40 42
  public IsSelectedCurrentRowFunction() {
41 43
    super(
42 44
            DALFunctions.GROUP_DATA_ACCESS, 
43
            DALFunctions.FUNCTION_ISSELECTED_CURRENT_ROW, 
45
            FUNCTION_ISSELECTED_CURRENT_ROW, 
44 46
            Range.is(0), 
45 47
            "Return if the current feature is selected in the store when used in a filter.\n" 
46 48
                    + "Return false if used outer a filter.", 
47
            DALFunctions.FUNCTION_ISSELECTED_CURRENT_ROW+"()", 
49
            FUNCTION_ISSELECTED_CURRENT_ROW+"()", 
48 50
            null, 
49 51
            "Boolean",
50 52
            false
......
53 55

  
54 56
  private Feature current_row(Interpreter interpreter) {
55 57
    try {
56
      Feature f = (Feature) interpreter.call(DALFunctions.FUNCTION_CURRENT_ROW);
58
      Feature f = (Feature) interpreter.call(FUNCTION_CURRENT_ROW);
57 59
      return f;
58 60
    } catch (Exception ex) {
59 61
      return null;
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/function/dataaccess/SelectFunction.java
35 35
import org.gvsig.expressionevaluator.spi.AbstractFunction;
36 36
import org.gvsig.fmap.dal.DALLocator;
37 37
import org.gvsig.fmap.dal.DataManager;
38
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT;
38 39
import org.gvsig.fmap.dal.DataStore;
39 40
import org.gvsig.fmap.dal.feature.Feature;
40 41
import org.gvsig.fmap.dal.feature.FeatureQuery;
......
49 50

  
50 51
  public SelectFunction() {
51 52
    super(DALFunctions.GROUP_DATA_ACCESS,
52
            DALFunctions.FUNCTION_SELECT,
53
            FUNCTION_SELECT,
53 54
            Range.between(1,5),
54 55
            "Returns a list of features of the table by applying the filter, order and limit indicated.\n"+
55 56
                    "The syntax is:\n\n"+
......
64 65
              "limit - Maximum number of features to return"
65 66
            },
66 67
            "List",
67
            true
68
            false
68 69
    );
69 70
  }
70 71

  
......
87 88
  public boolean useArgumentsInsteadObjects() {
88 89
    return true;
89 90
  }
90

  
91
  
91 92
  @Override
92 93
  public Object call(Interpreter interpreter, Object[] args) throws Exception {
93 94
    throw new UnsupportedOperationException();
......
112 113
    try {
113 114
      DataStore store = this.getStore(storeName);
114 115
      if (store == null ) {
115
        throw new ExpressionRuntimeException("Cant locate the store '" + storeName + "' in function '" + DALFunctions.FUNCTION_SELECT + "'.");
116
        throw new ExpressionRuntimeException("Cant locate the store '" + storeName + "' in function '" + FUNCTION_SELECT + "'.");
116 117
      }
117 118
      if (!(store instanceof FeatureStore)) {
118
        throw new ExpressionRuntimeException("The store'" + storeName + "' is not valid for function '" + DALFunctions.FUNCTION_SELECT + "', a FeatureStore is required.");
119
        throw new ExpressionRuntimeException("The store'" + storeName + "' is not valid for function '" + FUNCTION_SELECT + "', a FeatureStore is required.");
119 120
      }
120 121
      FeatureStore featureStore = (FeatureStore) store;
121 122
      List<Feature> features;
......
141 142
    } catch (ExpressionRuntimeException ex) {
142 143
      throw ex;
143 144
    } catch (Exception ex) {
144
      throw new ExpressionRuntimeException("Problems calling '" + DALFunctions.FUNCTION_SELECT + "' function", ex);
145
      throw new ExpressionRuntimeException("Problems calling '" + FUNCTION_SELECT + "' function", ex);
145 146
    }
146 147
  }
147 148

  
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
34 34

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

  
37
  public static final String FUNCTION_CURRENT_ROW = "CURRENT_ROW";
38
  public static final String FUNCTION_CURRENT_STORE = "CURRENT_STORE";
39
  public static final String FUNCTION_ISSELECTED_CURRENT_ROW = "ISSELECTED_CURRENT_ROW";
40

  
41
  public static final String FUNCTION_SELECT = "SELECT";
42
  public static final String FUNCTION_SELECT_COUNT = "SELECT_COUNT";
43
  public static final String FUNCTION_EXISTS = "EXISTS";
44
  public static final String FUNCTION_FOREING_VALUE = "FOREING_VALUE";
45

  
46 37
}
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
38 38
import org.gvsig.expressionevaluator.impl.DefaultStatement.ArgsBuilderFromNames;
39 39
import org.gvsig.expressionevaluator.impl.function.dataaccess.ExistsFunction;
40 40
import org.gvsig.expressionevaluator.spi.AbstractGrammarFactory;
41
import static org.gvsig.fmap.dal.DataManager.FUNCTION_FOREING_VALUE;
42
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT;
43
import static org.gvsig.fmap.dal.DataManager.FUNCTION_SELECT_COUNT;
41 44

  
42 45
/**
43 46
 *
......
49 52

  
50 53
    private class ExistsStatementBuilder extends DefaultStatement.StatementBuilderBase {
51 54

  
52
        private final String ListID;
55
        private final String listID;
56
        private final String existsID;
53 57

  
54
        public ExistsStatementBuilder(String ListID) {
55
            super(ExistsFunction.NAME, new ArgsBuilderFromNames(ListID));
56
            this.ListID = ListID;
58
        public ExistsStatementBuilder(String listID, String existsID) {
59
            super(ExistsFunction.NAME, new ArgsBuilderFromNames(listID,existsID));
60
            this.listID = listID;
61
            this.existsID = existsID;
57 62
        }
58 63

  
59 64
        @Override
60 65
        public Code build(StatementContext context) {
61
            UUID x = UUID.randomUUID();
62
            String exists_id = x.toString().replaceAll("-", "");
63 66

  
64 67
            CodeBuilder codeBuilder = context.getCodeBuilder();
65 68
            Caller code = (Caller) super.build(context);
66 69
            BaseCodes args = (BaseCodes) code.parameters();
67
            args.add("EXISTS_ID", codeBuilder.constant(exists_id));
70
            if( args.size()<2 || args.get("ID")==null  ) {
71
              String exists_id = "EXISTS"+UUID.randomUUID().toString().replaceAll("-", "");
72
              args.add("ID", codeBuilder.constant(exists_id));
73
            }
68 74
            code = codeBuilder.function(ExistsFunction.NAME, args);
69 75
            return code;
70 76
        }
......
93 99
            
94 100
            stmt = theGrammar.createStatement("EXISTS");
95 101
            stmt.addRule(stmt.require_any_token("EXISTS"));
102
            stmt.addRule(stmt.require_any_token("("));
96 103
            stmt.addRule(stmt.require_expression("LIST"));
97
            stmt.builder(new ExistsStatementBuilder("LIST"));
104
            stmt.addRule(stmt.optional_any_token(",")
105
                    .addRuleOnTrue(stmt.require_expression("ID"))
106
            );
107
            stmt.addRule(stmt.require_any_token(")"));
108
            stmt.builder(new ExistsStatementBuilder("LIST","ID"));
98 109
            theGrammar.addStatement(stmt);
99 110

  
100 111
            stmt = theGrammar.createStatement("FOREING_VALUE");
......
103 114
            stmt.addRule(stmt.require_any_token("FROM"));
104 115
            stmt.addRule(stmt.require_identifiers("IDENTIFIERS","."));
105 116
            stmt.code(
106
                    DALFunctions.FUNCTION_FOREING_VALUE,
117
                    FUNCTION_FOREING_VALUE,
107 118
                    stmt.args_names("IDENTIFIERS")
108 119
            ); 
109 120
            theGrammar.addStatement(stmt);
......
144 155
            );
145 156
            stmt.addRule(stmt.require_any_token(";"));
146 157
            stmt.code(
147
                    DALFunctions.FUNCTION_SELECT,
158
                    FUNCTION_SELECT,
148 159
                    stmt.args_names("TABLE","WHERE","ORDER#","ORDER_MODE#","LIMIT")
149 160
            ); 
150 161
            theGrammar.addStatement(stmt);
......
162 173
            );
163 174
            stmt.addRule(stmt.require_any_token(";"));
164 175
            stmt.code(
165
                    DALFunctions.FUNCTION_SELECT_COUNT,
176
                    FUNCTION_SELECT_COUNT,
166 177
                    stmt.args_names("TABLE","WHERE")
167 178
            ); 
168 179
            theGrammar.addStatement(stmt);
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
4 4
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
5 5
import org.gvsig.expressionevaluator.Formatter;
6 6
import org.gvsig.fmap.dal.SQLBuilder;
7
import org.gvsig.fmap.dal.store.jdbc2.spi.expressionbuilderformatter.Select;
7 8

  
8 9
/**
9 10
 *
......
28 29
            new Decode(this.builder, this),
29 30
            new ILike(this.builder, this),
30 31
            new Constant(this.builder, this),
31
            new ST_AsBinary(this.builder, this)
32
            new ST_AsBinary(this.builder, this),
33
            new Exists(this.builder, this),
34
            new Select(this.builder, this),
32 35
        };
33 36
    }
34 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/main/java/org/gvsig/fmap/dal/store/h2/expressionbuilderformatter/ST_AsBinary.java
3 3
import java.text.MessageFormat;
4 4
import java.util.List;
5 5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.tuple.Pair;
6 7
import static org.gvsig.expressionevaluator.GeometryExpressionBuilder.FUNCTION_ST_ASBINARY;
7 8
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
8 9
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
......
33 34

  
34 35
    @Override
35 36
    public String format(Value function) {
36
        List<Value> parameters = ((Function) function).parameters();
37
        String p1 = parameters.get(0).toString(formatter);
37
        List<Pair<String,Value>> parameters = ((Function) function).parameters();
38
        String p1 = parameters.get(0).getValue().toString(formatter);
38 39
        String r = MessageFormat.format("NVL2({0},ST_AsBinary({0}),NULL)", p1);
39 40
        return r;
40 41
    }
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/Exists.java
1
package org.gvsig.fmap.dal.store.h2.expressionbuilderformatter;
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
import org.gvsig.fmap.dal.SQLBuilder;
10

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

  
32
    @Override
33
    public String format(Value function0) {
34
        Function function = (Function) function0;
35
        Value exp = function.parameters().get(0).getValue();
36
        return "NVL2(COALESCE("+exp.toString(formatter)+"),FALSE,TRUE)";
37
    }
38
    
39
}
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/ST_AsEWKB.java
3 3
import java.text.MessageFormat;
4 4
import java.util.List;
5 5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.tuple.Pair;
6 7
import static org.gvsig.expressionevaluator.GeometryExpressionBuilder.FUNCTION_ST_ASEWKB;
7 8
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
8 9
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
......
33 34

  
34 35
    @Override
35 36
    public String format(Value function) {
36
        List<Value> parameters = ((Function) function).parameters();
37
        String p1 = parameters.get(0).toString(formatter);
38
        String p2 = parameters.get(1).toString(formatter);
37
        List<Pair<String,Value>> parameters = ((Function) function).parameters();
38
        String p1 = parameters.get(0).getValue().toString(formatter);
39
        String p2 = parameters.get(1).getValue().toString(formatter);
39 40
        String r = MessageFormat.format("ST_AsWKB({0}, {1})", p1, p2);
40 41
        return r;
41 42
    }
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/Decode.java
3 3
import java.util.List;
4 4
import java.util.Objects;
5 5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.tuple.Pair;
6 7
import org.gvsig.expressionevaluator.ExpressionBuilder;
7 8
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_DECODE;
8 9
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
......
28 29
    public boolean canApply(ExpressionBuilder.Value value) {
29 30
        if (value instanceof ExpressionBuilder.Function) {
30 31
            if( StringUtils.equalsIgnoreCase(FUNCTION_DECODE, ((Function) value).name()) ) {
31
                List<Value> parameters = ((Function) value).parameters();
32
                List<Pair<String,Value>> parameters = ((Function) value).parameters();
32 33
                if( parameters.size()==2) {
33
                    Value p1 = parameters.get(0);
34
                    Value p2 = parameters.get(1);
34
                    Value p1 = parameters.get(0).getValue();
35
                    Value p2 = parameters.get(1).getValue();
35 36
                    if( p1 instanceof ExpressionBuilder.Constant && 
36 37
                        p2 instanceof ExpressionBuilder.Constant &&
37 38
                        ((ExpressionBuilder.Constant)p1).value() instanceof String &&
......
51 52

  
52 53
    @Override
53 54
    public String format(Value function) {
54
        List<Value> parameters = ((Function) function).parameters();
55
        Value p1 = parameters.get(0);
55
        List<Pair<String,Value>> parameters = ((Function) function).parameters();
56
        Value p1 = parameters.get(0).getValue();
56 57
        String p1value = Objects.toString(((ExpressionBuilder.Constant)p1).value(), "");
57 58
        String r = "X'"+p1value+"'";
58 59
        return r;
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/ST_ExtentAggregate.java
3 3
import java.text.MessageFormat;
4 4
import java.util.List;
5 5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.tuple.Pair;
6 7
import org.gvsig.expressionevaluator.ExpressionBuilder;
7 8
import static org.gvsig.expressionevaluator.GeometryExpressionBuilder.FUNCTION_ST_EXTENTAGGREGATE;
8 9
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
......
33 34

  
34 35
    @Override
35 36
    public String format(Value function) {
36
        List<Value> parameters = ((Function) function).parameters();
37
        String p1 = parameters.get(0).toString(formatter);
37
        List<Pair<String,Value>> parameters = ((Function) function).parameters();
38
        String p1 = parameters.get(0).getValue().toString(formatter);
38 39
        String r = MessageFormat.format("ST_Extent({0})", p1);
39 40
        return r;
40 41
    }
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/IsNull.java
3 3
import java.text.MessageFormat;
4 4
import java.util.List;
5 5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.tuple.Pair;
6 7
import org.gvsig.expressionevaluator.Code.Constant;
7 8
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
8 9
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_IS;
......
28 29
    public boolean canApply(Value value) {
29 30
        if (value instanceof Function) {
30 31
            if( StringUtils.equalsIgnoreCase(OPERATOR_IS, ((Function) value).name()) ) {
31
                List<Value> parameters = ((Function) value).parameters();
32
                Value p2 = parameters.get(1);
32
                List<Pair<String,Value>> parameters = ((Function) value).parameters();
33
                Value p2 = parameters.get(1).getValue();
33 34
                if( p2 instanceof Constant && ((Constant)p2).value()==null ) {
34 35
                    return true;
35 36
                }
......
40 41

  
41 42
    @Override
42 43
    public String format(Value function) {
43
        List<Value> parameters = ((Function) function).parameters();
44
        String p1 = parameters.get(0).toString(formatter);
44
        List<Pair<String,Value>> parameters = ((Function) function).parameters();
45
        String p1 = parameters.get(0).getValue().toString(formatter);
45 46
        String r = MessageFormat.format("( ({0}) IS NULL )", p1);
46 47
        return r;
47 48
    }
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/IsNotNull.java
3 3
import java.text.MessageFormat;
4 4
import java.util.List;
5 5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.tuple.Pair;
6 7
import org.gvsig.expressionevaluator.Code.Constant;
7 8
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
8 9
import static org.gvsig.expressionevaluator.ExpressionBuilder.OPERATOR_IS;
......
30 31
        if (value_not instanceof Function) {
31 32
            // NOT( IS( p1, NULL) )
32 33
            if( StringUtils.equalsIgnoreCase(OPERATOR_NOT, ((Function) value_not).name()) ) {
33
                List<Value> parameters = ((Function) value_not).parameters();
34
                Value value_is = parameters.get(0);
34
                List<Pair<String,Value>> parameters = ((Function) value_not).parameters();
35
                Value value_is = parameters.get(0).getValue();
35 36
                if( value_is instanceof Function && StringUtils.equalsIgnoreCase(OPERATOR_IS, ((Function)value_is).name()) ) {
36
                    List<Value> parameters_is = ((Function)value_is).parameters();
37
                    Value is_p2 = parameters_is.get(1);
37
                    List<Pair<String,Value>> parameters_is = ((Function) value_is).parameters();
38
                    Value is_p2 = parameters_is.get(1).getValue();
38 39
                    if( is_p2 instanceof Constant && ((Constant)is_p2).value()==null ) {
39 40
                        return true;
40 41
                    }
......
48 49
    public String format(Value value_not) {
49 50
        // NOT( IS( p1, NULL) )
50 51

  
51
        List<Value> parameters = ((Function) value_not).parameters();
52
        Value value_is = parameters.get(0);
53
        List<Value> parameters_is = ((Function)value_is).parameters();
54
        Value is_p1 = parameters_is.get(0);
52
        List<Pair<String,Value>> parameters = ((Function) value_not).parameters();
53
        Value value_is = parameters.get(0).getValue();
54
        List<Pair<String,Value>> parameters_is = ((Function)value_is).parameters();
55
        Value is_p1 = parameters_is.get(0).getValue();
55 56
        String r = MessageFormat.format(
56 57
                "( ({0}) IS NOT NULL )", 
57 58
                is_p1.toString(formatter)
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/IfNull.java
3 3
import java.text.MessageFormat;
4 4
import java.util.List;
5 5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.tuple.Pair;
6 7
import org.gvsig.expressionevaluator.ExpressionBuilder;
7 8
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_IFNULL;
8 9
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
......
36 37

  
37 38
    @Override
38 39
    public String format(Value function) {
39
            List<Value> parameters = ((Function) function).parameters();
40
            String p1 = parameters.get(0).toString(formatter);
41
            String p2 = parameters.get(1).toString(formatter);
42
            String p3 = parameters.get(2).toString(formatter);
40
            List<Pair<String,Value>> parameters = ((Function) function).parameters();
41
            String p1 = parameters.get(0).getValue().toString(formatter);
42
            String p2 = parameters.get(1).getValue().toString(formatter);
43
            String p3 = parameters.get(2).getValue().toString(formatter);
43 44
            String r = MessageFormat.format(
44 45
                    "NVL2({0}, {1}, {2})",
45 46
                    p1,
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/ST_Intersects.java
3 3
import java.text.MessageFormat;
4 4
import java.util.List;
5 5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.tuple.Pair;
6 7
import org.gvsig.expressionevaluator.ExpressionBuilder;
7 8
import static org.gvsig.expressionevaluator.GeometryExpressionBuilder.FUNCTION_ST_INTERSECTS;
8 9
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
......
33 34

  
34 35
    @Override
35 36
    public String format(Value function) {
36
        List<Value> parameters = ((Function) function).parameters();
37
        String p1 = parameters.get(0).toString(formatter);
38
        String p2 = parameters.get(1).toString(formatter);
37
        List<Pair<String,Value>> parameters = ((Function) function).parameters();
38
        String p1 = parameters.get(0).getValue().toString(formatter);
39
        String p2 = parameters.get(1).getValue().toString(formatter);
39 40
        String r = MessageFormat.format("( (({0}) && ({1})) AND ST_Intersects(({0}),({1}) ))", p1, p2);
40 41
        return r;
41 42
    }
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/ST_GeomFromEWKB.java
3 3
import java.text.MessageFormat;
4 4
import java.util.List;
5 5
import org.apache.commons.lang3.StringUtils;
6
import org.apache.commons.lang3.tuple.Pair;
6 7
import static org.gvsig.expressionevaluator.GeometryExpressionBuilder.FUNCTION_ST_GEOMFROMEWKB;
7 8
import org.gvsig.expressionevaluator.ExpressionBuilder.Function;
8 9
import org.gvsig.expressionevaluator.ExpressionBuilder.Value;
......
33 34

  
34 35
    @Override
35 36
    public String format(Value function) {
36
        List<Value> parameters = ((Function) function).parameters();
37
        String p1 = parameters.get(0).toString(formatter);
38
        String p2 = parameters.get(1).toString(formatter);
37
        List<Pair<String,Value>> parameters = ((Function) function).parameters();
38
        String p1 = parameters.get(0).getValue().toString(formatter);
39
        String p2 = parameters.get(1).getValue().toString(formatter);
39 40
        String r = MessageFormat.format("ST_GeomFromWKB({0}, {1})", p1, p2);
40 41
        return r;
41 42
    }
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/test/java/org/gvsig/fmap/dal/store/jdbc2/SQLBuilderTest.java
574 574
        System.out.println("# SQL1:: " + sqlbuilder.toString());        
575 575

  
576 576
        List<String> attrNames = new ArrayList<>();
577
        helper.replaceForeingValueFunction(sqlbuilder, ft, attrNames);
577
        helper.processSpecialFunctions(sqlbuilder, ft, attrNames);
578 578
        
579 579
        System.out.println("# SQL2:: " + sqlbuilder.toString());
580 580
        System.out.println("# Variables:: " + ArrayUtils.toString(sqlbuilder.variables_names()));
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/JDBCHelper.java
184 184

  
185 185
    public boolean isThreadSafe();
186 186
    
187
    public void replaceForeingValueFunction(
187
    public void processSpecialFunctions(
188 188
            SQLBuilder sqlbuilder, 
189 189
            FeatureType type,
190 190
            List<String> extra_column_names // Output param
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/operations/ResultSetForSetProviderOperation.java
214 214
                PROP_FEATURE_TYPE, this.storeType,
215 215
                PROP_TABLE, table
216 216
        );        
217
        this.helper.replaceForeingValueFunction(sqlbuilder, storeType, extraColumnNames);
217
        this.helper.processSpecialFunctions(sqlbuilder, storeType, extraColumnNames);
218 218
        String sql = sqlbuilder.toString();
219 219
        return sql;
220 220
    }
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/operations/CountOperation.java
131 131
            }
132 132
          }
133 133
        }
134
        this.helper.replaceForeingValueFunction(sqlbuilder, featureType, null);
134
        this.helper.processSpecialFunctions(sqlbuilder, featureType, null);
135 135
        
136 136
        select.remove_all_columns();
137 137
        select.column().value(sqlbuilder.count().all());
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/operations/CalculateEnvelopeOfColumnOperation.java
114 114
        sqlbuilder.select().where().and(        
115 115
            expbuilder.not_is_null(expbuilder.column(columnName))
116 116
        );
117
        this.helper.replaceForeingValueFunction(sqlbuilder, featureType, null);
117
        this.helper.processSpecialFunctions(sqlbuilder, featureType, null);
118 118
        sqlbuilder.setProperties(
119 119
                Variable.class, 
120 120
                PROP_TABLE, table
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/operations/TableIsEmptyOperation.java
67 67
            sqlbuilder.select().where().and(expbuilder.toValue(filter));
68 68
        }
69 69
        sqlbuilder.select().limit(1);
70
        this.helper.replaceForeingValueFunction(sqlbuilder, featureType, null);
70
        this.helper.processSpecialFunctions(sqlbuilder, featureType, null);
71 71
        sqlbuilder.setProperties(
72 72
                ExpressionBuilder.Variable.class, 
73 73
                PROP_TABLE, table
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/expressionbuilderformatter/Exists.java
1
package org.gvsig.fmap.dal.store.jdbc2.spi.expressionbuilderformatter;
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
import org.gvsig.fmap.dal.SQLBuilder;
10

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

  
32
    @Override
33
    public String format(Value function0) {
34
        Function function = (Function) function0;
35
        Value exp = function.parameters().get(0).getValue();
36
        return "EXISTS("+exp.toString(formatter)+")";
37
    }
38
    
39
}
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/expressionbuilderformatter/Select.java
1
package org.gvsig.fmap.dal.store.jdbc2.spi.expressionbuilderformatter;
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_SELECT;
9
import org.gvsig.fmap.dal.SQLBuilder;
10

  
11
/**
12
 *
13
 * @author jjdelcerro
14
 */
15
public class Select implements Formatter<Value> {
16
    
17
    private final SQLBuilder sqlbuilder;
18
    private final Formatter<Value> formatter;
19
    
20
    public Select(SQLBuilder sqlbuilder, Formatter<Value> formatter) {
21
        this.sqlbuilder = sqlbuilder;
22
        this.formatter = formatter;
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());
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff