Revision 43532

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/test/java/org/gvsig/expresionevaluator/impl/TestInterpreter.java
263 263
        interpreter.setAccuracy(0.0000001);
264 264
        v = interpreter.run(code);
265 265
        assertEquals(true, ((Boolean)v).booleanValue());
266
    }
267
    
268
}
266
    }    
267

  
268
    public void test2fields() {
269
        String source = "[1990] = [precio]";
270

  
271
        SymbolTable symbolTable = createSymbolTable();
272
        Compiler compiler = createCompiler();
273
        Interpreter interpreter = createInterpreter(symbolTable);
274
        
275
        Code code = compiler.compileExpression(source);
276
        Object v = interpreter.run(code);
277
        assertEquals(false, ((Boolean)v).booleanValue());
278
    }}
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
212 212
        Code code = compiler.compileExpression(source);
213 213
        assertEquals("=([1990], 0.168873933773767)", code.toString());
214 214
    }
215

  
216
    public void test2fields() {
217
        String source = "[1990] = [precio]";
218

  
219
        Compiler compiler = createCompiler();
220
        
221
        Code code = compiler.compileExpression(source);
222
        assertEquals("=([1990], [precio])", code.toString());
223
    }
215 224
    
216 225
}
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/operator/RegExpOperator.java
1
package org.gvsig.expressionevaluator.impl.function.operator;
2

  
3
import java.util.Objects;
4
import java.util.regex.Matcher;
5
import java.util.regex.Pattern;
6
import org.gvsig.expressionevaluator.Function;
7
import org.gvsig.expressionevaluator.Interpreter;
8

  
9
public class RegExpOperator extends AbstractBinaryOperator {
10

  
11
    public RegExpOperator() {
12
        super(Function.GROUP_BOOLEAN, "~");      
13
    }
14

  
15
    @Override
16
    public Object call(Interpreter interpreter, Object op1, Object op2) { 
17
        String re = Objects.toString(op2, "");
18
        Pattern exp = (Pattern) interpreter.getCache().get(this.getClass(), re);
19
        if( exp == null ) {
20
            exp = Pattern.compile(re);
21
            interpreter.getCache().put(this.getClass(), re, exp);
22
        } 
23
        Matcher m = exp.matcher(Objects.toString(op1,""));
24
        if( m == null ) {
25
            return false;
26
        }
27
        return m.matches();
28
    }
29
    
30
}
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
356 356
    }
357 357

  
358 358
    @Override
359
    public Code regexp(Code op1, Code op2) {
360
        return operator("~", op1, op2);
361
    }
362

  
363
    @Override
359 364
    public Code lt(Code op1, Code op2) {
360 365
        return operator("<", op1, op2);
361 366
    }
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/SQLLexicalAnalyzer.java
30 30
        case EOF:
31 31
            token.set(Token.EOF, null, null);
32 32
            return token;
33
        case '~':
34
            token.set(Token.OP_REGEXP, "~");
35
            return token;
33 36
        case '*':
34 37
            token.set(Token.OP_MULT, "*");
35 38
            return token;
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/DefaultInterpreter.java
1 1
package org.gvsig.expressionevaluator.impl;
2 2

  
3
import java.util.ArrayList;
4
import java.util.Comparator;
5
import java.util.Date;
6
import java.util.HashMap;
7
import java.util.List;
8
import java.util.Map;
9
import org.apache.commons.lang3.tuple.Pair;
3 10
import org.gvsig.expressionevaluator.SymbolTable;
4 11
import org.gvsig.expressionevaluator.Interpreter;
5 12
import org.gvsig.expressionevaluator.Code;
......
13 20

  
14 21
public class DefaultInterpreter implements Interpreter {
15 22

  
23
    private class DefaultCache implements Cache {
24
        
25
        private Map<Pair<Object,Object>,Pair<Object,Long>> data;
26
        
27
        public DefaultCache() {
28
            this.data = new  HashMap<>();
29
        }
30
        
31
        @Override
32
        public Object get(Object context, Object key) {
33
            Pair<Object, Long> v = this.data.get( Pair.of(context, key) );
34
            return v.getLeft();
35
        }
36

  
37
        @Override
38
        public void put(Object context, Object key, Object value) {
39
            if( this.data.size()>this.getMaxElements() ) {
40
                this.reduce();
41
            }
42
            this.data.put(Pair.of(context, key), Pair.of(value, new Date().getTime()));
43
        }
44

  
45
        @Override
46
        public void remove(Object context, Object key) {
47
            this.data.remove(Pair.of(context, key));
48
        }
49

  
50
        @Override
51
        public void removeAll() {
52
            this.data = new  HashMap<>();
53
        }
54

  
55
        private int getMaxElements() {
56
            return 100;
57
        }
58

  
59
        private void reduce() {
60
            List<Map.Entry<Pair<Object, Object>, Pair<Object, Long>>> entries = 
61
                new ArrayList<>(this.data.entrySet());
62
            entries.sort(new Comparator<Map.Entry<Pair<Object, Object>, Pair<Object, Long>>>() {
63
                @Override
64
                public int compare(Map.Entry<Pair<Object, Object>, Pair<Object, Long>> o1, Map.Entry<Pair<Object, Object>, Pair<Object, Long>> o2) {
65
                    return o1.getValue().getRight().compareTo(o2.getValue().getRight());
66
                }
67
            });
68
            for( int i=0; i<this.getMaxElements()/2; i++ ) {
69
                this.data.remove(entries.get(i).getKey());
70
            }
71
        }
72
        
73
    }
74
    
16 75
    private SymbolTable symbolTable = null;
17 76
    private Double accuracy;
18 77
    private Code currentCode;
78
    private final Cache cache;
19 79

  
20 80
    public DefaultInterpreter() {
21 81
        this.symbolTable = SQLSymbolTable.getInstance();
82
        this.cache = new DefaultCache();
22 83
    }
23 84

  
24 85
    @Override
86
    public Cache getCache() {
87
        return this.cache;
88
    }
89

  
90
    @Override
25 91
    public void setSymbolTable(SymbolTable symbolTable) {
26 92
        this.symbolTable = symbolTable;
27 93
    }
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/DefaultCompiler.java
11 11

  
12 12
    private LexicalAnalyzer lexer;
13 13
    private CodeBuilder codeBuilder;
14
    //
15
    // https://www.postgresql.org/docs/9.1/static/functions.html
16
    //
14 17

  
15 18
    public DefaultCompiler() {
16 19
        this.lexer = new SQLLexicalAnalyzer();
......
123 126
                lexer.next();
124 127
                op1 = codeBuilder.is(op1, codeBuilder.constant(null));
125 128
                break;
129
            case Token.OP_REGEXP:
130
                lexer.next();
131
                op2 = parse_sum();
132
                op1 = codeBuilder.regexp(op1, op2);
133
                break;
126 134
            case Token.PRED_LIKE:
127 135
                lexer.next();
128 136
                op2 = parse_sum();
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/CodeBuilder.java
39 39

  
40 40
    Code ilike(Code op1, Code op2);
41 41

  
42
    Code regexp(Code op1, Code op2);
43

  
42 44
    Code lt(Code op1, Code op2);
43 45

  
44 46
    Code gt(Code op1, Code op2);
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/Interpreter.java
2 2

  
3 3
public interface Interpreter {
4 4

  
5
    public interface Cache {
6
        
7
        public Object get(Object context, Object key);
8
        
9
        public void put(Object context, Object key, Object value);
10
        
11
        public void remove(Object context, Object key);
12
        
13
        public void removeAll();
14
    }
15
    
5 16
    public void setSymbolTable(SymbolTable symbolTable);
6 17

  
7 18
    public SymbolTable getSymbolTable();
......
15 26
    public void setAccuracy(Double accuracy);
16 27
    
17 28
    public Code getCurrentCode();
29
    
30
    public Cache getCache();
18 31
}
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/LexicalAnalyzer.java
18 18
        public static final int OP_MULT = 12;
19 19
        public static final int OP_DIV = 13;
20 20
        public static final int OP_MOD = 14;
21
//        public static final int OP_POW = 15;
21
        public static final int OP_REGEXP = 15;
22 22
        public static final int OP_LT = 16;
23 23
        public static final int OP_GT = 17;
24 24
        public static final int OP_LE = 18;

Also available in: Unified diff