Revision 46010

View differences:

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
123 123
    public static final String FUNCTION_LIST = "LIST";
124 124
    public static final String FUNCTION_TUPLE = "TUPLE";
125 125
    public static final String FUNCTION_DICT = "DICT";
126
    public static final String FUNCTION_$$CONSTANT = "$$CONSTANT";
127
    public static final String FUNCTION_$$IDENTIFIER = "$$IDENTIFIER";
126 128
    
127 129
    public static final String FUNCTION_GETATTR = "GETATTR";
128 130
    public static final String FUNCTION_GETITEM = "GETITEM";
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/spi/formatter/value/Getattr.java
31 31
        Function function = (Function) function0;
32 32
        Value obj = function.parameters().get(0);
33 33
        Value attr = function.parameters().get(1); 
34
        return obj.toString(formatter)+"."+ attr.toString(formatter);
34
        if( attr instanceof ExpressionBuilder.Variable &&
35
                ((ExpressionBuilder.Variable)attr).name()instanceof CharSequence) {
36
            return obj.toString(formatter)+".\""+ ((ExpressionBuilder.Variable)attr).name().toString()+"\"";
37
        } else if( attr instanceof ExpressionBuilder.Constant &&
38
                ((ExpressionBuilder.Constant)attr).value() instanceof CharSequence) {
39
            return obj.toString(formatter)+"."+ ((ExpressionBuilder.Constant)attr).value().toString();
40
        } else {
41
            return "GETATTR("+obj.toString(formatter)+","+attr.toString(formatter)+")";
42
        }
43
        
35 44
    }
36 45
    
37 46
}
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/spi/BaseExpressionEvaluator.java
267 267
        }
268 268
    }
269 269

  
270
    @Override
271
    public void addSymbolTable(SymbolTable symbolTable) {
272
        this.symbolTable.addSymbolTable(symbolTable);
273
    }
274

  
270 275
}
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/spi/AbstractSymbolTable.java
259 259
    public SymbolTable clone() throws CloneNotSupportedException {
260 260
        AbstractSymbolTable other = (AbstractSymbolTable) super.clone();
261 261
        if( this instanceof MutableSymbolTable ) {
262
            other.vars = new HashMap<>(this.vars);
263
            other.functions = new HashMap<>(this.functions);
264
            other.functionAlias = new HashMap<>(this.functionAlias);
262
            if( this.vars!=null ) {
263
                other.vars = new HashMap<>(this.vars);
264
            }
265
            if( this.functions!=null ) {
266
                other.functions = new HashMap<>(this.functions);
267
            }
268
            if( this.functionAlias!=null ) {
269
                other.functionAlias = new HashMap<>(this.functionAlias);
270
            }
265 271
        }
266 272
        other.symbolTables = new ArrayList<>();
267
        for (SymbolTable symbolTable : this.symbolTables) {
268
            other.symbolTables.add(symbolTable.clone());
273
        if( this.symbolTables!=null ) {
274
            for (SymbolTable symbolTable : this.symbolTables) {
275
                other.symbolTables.add(symbolTable.clone());
276
            }
269 277
        }
270 278
        return other;
271 279
    }
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/ExpressionEvaluator.java
18 18
     */
19 19
    @Override
20 20
    public String getSQL();
21
    
22
    public void addSymbolTable(SymbolTable symbolTable);
21 23

  
22 24
}
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/TestOptimizer.java
407 407
        Compiler compiler = createCompiler();
408 408

  
409 409
        Code code = compiler.compileExpression(source);
410
        assertEquals("'hola'->length()", code.toString());
410
        assertEquals("'hola'.length()", code.toString());
411 411

  
412 412
        SymbolTable symbolTable = createSymbolTable();
413 413
        Optimizer optimizer = createOptimizer(symbolTable);
414 414
        Code code2 = optimizer.optimize(code);
415
        assertEquals("'hola'->length()", code2.toString());
415
        assertEquals("'hola'.length()", code2.toString());
416 416
    }
417 417

  
418 418
}
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/TestExpressionBuilder.java
5 5
import org.apache.commons.lang3.ArrayUtils;
6 6
import org.gvsig.expressionevaluator.ExpressionBuilder;
7 7
import org.gvsig.expressionevaluator.ExpressionUtils;
8
import org.gvsig.tools.dataTypes.DataTypeUtils;
9 8
import org.gvsig.tools.dataTypes.DataTypes;
10 9
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
11 10

  
......
644 643
        assertEquals("'10.5'", v.toString());
645 644

  
646 645
    }
646

  
647
    public void testGetAttr1() {
648
        ExpressionBuilder builder = createExpressionBuilder();
649
        builder.set(
650
            builder.getattr("ARENA2_VEHICULOS","ID_ACCIDENTE")
651
        );
652

  
653
        assertEquals(
654
                "\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\"",
655
                builder.toString()
656
        );
657
        assertEquals(
658
                "[ARENA2_VEHICULOS, ID_ACCIDENTE]",
659
                ArrayUtils.toString(builder.variables_names())
660
        );
661
        assertEquals(
662
                "[]",
663
                ArrayUtils.toString(builder.parameters_names())
664
        );
665
    }
647 666
    
648
    }
667
}
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/TestCompiler.java
7 7
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
8 8
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
9 9
import org.gvsig.expressionevaluator.ExpressionSyntaxException;
10
import org.gvsig.expressionevaluator.MutableSymbolTable;
10 11
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
11 12

  
12 13

  
......
44 45
        return compiler;
45 46
    }
46 47
    
48
    protected MutableSymbolTable createSymbolTable() {
49
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
50
        MutableSymbolTable symbolTable = manager.createSymbolTable();
51
        symbolTable.setVar("precio", 200);
52
        symbolTable.setVar("1990", 0.168873933773767);
53
        return symbolTable;
54
    }
55
    
47 56
    public void testIdentifier1() {
48 57
        String source = "precio";
49 58

  
......
315 324
        Compiler compiler = createCompiler();
316 325
        
317 326
        Code code = compiler.compileExpression(source);
318
        assertEquals("'hola'->length()", code.toString());
327
        assertEquals("'hola'.length()", code.toString());
319 328
    }
320 329
    
321 330
    
331
    public void testInvokeMethod1b() {
332
        String source = "'hola'->length()";
333

  
334
        Compiler compiler = createCompiler();
335
        
336
        Code code = compiler.compileExpression(source);
337
        assertEquals("'hola'.length()", code.toString());
338
    }
339
    
340
    
322 341
    public void testInvokeMethod2() {
323 342
        String source = "'hola'.indexOf('l')    ";
324 343
        
325 344
        Compiler compiler = createCompiler();
326 345
        
327 346
        Code code = compiler.compileExpression(source);
328
        assertEquals("'hola'->indexOf('l')", code.toString());
347
        assertEquals("'hola'.indexOf('l')", code.toString());
329 348
    }
330 349

  
331 350
    public void testSyntaxError1() {
......
472 491
        assertEquals("-0.000123", code.toString());
473 492
    }
474 493

  
494
    public void testGetAttr1() {
495
        String source =  "ARENA2_VEHICULOS.ID_ACCIDENTE";
475 496

  
497
        Compiler compiler = createCompiler();
498
        
499
        Code code = compiler.compileExpression(source);
500
        assertEquals( "GETATTR(\"ARENA2_VEHICULOS\", 'ID_ACCIDENTE')", code.toString());
501
    }
502

  
503
    public void testGetAttr1b() {
504
        String source =  "ARENA2_VEHICULOS.ID_ACCIDENTE";
505

  
506
        Compiler compiler = createCompiler();
507
        
508
        Code code = compiler.compileExpression(source);
509
        code.link(this.createSymbolTable());
510
        assertEquals( "\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\"", code.toString());
511
    }
512

  
513
    public void testGetAttr2a() {
514
        String source =  "GETATTR(ARENA2_VEHICULOS,'ID_ACCIDENTE')";
515

  
516
        Compiler compiler = createCompiler();
517
        
518
        Code code = compiler.compileExpression(source);
519
        code.link(this.createSymbolTable());
520
        assertEquals( "\"ARENA2_VEHICULOS\".\"ID_ACCIDENTE\"", code.toString());
521
    }
522

  
523
    public void testGetAttr2b() {
524
        String source =  "GETATTR(ARENA2_VEHICULOS,\"ID_ACCIDENTE\")";
525

  
526
        Compiler compiler = createCompiler();
527
        
528
        Code code = compiler.compileExpression(source);
529
        code.link(this.createSymbolTable());
530
        assertEquals( "GETATTR(\"ARENA2_VEHICULOS\", \"ID_ACCIDENTE\")", code.toString());
531
    }
532

  
533
    public void testGetAttr2c() {
534
        String source =  "GETATTR(ARENA2_VEHICULOS,'ID_ACCIDENTE'||3)";
535

  
536
        Compiler compiler = createCompiler();
537
        
538
        Code code = compiler.compileExpression(source);
539
        code.link(this.createSymbolTable());
540
        assertEquals( "GETATTR(\"ARENA2_VEHICULOS\", ('ID_ACCIDENTE' || 3))", code.toString());
541
    }
542

  
543

  
476 544
}
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
730 730
            }
731 731
            StringBuilder builder = new StringBuilder();
732 732
            builder.append(this.instance.toString(formatter));
733
            builder.append("->");
733
            builder.append(".");
734 734
            builder.append(this.methodname());
735 735
            builder.append("(");
736 736
            if( this.parameters()!=null ) {
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/symboltable/ProgrammingSymbolTable.java
1 1
package org.gvsig.expressionevaluator.impl.symboltable;
2 2

  
3 3
import org.gvsig.expressionevaluator.Function;
4
import org.gvsig.expressionevaluator.impl.function.programming.$$ConstantFunction;
5
import org.gvsig.expressionevaluator.impl.function.programming.$$IdentifierFunction;
4 6
import org.gvsig.expressionevaluator.impl.function.programming.CallFunction;
5 7
import org.gvsig.expressionevaluator.impl.function.programming.CallMethodFunction;
6 8
import org.gvsig.expressionevaluator.impl.function.programming.CaseFunction;
......
77 79
        this.addFunction(new MapFunction());
78 80
        this.addFunction(new CallFunction());
79 81
        this.addFunction(new VarFunction());
82
        this.addFunction(new $$ConstantFunction());
83
        this.addFunction(new $$IdentifierFunction());
80 84
    }
81 85

  
82 86
    private void addOperator(Function operator) {
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/$$ConstantFunction.java
1
package org.gvsig.expressionevaluator.impl.function.programming;
2

  
3
import org.apache.commons.lang3.Range;
4
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_$$CONSTANT;
5
import org.gvsig.expressionevaluator.Function;
6
import org.gvsig.expressionevaluator.Interpreter;
7
import org.gvsig.expressionevaluator.spi.AbstractFunction;
8

  
9
public class $$ConstantFunction extends AbstractFunction {
10

  
11
    public $$ConstantFunction() {
12
        super(
13
            Function.GROUP_PROGRAMMING, 
14
                FUNCTION_$$CONSTANT, 
15
            Range.is(1),
16
            "Returns the value passed as a parameter.\n" +
17
                "This function is used to mark that the parameter must be evaluated before "+
18
                    "converting the expression to SQL and passed to it as a constant. ",
19
            FUNCTION_$$CONSTANT+"({{expression}})",
20
            null,
21
            "Object",
22
            false
23
        );
24
    }
25
    
26
    @Override
27
    public boolean allowConstantFolding() {
28
        return false;
29
    }    
30
    
31
    @Override
32
    public Object call(Interpreter interpreter, final Object[] args) throws Exception {
33
        return args[0];        
34
    }
35
    
36

  
37
}
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
64 64
        StringBuilder builder = new StringBuilder();
65 65
        Code arg0 = args.get(0);
66 66
        Code arg1 = args.get(1);
67
        if( arg0 instanceof Code.Identifier && arg1 instanceof Code.Identifier ) {
67
//        if( arg0 instanceof Code.Identifier && arg1 instanceof Code.Identifier ) {
68
//          builder.append(arg0.toString(formatter));
69
//          builder.append("->");
70
//          builder.append(arg1.toString());
71
//        } else 
72
        if( arg0 instanceof Code.Identifier && arg1 instanceof Code.Constant && ((Code.Constant)arg1).value() instanceof CharSequence ) {
68 73
          builder.append(arg0.toString(formatter));
69
          builder.append(".");
70
          builder.append(arg1.toString());
74
          builder.append(".\"");
75
          builder.append(((Code.Constant)arg1).value().toString());
76
          builder.append("\"");
71 77
        } else {
72 78
          builder.append(this.name());
73 79
          builder.append("(");
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/$$IdentifierFunction.java
1
package org.gvsig.expressionevaluator.impl.function.programming;
2

  
3
import org.apache.commons.lang3.Range;
4
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_$$CONSTANT;
5
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_$$IDENTIFIER;
6
import org.gvsig.expressionevaluator.Function;
7
import org.gvsig.expressionevaluator.Interpreter;
8
import org.gvsig.expressionevaluator.spi.AbstractFunction;
9

  
10
public class $$IdentifierFunction extends AbstractFunction {
11

  
12
    public $$IdentifierFunction() {
13
        super(
14
            Function.GROUP_PROGRAMMING, 
15
                FUNCTION_$$IDENTIFIER, 
16
            Range.is(1),
17
            "Evaluate the parameter as a string and return the value of the variable referred by this string.\n" +
18
                "This function is used to mark that the result of evaluate the parameter must be "+
19
                    "converted to a variable identifier when generating the SQL expression. ",
20
            FUNCTION_$$IDENTIFIER+"({{expression}})",
21
            null,
22
            "Object",
23
            false
24
        );
25
    }
26
    
27
    @Override
28
    public boolean allowConstantFolding() {
29
        return false;
30
    }    
31
    
32
    @Override
33
    public Object call(Interpreter interpreter, final Object[] args) throws Exception {
34
        String identifier = this.getStr(args, 0);
35
        return interpreter.getSymbolTable().value(identifier);        
36
    }
37
    
38

  
39
}
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
311 311
            ReprMethod repr = manager.getReprMethod(this.value);            
312 312
            return repr.repr(value);
313 313
        }
314
        
315
        public ExpressionBuilder builder() {
316
            return this.builder; // Ojo, no esta en el API.
317
        }
314 318
    }
315 319

  
316 320
    public class CustomBase extends AbstractValue implements Custom {
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.swing/org.gvsig.expressionevaluator.swing.api/src/main/java/org/gvsig/expressionevaluator/swing/ExpressionBuilderConfig.java
61 61
    
62 62
    public void setPreviewSymbolTable(SymbolTable symbolTable);
63 63
    
64
    public void addPreviewSymbolTable(SymbolTable symbolTable);
65
    
64 66
    public void copyConfigFrom(ExpressionBuilderConfig other);
65 67
    
66 68
    public boolean allowAggregates();
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.swing/org.gvsig.expressionevaluator.swing.impl/src/main/java/org/gvsig/expressionevaluator/swing/impl/DefaultJExpressionBuilder.java
857 857
    }
858 858
    
859 859
    @Override
860
    public void addPreviewSymbolTable(SymbolTable symbolTable) {
861
        this.builderConfig.addPreviewSymbolTable(symbolTable);
862
    }
863

  
864
    @Override
860 865
    public void setAutomaticExpressionCheckerEnabled(boolean enabled) {
861 866
      if( this.automaticExpressionChecker==null ) {
862 867
        this.automaticExpressionCheckerEnabled = enabled;
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.swing/org.gvsig.expressionevaluator.swing.impl/src/main/java/org/gvsig/expressionevaluator/swing/impl/DefaultExpressionBuilderConfig.java
10 10
import org.gvsig.expressionevaluator.Expression;
11 11
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
12 12
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
13
import org.gvsig.expressionevaluator.ExpressionUtils;
13 14
import org.gvsig.expressionevaluator.Function;
15
import org.gvsig.expressionevaluator.MutableSymbolTable;
14 16
import org.gvsig.expressionevaluator.SymbolTable;
15 17
import org.gvsig.expressionevaluator.SymbolTableFactory;
16 18
import org.gvsig.expressionevaluator.swing.Element;
......
265 267
    }
266 268

  
267 269
    @Override
270
    public void addPreviewSymbolTable(SymbolTable symbolTable) {
271
        if( symbolTable==null ) {
272
            return;
273
        }
274
        if( this.previewSymbolTable==null ) {
275
            this.previewSymbolTable = symbolTable;
276
            return;
277
        }
278
        this.previewSymbolTable.addSymbolTable(symbolTable);
279
    }
280

  
281
    @Override
268 282
    public void setSQLCompatible(boolean SQLCompatible) {
269 283
        this.SQLCompatible = SQLCompatible;
270 284
    }
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.swing/org.gvsig.expressionevaluator.swing.impl/src/main/java/org/gvsig/expressionevaluator/swing/impl/DefaultExpressionPickerController.java
325 325
    }
326 326

  
327 327
    @Override
328
    public void addPreviewSymbolTable(SymbolTable symbolTable) {
329
        this.config.addPreviewSymbolTable(symbolTable);
330
    }
331

  
332
    @Override
328 333
    public Object getProperty(String name) {
329 334
        return this.config.getProperty(name);
330 335
    }
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.swing/org.gvsig.expressionevaluator.swing.impl/src/main/java/org/gvsig/expressionevaluator/swing/impl/DefaultJExpressionPicker.java
13 13
import org.gvsig.expressionevaluator.SymbolTable;
14 14
import org.gvsig.expressionevaluator.swing.Element;
15 15
import org.gvsig.expressionevaluator.swing.ExpressionBuilderConfig;
16
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
17 16
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
18 17
import org.gvsig.expressionevaluator.swing.JExpressionPicker;
19 18
import org.gvsig.tools.util.Factory;
......
121 120
    }
122 121

  
123 122
    @Override
123
    public void addPreviewSymbolTable(SymbolTable symbolTable) {
124
        this.controller.addPreviewSymbolTable(symbolTable);
125
    }
126

  
127
    @Override
124 128
    public Object getProperty(String name) {
125 129
        return this.controller.getProperty(name);
126 130
    }
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/TestCompiler.java
280 280
        Compiler compiler = createCompiler();
281 281
        
282 282
        Code code = compiler.compileExpression(source);
283
        assertEquals("'hola'->length()", code.toString());
283
        assertEquals("'hola'.length()", code.toString());
284 284
    }
285 285
    
286
    public void testInvokeMethod1b() {
287
        String source = "'hola'->length()";
288

  
289
        Compiler compiler = createCompiler();
290
        
291
        Code code = compiler.compileExpression(source);
292
        assertEquals("'hola'.length()", code.toString());
293
    }
286 294
    
295
    
287 296
    public void testInvokeMethod2() {
288 297
        String source = "'hola'.indexOf('l')    ";
289 298
        
290 299
        Compiler compiler = createCompiler();
291 300
        
292 301
        Code code = compiler.compileExpression(source);
293
        assertEquals("'hola'->indexOf('l')", code.toString());
302
        assertEquals("'hola'.indexOf('l')", code.toString());
294 303
    }
295 304

  
296 305
    public void testSyntaxError1() {
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/featureform/swing/impl/DefaultFeaturesFormContext.java
2 2

  
3 3
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
4 4
import org.gvsig.featureform.swing.FeaturesFormContext;
5
import org.gvsig.featureform.swing.JFeaturesForm;
5 6
import org.gvsig.fmap.dal.StoresRepository;
6 7
import org.gvsig.fmap.dal.exception.DataException;
8
import org.gvsig.fmap.dal.feature.Feature;
7 9
import org.gvsig.fmap.dal.feature.FeatureStore;
8 10
import org.gvsig.fmap.dal.feature.FeatureType;
9 11
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
......
56 58
        return ExpressionEvaluatorLocator.getExpressionEvaluatorManager();
57 59
    }
58 60

  
61
    public JFeaturesForm getFeaturesForm() {
62
        return null;
63
    }
64

  
65
    public Feature getCurrentFeature() {    
66
        return null;
67
    }
59 68
}
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/featureform/swing/impl/DefaultJFeatureForm.java
56 56
            FeatureType featureType = this.store.getDefaultFeatureType();
57 57
            FeatureTypeDefinitionsManager featureTypeDefinitionsManager = DALLocator.getFeatureTypeDefinitionsManager();
58 58
            DynClass dynClass = featureTypeDefinitionsManager.get(store,featureType);
59
            this.form = DynFormLocator.getDynFormManager().createJDynForm(new DefaultFeaturesFormContext(this.store), dynClass);
59
            this.form = DynFormLocator.getDynFormManager().createJDynForm(new DefaultFeaturesFormContext(this.store) {
60
                public Feature getCurrentFeature() {
61
                    return feature;
62
                }
63
            }, dynClass); 
60 64
        } catch (Exception ex) {
61 65
            logger.warn("Can't create form.",ex);
62 66
            throw new RuntimeException("Can't create form.",ex);
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/featureform/swing/impl/DefaultJFeatureReferencesForm.java
217 217
        if (this.formset == null) {
218 218
            DynFormManager formManager = DynFormLocator.getDynFormManager();
219 219
            this.formset = formManager.createJDynFormSet(
220
                    new DefaultFeaturesFormContext(this.store),
220
                    new DefaultFeaturesFormContext(this.store) {
221
                        @Override
222
                        public Feature getCurrentFeature() {    
223
                            return DefaultJFeatureReferencesForm.this.getCurrentFeature();
224
                        }
225
                    },
221 226
                    this.definition,
222 227
                    null
223 228
            );
......
535 540
        this.updateForm();
536 541
    }
537 542

  
543
    @Override
544
    public Feature getCurrentFeature() {
545
        long index = getCurrentIndex();
546
        if( index<0 ) {
547
            return null;
548
        }
549
        Feature f = get(index);
550
        try {
551
            DynObject adapter = f.getAsDynObject();
552
            this.getFormset().getForm().getValues(adapter);
553
            f = ((FacadeOfAFeature)adapter).getFeature();
554
            return f;
555
        } catch(Exception ex) {
556
            return f;
557
        }
558
    }
559

  
538 560
}
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/featureform/swing/impl/DefaultJFeaturesForm.java
32 32
import java.util.ArrayList;
33 33
import java.util.Collection;
34 34
import java.util.List;
35
import java.util.Map;
35 36
import javax.swing.AbstractAction;
36 37
import javax.swing.Action;
37 38
import static javax.swing.Action.ACTION_COMMAND_KEY;
......
98 99
import org.gvsig.tools.swing.api.windowmanager.WindowManager.MODE;
99 100
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
100 101
import org.gvsig.tools.swing.icontheme.IconTheme;
102
import org.gvsig.tools.util.PropertiesSupport;
103
import org.gvsig.tools.util.PropertiesSupportHelper;
101 104
import org.slf4j.Logger;
102 105
import org.slf4j.LoggerFactory;
103 106

  
......
112 115
    private final String FINISHEDITING_ACTION = "finishEditing";
113 116
    private final String REFRESHFORM_ACTION = "refreshForm";
114 117

  
118
    private class JFeaturesFormPanel extends JPanel implements PropertiesSupport {
119

  
120
        private final PropertiesSupport properties;
121
        
122
        private JFeaturesFormPanel(PropertiesSupport properties, BorderLayout layout) {
123
            super(layout);
124
            this.properties = properties;
125
        }
126

  
127
        @Override
128
        public Object getProperty(String name) {
129
            return this.properties.getProperty(name);
130
        }
131

  
132
        @Override
133
        public void setProperty(String name, Object value) {
134
            this.properties.setProperty(name, value);
135
        }
136

  
137
        @Override
138
        public Map<String, Object> getProperties() {
139
            return this.properties.getProperties();
140
        }
141
        
142
    }
143
    
115 144
    private class FormActionContext extends AbstractDALActionContext {
116 145

  
117 146
        public FormActionContext() {
......
151 180
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultJFeaturesForm.class);
152 181

  
153 182
    private static final int PAGE_SIZE = 10;
154
    private JPanel panel;
183
    private JFeaturesFormPanel panel;
155 184
    private JDynFormSet formset;
156 185
    private FeatureStore store;
157 186
    private boolean needrefresh;
......
159 188
    private DynFormDefinition definition = null;
160 189
    private FeatureQuery currentQuery;
161 190
    private List<Action> otherActions;
162
    private ActionListenerSupport actionListeners;
191
    private final ActionListenerSupport actionListeners;
192
    private final PropertiesSupportHelper propertiesHelper;
163 193

  
194
    @SuppressWarnings("LeakingThisInConstructor")
164 195
    public DefaultJFeaturesForm() {
165 196
        this.otherActions = new ArrayList<>();
166
        this.panel = new JPanel(new BorderLayout());
197
        this.propertiesHelper = new PropertiesSupportHelper();
198
        this.propertiesHelper.setProperty("FeaturesForm", this);
199
        this.panel = new JFeaturesFormPanel(this.propertiesHelper, new BorderLayout());
167 200
        this.panel.addComponentListener(new ComponentAdapter() {
168 201
            @Override
169 202
            public void componentHidden(ComponentEvent e) {
......
281 314
        this.otherActions = null;
282 315
    }
283 316

  
317
    public static class MyFeaturesFormContext extends DefaultFeaturesFormContext {
318

  
319
        private final DefaultJFeaturesForm featuresForm;
320
        
321
        public MyFeaturesFormContext(DefaultJFeaturesForm featuresForm) {
322
            super(featuresForm.store);
323
            this.featuresForm = featuresForm;
324
        }
325
        
326
        @Override
327
        public JFeaturesForm getFeaturesForm() {
328
            return this.featuresForm;
329
        }
330
        @Override
331
        public Feature getCurrentFeature() {    
332
            return this.featuresForm.getCurrentFeature();
333
        }
334
    }
335
    
284 336
    @Override
285 337
    public JDynFormSet getFormset() {
286 338
        if (this.formset == null) {
287 339
            DynFormManager formManager = DynFormLocator.getDynFormManager();
288 340
            this.formset = formManager.createJDynFormSet(
289
                    new DefaultFeaturesFormContext(this.store),
341
                    new MyFeaturesFormContext(this),
290 342
                    this.definition,
291 343
                    null
292 344
            );
......
1032 1084
        return this.actionListeners.hasActionListeners();
1033 1085
    }
1034 1086

  
1087
    @Override
1088
    public Feature getCurrentFeature() {
1089
        long index = getCurrentIndex();
1090
        if( index<0 ) {
1091
            return null;
1092
        }
1093
        Feature f = get(index);
1094
        try {
1095
            DynObject adapter = f.getAsDynObject();
1096
            this.getFormset().getForm().getValues(adapter);
1097
            f = ((FacadeOfAFeature)adapter).getFeature();
1098
            return f;
1099
        } catch(Exception ex) {
1100
            return f;
1101
        }
1102
    }
1035 1103
}
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/DefaultSearchPanel.java
39 39
import javax.swing.ListSelectionModel;
40 40
import javax.swing.SwingUtilities;
41 41
import javax.swing.event.ChangeEvent;
42
import javax.swing.event.ChangeListener;
43 42
import javax.swing.event.ListSelectionEvent;
44 43
import javax.swing.event.ListSelectionListener;
45 44
import javax.swing.table.DefaultTableModel;
......
52 51
import org.gvsig.expressionevaluator.Expression;
53 52
import org.gvsig.expressionevaluator.ExpressionBuilder;
54 53
import org.gvsig.expressionevaluator.ExpressionUtils;
54
import org.gvsig.expressionevaluator.MutableSymbolTable;
55 55
import static org.gvsig.fmap.dal.DataManager.DAL_USE_LABELS;
56 56
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_BOTH;
57 57
import static org.gvsig.fmap.dal.DataManager.USE_LABELS_NO;
......
116 116
import org.gvsig.tools.swing.api.bookmarkshistory.BookmarksController;
117 117
import org.gvsig.tools.swing.api.bookmarkshistory.HistoryController;
118 118
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
119
import org.gvsig.tools.util.PropertiesSupportHelper;
119 120

  
120 121
/**
121 122
 *
......
133 134
    private HistoryController historyController;
134 135
    private FeatureQuery lastQuery;
135 136
    private Feature lastSelectedFeature;
137
    private MutableSymbolTable symbolTable;
138
    
139
    private final PropertiesSupportHelper propertiesHelper;
136 140

  
137 141
    public static class UseLabelsYesAction extends AbstractAction {
138 142

  
......
321 325
    
322 326
    private class TablePopupMenu extends JPopupMenu {
323 327
            public final JTable table;
328
            @SuppressWarnings("OverridableMethodCallInConstructor")
324 329
            public TablePopupMenu(JTable inputTable) {
325 330
                this.table = inputTable;
326 331
                I18nManager i18n = ToolsLocator.getI18nManager();
327 332
                JMenuItem copyRowsActionMenu = new JMenuItem(i18n.getTranslation("_Copy_rows"));
328
                copyRowsActionMenu.addActionListener(new ActionListener() {
329

  
330
                    @Override
331
                    public void actionPerformed(ActionEvent e) {
332
                        doCopyRows(table);
333
                    }
333
                copyRowsActionMenu.addActionListener((ActionEvent e) -> {
334
                    doCopyRows(table);
334 335
                });
335 336
                this.add(copyRowsActionMenu);
336 337
            }
......
483 484
    private SimpleFeaturesTableModel resultPostProcessModel;
484 485

  
485 486
    private boolean processing;
486

  
487 487
    private JComponent configurableActions;
488 488

  
489
    @SuppressWarnings({"OverridableMethodCallInConstructor", "LeakingThisInConstructor"})
489 490
    public DefaultSearchPanel(FeatureStore store) {
490 491
        this.store = store;
491 492
        this.filterOnlyMode = false;
......
504 505
        this.configurableActions = null;
505 506
        this.resultModel = null;
506 507
        this.resultPostProcessModel = null;
508
        this.propertiesHelper = new PropertiesSupportHelper();
509
        this.propertiesHelper.setProperty("SearchPanel", this);
507 510

  
508 511
        Search search = (Search) ToolsLocator.getComplementsManager().get(
509 512
                Search.COMPLEMENT_MANE, getFeatureType()
......
605 608
        swingManager.translate(this.btnAddAccumulatedFilter);
606 609
        swingManager.translate(this.btnRemoveAccumulatedFilter);
607 610
        swingManager.translate(this.btnViewAccumulatedFilter);
608

  
611
        
609 612
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
610 613
        this.configurableActions = cfgActionsManager.getConfigurableActionsComponent(CONFIGURABLE_PANEL_ID, this);
611 614
        this.pnlCfgActions.setLayout(new BorderLayout(0, 0));
......
644 647
                        null
645 648
                )
646 649
        );
647
        this.conditionPanels.add(
648
                new SearchConditionPanelAdvanced(
649
                        this.store,
650
                        txtAdvancedExpression,
651
                        btnAdvancedExpression,
652
                        btnAdvancedExpressionHistory,
653
                        btnAdvancedExpressionBookmarks
654
                )
650
        
651
        SearchConditionPanelAdvanced advancedPanel = new SearchConditionPanelAdvanced(
652
                this.store,
653
                txtAdvancedExpression,
654
                btnAdvancedExpression,
655
                btnAdvancedExpressionHistory,
656
                btnAdvancedExpressionBookmarks
655 657
        );
658
        this.conditionPanels.add(advancedPanel);
659
        
656 660
        for (SearchConditionPanelFactory factory : DALSwingLocator.getManager().getSearchConditionPanels()) {
657 661
            String factoryName = "unknown";
658 662
            try {
......
700 704

  
701 705
        this.historyController.setFilter(null);
702 706

  
703
        ActionListener bookmarksAndHistoryListener = new ActionListener() {
704
            @Override
705
            public void actionPerformed(ActionEvent e) {
706
                ActionEventWithCurrentValue<DefaultSearchParameters> b = (ActionEventWithCurrentValue<DefaultSearchParameters>) e;
707
                switch (b.getID()) {
708
                    case ID_GETVALUE:
709
                        DefaultSearchParameters actualParams = (DefaultSearchParameters) fetch(null);
710
                        b.setCurrentValue(actualParams);
711
                        break;
712

  
713
                    case ID_SETVALUE:
714
                        if (b.getCurrentValue() == null) {
715
                            return;
716
                        }
717
                        DefaultSearchParameters searchParams;
718
                        try {
719
                            searchParams = b.getCurrentValue().getCopy();
720
                        } catch (Exception ex) {
721
                            LOGGER.warn("Not been able to clone export parameters", ex);
722
                            return;
723
                        }
724
                        clear();
725
                        put(searchParams);
726
                        Thread th = new Thread(() -> {
727
                            doSearch(searchParams);
728
                        });
729
                        th.start();
730
                        break;
731
                }
732

  
707
        ActionListener bookmarksAndHistoryListener = (ActionEvent e) -> {
708
            ActionEventWithCurrentValue<DefaultSearchParameters> b = (ActionEventWithCurrentValue<DefaultSearchParameters>) e;
709
            switch (b.getID()) {
710
                case ID_GETVALUE:
711
                    DefaultSearchParameters actualParams = (DefaultSearchParameters) fetch(null);
712
                    b.setCurrentValue(actualParams);
713
                    break;
714
                    
715
                case ID_SETVALUE:
716
                    if (b.getCurrentValue() == null) {
717
                        return;
718
                    }
719
                    DefaultSearchParameters searchParams;
720
                    try {
721
                        searchParams = b.getCurrentValue().getCopy();
722
                    } catch (Exception ex) {
723
                        LOGGER.warn("Not been able to clone export parameters", ex);
724
                        return;
725
                    }
726
                    clear();
727
                    put(searchParams);
728
                    Thread th = new Thread(() -> {
729
                        doSearch(searchParams);
730
                    });
731
                    th.start();
732
                    break;
733 733
            }
734 734
        };
735 735
        this.historyController.addActionListener(bookmarksAndHistoryListener);
......
741 741
            }
742 742
        });
743 743

  
744
        this.btnSearchPostProcess.addActionListener(new ActionListener() {
745
            @Override
746
            public void actionPerformed(ActionEvent e) {
747
                try {
748
                    doSelectSearchPostprocess();
749
                } catch (DataException ex) {
750
                    LOGGER.warn("Can't select a Search Post Process", ex);
751
                }
744
        this.btnSearchPostProcess.addActionListener((ActionEvent e) -> {
745
            try {
746
                doSelectSearchPostprocess();
747
            } catch (DataException ex) {
748
                LOGGER.warn("Can't select a Search Post Process", ex);
752 749
            }
753 750
        });
754 751

  
......
779 776
            return;
780 777
        }
781 778
        
782
        this.tabResults.addChangeListener(new ChangeListener() {
783
            public void stateChanged(ChangeEvent evt) {
784
                SwingUtilities.invokeLater(() -> {
785
                    if(tabResults.getSelectedIndex()==0){
786
                        updateNumberElementsMsg(resultModel);
787
                    }else{
788
                        updateNumberElementsMsg(resultPostProcessModel);
789
                    }
790
                });
791
            }
779
        this.tabResults.addChangeListener((ChangeEvent evt) -> {
780
            SwingUtilities.invokeLater(() -> {
781
                if(tabResults.getSelectedIndex()==0){
782
                    updateNumberElementsMsg(resultModel);
783
                }else{
784
                    updateNumberElementsMsg(resultPostProcessModel);
785
                }
786
            });
792 787
        });
793 788
        if( this.filterOnlyMode ) {
794 789
            this.btnSearchPostProcess.setVisible(false);
......
818 813
        );
819 814
    }
820 815

  
821
    private FeatureType getFeatureType() {
816
    @Override
817
    public FeatureType getFeatureType() {
822 818
        try {
823 819
            return store.getDefaultFeatureType();
824 820
        } catch (Exception ex) {
......
887 883
        return valid;
888 884
    }
889 885
    
886
    @Override
890 887
    public void search() {
891 888
        StringBuilder message = new StringBuilder();
892 889
        if (!this.isValid(message)) {
......
929 926
        th.start();
930 927
    }
931 928
    
932
     private void doSearch(SearchParameters searchParams)  {
929
    private void doSearch(SearchParameters searchParams)  {
933 930
            final MutableObject model = new MutableObject(null);       
934 931
            final MutableLong rowCount=new MutableLong();
935 932
            try {
......
938 935
//                myQuery = this.getQuery().getCopy();
939 936
                this.tabResults.setSelectedIndex(0);
940 937
                List<String> resultColumnNames = searchParams.getResultColumnNames();
938
//                this.symbolTable.setVar("SearchPanel", this);
939
                this.symbolTable.setVar("SearchParameters", searchParams);
941 940
                myQuery = searchParams.getQuery().getCopy();
941
                myQuery.setSymbolTable(this.symbolTable);
942 942
                features = store.getFeatures(myQuery, 50);
943 943
                FacadeOfAFeaturePagingHelper facade = (FacadeOfAFeaturePagingHelper) features;
944 944
                FeatureType ftype = facade.getFeaturePagingHelper().getFeatureSet().getDefaultFeatureType();
......
1061 1061

  
1062 1062
    @Override
1063 1063
    public SearchConditionPanel getConditionPanel(String name) {
1064
        if( conditionPanels==null ) {
1065
            return null;
1066
        }
1064 1067
        for (SearchConditionPanel panel : conditionPanels) {
1065 1068
            if (StringUtils.equalsIgnoreCase(name, panel.getFactory().getName())) {
1066 1069
                return panel;
......
1419 1422

  
1420 1423
    @Override
1421 1424
    public void put(SearchParameters inParams) {
1425
        this.symbolTable.setVar("SearchParameters", inParams);
1422 1426
        this.parameters = (DefaultSearchParameters) inParams;
1423 1427
        for (SearchConditionPanel conditionPanel : this.conditionPanels) {
1424 1428
            try {
......
1475 1479
        }
1476 1480
        this.parameters.setSearchMode(searchMode);
1477 1481
        FeatureQuery query = (FeatureQuery) this.parameters.getQuery();
1482
        query.setSymbolTable(symbolTable);
1478 1483
        this.lastQuery = query.getCopy();
1479 1484
        query.retrievesAllAttributes();
1480 1485
        query.clearFilter();
......
1685 1690
//            if( component instanceof OrderByAction ) {
1686 1691
//                return false;
1687 1692
//            }
1688
            if( component instanceof CalculatedColumnsAction ) {
1689
                return false;
1690
            }
1693
//            if( component instanceof CalculatedColumnsAction ) {
1694
//                return false;
1695
//            }
1691 1696
        }
1692 1697
        return true;
1693 1698
    }
......
1723 1728
        return this.lastSelectedFeature;
1724 1729
    }
1725 1730

  
1731
    @Override
1732
    public Object getProperty(String name) {
1733
        return this.propertiesHelper.getProperty(name);
1734
    }
1735

  
1736
    @Override
1737
    public void setProperty(String name, Object value) {
1738
        this.propertiesHelper.setProperty(name, value);
1739
    }
1740

  
1741
    @Override
1742
    public Map<String, Object> getProperties() {
1743
        return this.propertiesHelper.getProperties();
1744
    }
1745

  
1746
  
1726 1747
}
1727 1748
  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.api/src/main/java/org/gvsig/featureform/swing/JFeatureReferencesForm.java
24 24

  
25 25
import java.awt.Dimension;
26 26
import java.util.List;
27
import org.gvsig.fmap.dal.StoresRepository;
28 27

  
29 28
import org.gvsig.fmap.dal.feature.Feature;
30 29

  
31 30
import org.gvsig.fmap.dal.feature.FeatureReference;
32 31
import org.gvsig.fmap.dal.feature.FeatureStore;
33
import org.gvsig.fmap.dal.feature.FeatureType;
34
import org.gvsig.tools.dynform.JDynForm.DynFormContext;
35 32
import org.gvsig.tools.dynform.JDynFormSet;
36 33
import org.gvsig.tools.swing.api.Component;
37 34
import org.gvsig.tools.swing.api.windowmanager.WindowManager.MODE;
38
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
39 35
import org.gvsig.tools.swing.api.ActionListenerSupport;
40 36

  
41 37
/**
......
64 60
    public Feature get(long index);
65 61
    
66 62
    public void setFeatures(List<FeatureReference> features);
63

  
64
    public Feature getCurrentFeature();
67 65
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.api/src/main/java/org/gvsig/featureform/swing/JFeaturesForm.java
24 24

  
25 25
import java.awt.Dimension;
26 26
import javax.swing.Action;
27
import org.gvsig.fmap.dal.StoresRepository;
28 27

  
29 28
import org.gvsig.fmap.dal.feature.Feature;
30 29

  
31 30
import org.gvsig.fmap.dal.feature.FeatureQuery;
32 31
import org.gvsig.fmap.dal.feature.FeatureStore;
33
import org.gvsig.fmap.dal.feature.FeatureType;
34
import org.gvsig.tools.dynform.JDynForm.DynFormContext;
35 32
import org.gvsig.tools.dynform.JDynFormSet;
36 33
import org.gvsig.tools.swing.api.Component;
37 34
import org.gvsig.tools.swing.api.windowmanager.WindowManager.MODE;
38
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
39 35
import org.gvsig.tools.swing.api.ActionListenerSupport;
40 36

  
41 37
/**
......
66 62
    
67 63
    public long getCurrentIndex();
68 64
    
65
    public Feature getCurrentFeature();
66
    
69 67
    public Feature get(long index);
70 68
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.api/src/main/java/org/gvsig/fmap/dal/swing/searchpanel/FeatureStoreSearchPanel.java
6 6
import org.gvsig.fmap.dal.feature.Feature;
7 7
import org.gvsig.fmap.dal.feature.FeatureQuery;
8 8
import org.gvsig.fmap.dal.feature.FeatureStore;
9
import org.gvsig.fmap.dal.feature.FeatureType;
9 10
import org.gvsig.tools.dispose.Disposable;
10 11
import org.gvsig.tools.swing.api.ActionListenerSupport;
11 12
import org.gvsig.tools.swing.api.Component;
13
import org.gvsig.tools.util.PropertiesSupport;
12 14

  
13 15
/**
14 16
 *
15 17
 * @author jjdelcerro
16 18
 */
17
public interface FeatureStoreSearchPanel extends  Component, ActionListenerSupport, Disposable {
19
public interface FeatureStoreSearchPanel extends  Component, ActionListenerSupport, Disposable, PropertiesSupport {
18 20
    
19 21
    public static final String CONFIGURABLE_PANEL_ID = "FeatureStoreSearchPanel";
20 22
    
......
32 34
    public void setEnabled(boolean enabled);
33 35
    
34 36
    public FeatureStore getStore();
35
    
37

  
38
    public FeatureType getFeatureType();
39

  
36 40
//    public FeatureQuery getQuery();
37 41
    
38 42
    public Feature getLastSelectedFeature();
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/feature/FeatureQuery.java
30 30
import java.util.List;
31 31
import java.util.Map;
32 32
import org.gvsig.expressionevaluator.Expression;
33
import org.gvsig.expressionevaluator.MutableSymbolTable;
34
import org.gvsig.expressionevaluator.SymbolTable;
33 35
import org.gvsig.fmap.dal.DataQuery;
34 36
import org.gvsig.tools.evaluator.Evaluator;
35 37
import org.gvsig.tools.lang.Cloneable;
......
317 319
      
318 320
  public FeatureExtraColumns getExtraColumn();
319 321

  
322
  public MutableSymbolTable getSymbolTable();
323
  
324
  public void setSymbolTable(MutableSymbolTable symbolTable);
325
    
326
  /**
327
   * Set a variable in the symbol table associated to this searchPanel.
328
   * 
329
   * @param name
330
   * @param value 
331
   */
332
  public void setVar(String name, Object value);
333
  
320 334
}
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
111 111

  
112 112
        Code code = compiler.compileExpression(source.toString());
113 113
        link(code);
114
        checkEquals("testSelect2", "BLOCK(LET('X', 0), FOREACH('row', SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL), IF((GETATTR(\"row\", 'LASTCENSUS') > 0), LET('X', (\"X\" + GETATTR(\"row\", 'LASTCENSUS'))))))", code.toString());
114
        checkEquals("testSelect2", "BLOCK(LET('X', 0), FOREACH('row', SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL), IF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
115 115
    }
116 116

  
117 117
    public void testSelect3() {
......
130 130

  
131 131
        Code code = compiler.compileExpression(source.toString());
132 132
        link(code);
133
        checkEquals("testSelect3", "BLOCK(LET('X', 0), FOREACH('row', SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL), IF((GETATTR(\"row\", 'LASTCENSUS') > 0), LET('X', (\"X\" + GETATTR(\"row\", 'LASTCENSUS'))))))", code.toString());
133
        checkEquals("testSelect3", "BLOCK(LET('X', 0), FOREACH('row', SELECT(TUPLE(), \"countries\", NULL, TUPLE(), TUPLE(), NULL), IF((\"row\".\"LASTCENSUS\" > 0), LET('X', (\"X\" + \"row\".\"LASTCENSUS\")))))", code.toString());
134 134
    }
135 135

  
136 136
    public void testSelectWhere() {
......
166 166

  
167 167
        Code code = compiler.compileExpression(source.toString());
168 168
        link(code);
169
        checkEquals("testSelectWhere2", "SELECT(TUPLE(), \"countries\", (GETATTR(\"countries\", 'LASTCENSUS') > 0), TUPLE(), TUPLE(), NULL)", code.toString());
169
        checkEquals("testSelectWhere2", "SELECT(TUPLE(), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL)", code.toString());
170 170
    }
171 171

  
172 172
    public void testSelectOrder() {
......
248 248
        String id = "????????????????????????????????";
249 249
        String s = code.toString();
250 250
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
251
        checkEquals("testExistsSelect1", "EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (GETATTR(\"countries\", 'LASTCENSUS') > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
251
        checkEquals("testExistsSelect1", "EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
252 252
    }
253 253

  
254 254
    public void testExistsSelect2() {
......
265 265
        String id = "????????????????????????????????";
266 266
        String s = code.toString();
267 267
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
268
        checkEquals("testExistsSelect2", "EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (GETATTR(\"countries\", 'LASTCENSUS') > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
268
        checkEquals("testExistsSelect2", "EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), NULL), 'EXISTS????????????????????????????????')", s);
269 269
    }
270 270

  
271 271
    public void testExistsSelectLimit1() {
......
283 283
        String id = "????????????????????????????????";
284 284
        String s = code.toString();
285 285
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
286
        checkEquals("testExistsSelectLimit1", "EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (GETATTR(\"countries\", 'LASTCENSUS') > 0), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
286
        checkEquals("testExistsSelectLimit1", "EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", (\"countries\".\"LASTCENSUS\" > 0), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
287 287
    }
288 288

  
289 289
    public void testExistsSelectLimit2() {
......
306 306
        String id = "????????????????????????????????";
307 307
        String s = code.toString();
308 308
        s = s.substring(0, s.length()-id.length()-2)+id+s.substring(s.length()-2);
309
        checkEquals("testExistsSelectLimit2", "EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", ((GETATTR(\"continents\", 'NAME') = GETATTR(\"countries\", 'CONTINENT')) AND (GETATTR(\"countries\", 'LASTCENSUS') < 0)), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
309
        checkEquals("testExistsSelectLimit2", "EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", ((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), TUPLE(), TUPLE(), 1), 'EXISTS????????????????????????????????')", s);
310 310
    }
311 311

  
312 312
    public void testExistsSelectLimit3() {
......
328 328

  
329 329
        Code code = compiler.compileExpression(source.toString());
330 330
        link(code);
331
        checkEquals("testExistsSelectLimit3", "EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", ((GETATTR(\"continents\", 'NAME') = GETATTR(\"countries\", 'CONTINENT')) AND (GETATTR(\"countries\", 'LASTCENSUS') < 0)), TUPLE(), TUPLE(), 1), 'patata')", code.toString());
331
        checkEquals("testExistsSelectLimit3", "EXISTS(SELECT(TUPLE(\"ISO_A2\"), \"countries\", ((\"continents\".\"NAME\" = \"countries\".\"CONTINENT\") AND (\"countries\".\"LASTCENSUS\" < 0)), TUPLE(), TUPLE(), 1), 'patata')", code.toString());
332 332
    }
333 333

  
334 334
}
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
95 95

  
96 96
        Code code = compiler.compileExpression(filter);
97 97
        link(code);
98
        assertEquals("EXISTS(SELECT(TUPLE(\"LID_ACCIDENTE\"), \"ARENA2_VEHICULOS\", ((GETATTR(\"ARENA2_VEHICULOS\", 'ID_ACCIDENTE') = GETATTR(\"ARENA2_ACCIDENTES\", 'LID_ACCIDENTE')) AND (\"MODELO\" = '307')), TUPLE(), TUPLE(), 1), 'EXISTS123')", code.toString());
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 99
    }
100 100
    
101 101
    public void testForeintValue1() {
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/feature/impl/DefaultFeatureQuery.java
27 27
import java.util.HashMap;
28 28
import java.util.List;
29 29
import java.util.Map;
30
import java.util.logging.Level;
30 31
import org.apache.commons.lang3.ArrayUtils;
31 32
import org.apache.commons.lang3.StringUtils;
32 33
import org.gvsig.expressionevaluator.Expression;
......
37 38
import org.gvsig.fmap.dal.exception.DataException;
38 39
import org.gvsig.fmap.dal.exception.InitializeException;
39 40
import org.gvsig.expressionevaluator.ExpressionEvaluator;
41
import org.gvsig.expressionevaluator.MutableSymbolTable;
40 42
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
41 43
import org.gvsig.fmap.dal.feature.FeatureQuery;
42 44
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
......
112 114
    
113 115
    private FeatureExtraColumns extraColumn = new DefaultFeatureExtraColumns();
114 116
    
117
    private MutableSymbolTable symbolTable;
118
    
115 119
    /**
116 120
     * Creates a FeatureQuery which will load all available Features of a type.
117 121
     *
......
350 354

  
351 355
    @Override
352 356
    public Evaluator getFilter() {
353
        return filter;
357
      if( this.filter instanceof ExpressionEvaluator ) {
358
        ExpressionEvaluator ee = (ExpressionEvaluator) this.filter;
359
        ee.addSymbolTable(symbolTable);
360
      }
361
      return filter;
354 362
    }
355 363

  
356 364
    @Override
357 365
    public Expression getExpressionFilter() {
358 366
      if( this.filter instanceof ExpressionEvaluator ) {
359
        return ((ExpressionEvaluator)this.filter).toExpression();
367
        ExpressionEvaluator ee = (ExpressionEvaluator) this.filter;
368
        ee.addSymbolTable(symbolTable);
369
        return ee.toExpression();
360 370
      }
361 371
      return null;
362 372
    }
......
516 526
        } else {
517 527
            clone.aggregateFunctions = null;
518 528
        }
529
        if( this.symbolTable!=null ) {
530
            clone.symbolTable = this.symbolTable.clone();
531
        }
519 532
        
520
        
521 533
        return clone;
522 534
    }
523 535

  
......
526 538
        try {
527 539
            return (FeatureQuery) clone();
528 540
        } catch (CloneNotSupportedException e) {
529
            // TODO Auto-generated catch block
530
            e.printStackTrace();
541
            LOGGER.debug("Can't clone feature query",e);
531 542
            return null;
532 543
        }
533 544
        // DefaultFeatureQuery aCopy = new DefaultFeatureQuery();
......
872 883
      this.aggregateFunctions=null;
873 884
    }
874 885
    this.extraColumn.copyFrom(other.extraColumn);
886
    if( other.symbolTable!=null ) {
887
        try {
888
            this.symbolTable = other.symbolTable.clone();
889
        } catch (CloneNotSupportedException ex) {
890
            LOGGER.debug("Can't clone symbol table",ex);
891
        }
892
    }
875 893
  }
876 894

  
877
  public FeatureExtraColumns getExtraColumn() {
878
      return this.extraColumn;
879
  }
880
  
895
    @Override
896
    public FeatureExtraColumns getExtraColumn() {
897
        return this.extraColumn;
898
    }
899

  
900
    @Override
901
    public MutableSymbolTable getSymbolTable() {
902
        return symbolTable;
903
    }
904

  
905
    @Override
906
    public void setSymbolTable(MutableSymbolTable symbolTable) {
907
        this.symbolTable = symbolTable;
908
    }
909

  
910
    @Override
911
    public void setVar(String name, Object value) {
912
        if( this.symbolTable==null ) {
913
            this.symbolTable = ExpressionUtils.createSymbolTable();
914
        }
915
        this.symbolTable.setVar(name, value);
916
    }
917

  
918
    
881 919
}
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/expressionevaluator/DefaultFeatureExpressionEvaluator.java
13 13
import org.gvsig.expressionevaluator.impl.symboltable.FeatureSymbolTableImpl;
14 14
import org.gvsig.expressionevaluator.ExpressionEvaluator;
15 15
import org.gvsig.expressionevaluator.impl.DefaultExpression;
16
import org.gvsig.expressionevaluator.spi.BaseExpressionEvaluator;
17 16
import org.gvsig.fmap.dal.expressionevaluator.FeatureSymbolTable;
18 17
import org.gvsig.fmap.dal.feature.Feature;
19 18
import org.gvsig.tools.ToolsLocator;
......
224 223
        }
225 224
    }
226 225

  
226
    @Override
227
    public void addSymbolTable(SymbolTable symbolTable) {
228
        if( symbolTable!=null ) {
229
            this.symbolTable.addSymbolTable(symbolTable);
230
        }
231
    }
232

  
227 233
}
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/OperationsFactory.java
138 138
            FeatureType featureType,
139 139
            TableReference table,
140 140
            String baseFilter,
141
            String filtersql
141
            FeatureQuery query
142 142
    );
143 143

  
144 144
    public ResultSetForSetProviderOperation createResultSetForSetProvider(
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/JDBCSQLBuilderBase.java
64 64

  
65 65
    public static final String PROP_FEATURE_TYPE = "FeatureType";
66 66
    public static final String PROP_TABLE = "Table";
67
    public static final String PROP_SYMBOLTABLE = "SymbolTable";
68
    public static final String PROP_JDBCHELPER = "JDBCHelper";
67 69
    
68 70
    private GeometryManager geometryManager = null;
69 71
    protected final JDBCHelper helper;
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/$$Constant.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
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff