Revision 43532
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