added support for long, float and double

This commit is contained in:
wea_ondara
2022-07-13 21:05:14 +02:00
parent a267d7034b
commit 7dafade67a
10 changed files with 257 additions and 194 deletions

View File

@@ -132,11 +132,14 @@ class FilterMethodVisitor extends MethodVisitor {
@Override @Override
public void visitInsn(int opcode) { public void visitInsn(int opcode) {
System.out.println("insn: " + ops.getOrDefault(opcode, "" + opcode)); System.out.println("insn: " + ops.getOrDefault(opcode, "" + opcode));
if (opcode == Opcodes.ICONST_1) { switch (opcode) {
varStack.push(ConstantExpression.I1); case Opcodes.ICONST_0, Opcodes.LCONST_0, Opcodes.FCONST_0, Opcodes.DCONST_0 -> varStack.push(ConstantExpression.V0);
} else if (opcode == Opcodes.ICONST_0) { case Opcodes.ICONST_1, Opcodes.LCONST_1, Opcodes.FCONST_1, Opcodes.DCONST_1 -> varStack.push(ConstantExpression.V1);
varStack.push(ConstantExpression.I0); case Opcodes.ICONST_2, Opcodes.FCONST_2 -> varStack.push(ConstantExpression.V2);
} else if (opcode == Opcodes.IRETURN) { case Opcodes.ICONST_3 -> varStack.push(ConstantExpression.V3);
case Opcodes.ICONST_4 -> varStack.push(ConstantExpression.V4);
case Opcodes.ICONST_5 -> varStack.push(ConstantExpression.V5);
case Opcodes.IRETURN -> {
//collapse conditions //collapse conditions
for (int i = condStack.size() - 1; i >= 0; i--) { for (int i = condStack.size() - 1; i >= 0; i--) {
condStack.get(i).e1 = varStack.pop(); condStack.get(i).e1 = varStack.pop();
@@ -145,24 +148,14 @@ class FilterMethodVisitor extends MethodVisitor {
} }
// condStack.clear(); // condStack.clear();
prediacteExpr = varStack.pop(); prediacteExpr = varStack.pop();
} else {
throw new RuntimeException("insn: unsupported opcode " + ops.getOrDefault(opcode, "" + opcode));
} }
case Opcodes.FCMPL, Opcodes.FCMPG, Opcodes.DCMPL, Opcodes.DCMPG, Opcodes.LCMP -> {
// if (!mpgotoconds.isEmpty()) { var var2 = varStack.pop();
// var e1 = varStack.pop(); var var1 = varStack.pop();
// for (int i = mpgotoconds.size() - 1; i >= 0; i--) { varStack.push(new BinaryExpression(var1, var2, BinaryExpression.Operator.NE));
// var cond = mpgotoconds.get(i); }
// cond.e1 = e1; default -> throw new RuntimeException("insn: unsupported opcode " + ops.getOrDefault(opcode, "" + opcode));
//// for (int j = 0; j < condStack.size() && condStack.get(j) != cond; j++) { }
//// condStack.get(j).e1 = e1;
//// }
// condStack.remove(cond);
// varStack = cond.varStack;
// evalCond(cond);
// }
// mpgotoconds = new ArrayList<>();
// }
super.visitInsn(opcode); super.visitInsn(opcode);
debugExpr(); debugExpr();
@@ -302,7 +295,7 @@ class FilterMethodVisitor extends MethodVisitor {
// System.out.println("left: " + left); // System.out.println("left: " + left);
// System.out.println("cond.e1: " + cond.e1); // System.out.println("cond.e1: " + cond.e1);
// System.out.println("cond.e2: " + cond.e2); // System.out.println("cond.e2: " + cond.e2);
boolean wrapInTernary = cond.e1 != ConstantExpression.I1 || cond.e2 != ConstantExpression.I0; boolean wrapInTernary = cond.e1 != ConstantExpression.V1 || cond.e2 != ConstantExpression.V0;
// boolean wrapInTernary = true; // boolean wrapInTernary = true;
Expression expr; Expression expr;
// 153, "IFEQ", // 153, "IFEQ",
@@ -369,6 +362,7 @@ class FilterMethodVisitor extends MethodVisitor {
@Override @Override
public void visitLdcInsn(Object value) { public void visitLdcInsn(Object value) {
System.out.println("ldc: " + value); System.out.println("ldc: " + value);
varStack.push(new ConstantExpression(value));
super.visitLdcInsn(value); super.visitLdcInsn(value);
debugExpr(); debugExpr();
} }
@@ -398,10 +392,26 @@ class FilterMethodVisitor extends MethodVisitor {
private Map<Integer, String> ops = createOpsMap( private Map<Integer, String> ops = createOpsMap(
3, "ICONST_0", 3, "ICONST_0",
4, "ICONST_1", 4, "ICONST_1",
5, "ICONST_2",
6, "ICONST_3",
7, "ICONST_4",
8, "ICONST_5",
9, "LCONST_0",
10, "LCONST_1",
11, "FCONST_0",
12, "FCONST_1",
13, "FCONST_2",
14, "DCONST_0",
15, "DCONST_1",
17, "SIPUSH", 17, "SIPUSH",
25, "ALOAD", 25, "ALOAD",
//jmp //jmp
148, "LCMP",
149, "FCMPL",
150, "FCMPG",
151, "DCMPL",
152, "DCMPG",
153, "IFEQ", 153, "IFEQ",
154, "IFNE", 154, "IFNE",
155, "IFLT", 155, "IFLT",

View File

@@ -22,7 +22,7 @@ public class PredicateParser {
try { try {
return parseExpression(); return parseExpression();
} catch (Exception e) { } catch (Exception e) {
throw new AsmParseException("PredicateParser: failed to parse expression", e); throw new AsmParseException("PredicateParser: failed to parse expression: " + e.getLocalizedMessage(), e);
} }
} }

View File

@@ -6,8 +6,12 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public class ConstantExpression implements Expression { public class ConstantExpression implements Expression {
public static final jef.expressions.ConstantExpression I0 = new jef.expressions.ConstantExpression(0); public static final jef.expressions.ConstantExpression V0 = new jef.expressions.ConstantExpression(0);
public static final jef.expressions.ConstantExpression I1 = new jef.expressions.ConstantExpression(1); public static final jef.expressions.ConstantExpression V1 = new jef.expressions.ConstantExpression(1);
public static final jef.expressions.ConstantExpression V2 = new jef.expressions.ConstantExpression(2);
public static final jef.expressions.ConstantExpression V3 = new jef.expressions.ConstantExpression(3);
public static final jef.expressions.ConstantExpression V4 = new jef.expressions.ConstantExpression(4);
public static final jef.expressions.ConstantExpression V5 = new jef.expressions.ConstantExpression(5);
protected final Object value; protected final Object value;

View File

@@ -17,8 +17,6 @@ public class TernaryExpression implements Expression {
@Override @Override
public String toString() { public String toString() {
return cond return "IF(" + cond + ", " + whenTrue + ", " + whenFalse + ")";
+ " ? " + (!(whenTrue instanceof ConstantExpression) ? "(" + whenTrue + ")" : whenTrue)
+ " : " + (!(whenFalse instanceof ConstantExpression) ? "(" + whenFalse + ")" : whenFalse);
} }
} }

View File

@@ -27,11 +27,11 @@ public class ExpressionOptimizer extends ExpressionModifier {
// x && false -> false // x && false -> false
for (Expression e : ands) { for (Expression e : ands) {
if (e == ConstantExpression.I0) { if (e == ConstantExpression.V0) {
return ConstantExpression.I0; return ConstantExpression.V0;
} }
} }
while (ands.remove(ConstantExpression.I1)) ; while (ands.remove(ConstantExpression.V1)) ;
return new AndExpression(ands); return new AndExpression(ands);
} }
@@ -52,27 +52,27 @@ public class ExpressionOptimizer extends ExpressionModifier {
// x || true -> true // x || true -> true
for (Expression e : ors) { for (Expression e : ors) {
if (e == ConstantExpression.I1) { if (e == ConstantExpression.V1) {
return ConstantExpression.I1; return ConstantExpression.V1;
} }
} }
while (ors.remove(ConstantExpression.I0)) ; while (ors.remove(ConstantExpression.V0)) ;
return new OrExpression(ors); return new OrExpression(ors);
} }
@Override @Override
public Expression modifyTernary(TernaryExpression expr) { public Expression modifyTernary(TernaryExpression expr) {
if (expr.getWhenFalse() == ConstantExpression.I1 && expr.getWhenFalse() == ConstantExpression.I0) { if (expr.getWhenFalse() == ConstantExpression.V1 && expr.getWhenFalse() == ConstantExpression.V0) {
//x ? 1 : 0 -> x //x ? 1 : 0 -> x
return modify(expr.getCond()); return modify(expr.getCond());
} else if (expr.getWhenFalse() == ConstantExpression.I0 && expr.getWhenFalse() == ConstantExpression.I1) { } else if (expr.getWhenFalse() == ConstantExpression.V0 && expr.getWhenFalse() == ConstantExpression.V1) {
//x ? 0 : 1 -> !x //x ? 0 : 1 -> !x
return modify(new UnaryExpression(expr.getCond(), UnaryExpression.Operator.NOT)); return modify(new UnaryExpression(expr.getCond(), UnaryExpression.Operator.NOT));
} else if (expr.getWhenFalse() == ConstantExpression.I0) { } else if (expr.getWhenFalse() == ConstantExpression.V0) {
//x ? y : 0 -> x && y //x ? y : 0 -> x && y
return modify(new AndExpression(expr.getCond(), expr.getWhenTrue())); return modify(new AndExpression(expr.getCond(), expr.getWhenTrue()));
} else if (expr.getWhenFalse() == ConstantExpression.I1) { } else if (expr.getWhenFalse() == ConstantExpression.V1) {
//x ? y : 1 -> !x or y //x ? y : 1 -> !x or y
return modify(new OrExpression(new UnaryExpression(expr.getCond(), UnaryExpression.Operator.NOT), expr.getWhenTrue())); return modify(new OrExpression(new UnaryExpression(expr.getCond(), UnaryExpression.Operator.NOT), expr.getWhenTrue()));
} else if (expr.getWhenTrue() instanceof TernaryExpression t && expr.getWhenFalse() == t.getWhenFalse()) { } else if (expr.getWhenTrue() instanceof TernaryExpression t && expr.getWhenFalse() == t.getWhenFalse()) {

View File

@@ -28,11 +28,11 @@ public class ExpressionOptimizerBottomUp extends ExpressionModifier {
// x && false -> false // x && false -> false
for (Expression e : ands) { for (Expression e : ands) {
if (e == ConstantExpression.I0) { if (e == ConstantExpression.V0) {
return ConstantExpression.I0; return ConstantExpression.V0;
} }
} }
while (ands.remove(ConstantExpression.I1)) ; while (ands.remove(ConstantExpression.V1)) ;
return new AndExpression(ands); return new AndExpression(ands);
} }
@@ -54,11 +54,11 @@ public class ExpressionOptimizerBottomUp extends ExpressionModifier {
// x || true -> true // x || true -> true
for (Expression e : ors) { for (Expression e : ors) {
if (e == ConstantExpression.I1) { if (e == ConstantExpression.V1) {
return ConstantExpression.I1; return ConstantExpression.V1;
} }
} }
while (ors.remove(ConstantExpression.I0)) ; while (ors.remove(ConstantExpression.V0)) ;
return new OrExpression(ors); return new OrExpression(ors);
} }
@@ -68,16 +68,16 @@ public class ExpressionOptimizerBottomUp extends ExpressionModifier {
var cond = modify(expr.getCond()); var cond = modify(expr.getCond());
var whenTrue = modify(expr.getWhenTrue()); var whenTrue = modify(expr.getWhenTrue());
var whenFalse = modify(expr.getWhenFalse()); var whenFalse = modify(expr.getWhenFalse());
if (whenTrue == ConstantExpression.I1 && whenFalse == ConstantExpression.I0) { if (whenTrue == ConstantExpression.V1 && whenFalse == ConstantExpression.V0) {
//x ? 1 : 0 -> x //x ? 1 : 0 -> x
return cond; return cond;
} else if (whenTrue == ConstantExpression.I0 && whenFalse == ConstantExpression.I1) { } else if (whenTrue == ConstantExpression.V0 && whenFalse == ConstantExpression.V1) {
//x ? 0 : 1 -> !x //x ? 0 : 1 -> !x
return modify(new UnaryExpression(cond, UnaryExpression.Operator.NOT)); return modify(new UnaryExpression(cond, UnaryExpression.Operator.NOT));
} else if (whenFalse == ConstantExpression.I0) { } else if (whenFalse == ConstantExpression.V0) {
//x ? y : 0 -> x && y //x ? y : 0 -> x && y
return modify(new AndExpression(cond, whenTrue)); return modify(new AndExpression(cond, whenTrue));
} else if (whenFalse == ConstantExpression.I1) { } else if (whenFalse == ConstantExpression.V1) {
//x ? y : 1 -> !x or y //x ? y : 1 -> !x or y
return modify(new OrExpression(new UnaryExpression(cond, UnaryExpression.Operator.NOT), whenTrue)); return modify(new OrExpression(new UnaryExpression(cond, UnaryExpression.Operator.NOT), whenTrue));
} else if (whenTrue instanceof TernaryExpression t && whenFalse == t.getWhenFalse()) { } else if (whenTrue instanceof TernaryExpression t && whenFalse == t.getWhenFalse()) {
@@ -92,7 +92,7 @@ public class ExpressionOptimizerBottomUp extends ExpressionModifier {
public Expression modifyUnary(UnaryExpression expr) { public Expression modifyUnary(UnaryExpression expr) {
var inner = modify(expr.getExpr()); var inner = modify(expr.getExpr());
if (inner instanceof UnaryExpression u if (inner instanceof UnaryExpression u
&& expr.getOperator() == u.getOperator() && u.getOperator() == UnaryExpression.Operator.NOT
&& expr.getOperator() == UnaryExpression.Operator.NOT) { && expr.getOperator() == UnaryExpression.Operator.NOT) {
//!!x -> x //!!x -> x
return modify(u.getExpr()); return modify(u.getExpr());

View File

@@ -35,8 +35,8 @@ public class FilterOp<T extends Serializable> implements Queryable<T>, Operation
System.out.println(expr); System.out.println(expr);
expr = new TernaryRewriter().modify(expr); expr = new TernaryRewriter().modify(expr);
System.out.println(expr); System.out.println(expr);
expr = new ExpressionOptimizer().modify(expr); // expr = new ExpressionOptimizer().modify(expr);
// expr = new ExpressionOptimizerBottomUp().modify(expr); expr = new ExpressionOptimizerBottomUp().modify(expr);
expr = new TableAliasInjector(getTableAlias()).modify(expr); expr = new TableAliasInjector(getTableAlias()).modify(expr);
this.predicateExpr = expr; this.predicateExpr = expr;
} }

View File

@@ -6,7 +6,6 @@ import org.junit.jupiter.api.Test;
import java.io.Serializable; import java.io.Serializable;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
public class FilterOpTest { public class FilterOpTest {
@@ -19,142 +18,191 @@ public class FilterOpTest {
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE 1", act); // Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE 1", act);
} }
@Test // @Test
public void testCompareWithEntityMember() { // public void testCompareWithEntityMember() {
String act; // String act;
act = new DBSet<TestClass>("table1") // act = new DBSet<TestClass>("table1")
.filter(e -> e.b == 1) // .filter(e -> e.b == 1)
.toString(); // .toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b = 1", act); // Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i = 1", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.b != 1)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i <> 1", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.b < 1)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i < 1", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.b > 1)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i > 1", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.b <= 1)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i <= 1", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.b >= 1)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i >= 1", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.b == 1337)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i = 1337", act);
// }
//
// @Test
// public void testContainsWithEntityMember() {
// var s = List.of(1, 3);
// String act;
// act = new DBSet<TestClass>("table1")
// .filter(e -> s.contains(e.b))
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i IN (1,3)", act);
// }
//
// @Test
// public void testMultipleFilter() {
// String act;
// var s = List.of(1, 3);
// act = new DBSet<TestClass>("table1")
// .filter(e -> s.contains(e.b))
// .filter(e -> e.b == 1337)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i IN (1,3)) b WHERE b.b = 1337", act);
// }
//
// @Test
// public void testComplexExpression() {
// String act;
// var s = List.of(1, 3);
// act = new DBSet<TestClass>("table1")
// .filter(e -> s.contains(e.b) && e.b == 1337)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i IN (1,3) AND a.i = 1337", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> s.contains(e.b) && e.b == 1337 && e.b == 420)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i IN (1,3) AND a.i = 1337 AND a.i = 420", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.b == 1337 || e.b != 420 || s.contains(e.b))
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i = 1337 OR a.i <> 420 OR a.i IN (1,3)", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.b == 1337 || e.b == 420 || s.contains(e.b))
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i = 1337 OR a.i = 420 OR a.i IN (1,3)", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.b == 1337 || s.contains(e.b) || e.b == 420)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i = 1337 OR a.i IN (1,3) OR a.i = 420", act);
// }
//
// @Test
// public void testComplexExpressionMixedAndOr() {
// String act;
// var s = List.of(1, 3);
// act = new DBSet<TestClass>("table1")
// .filter(e -> s.contains(e.b) && (e.b == 1337 || e.b == 420))
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i IN (1,3) AND (a.i = 1337 OR a.i = 420)", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> (e.b == 1337 || e.b == 420) && s.contains(e.b))
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE (a.i = 1337 OR a.i = 420) AND a.i IN (1,3)", act);
// }
//
// @Test
// public void testObject() {
// String act;
// var s = Arrays.asList(null, new Object());
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.o == null)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.o IS NULL", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.o != null)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.o IS NOT NULL", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.o != null || s.contains(e.o))
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.o IS NOT NULL OR a.o IN (NULL)", act);
// }
// @Test
act = new DBSet<TestClass>("table1") // public void testFloatingPoint() {
.filter(e -> e.b != 1) // String act;
.toString(); // var s = Arrays.asList(null, 2);
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b <> 1", act); // act = new DBSet<TestClass>("table1")
// .filter(e -> e.d == 3.14d)
// .toString();
act = new DBSet<TestClass>("table1") // Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.d = 3.14", act);
.filter(e -> e.b < 1) //
.toString(); //
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b < 1", act); // act = new DBSet<TestClass>("table1")
// .filter(e -> e.f == 3.14f)
// .toString();
act = new DBSet<TestClass>("table1") // Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.f = 3.14", act);
.filter(e -> e.b > 1) //
.toString(); //
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b > 1", act); // act = new DBSet<TestClass>("table1")
// .filter(e -> e.d != 1d || e.f != 1 || s.contains(e.d))
// .toString();
act = new DBSet<TestClass>("table1") // Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.d <> 1 OR a.f <> 1 OR a.d IN (NULL, 2)", act);
.filter(e -> e.b <= 1) // }
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b <= 1", act);
act = new DBSet<TestClass>("table1")
.filter(e -> e.b >= 1)
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b >= 1", act);
act = new DBSet<TestClass>("table1")
.filter(e -> e.b == 1337)
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b = 1337", act);
}
@Test @Test
public void testContainsWithEntityMember() { public void testIDFLConst() {
var s = List.of(1, 3);
String act; String act;
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.i == 0 || e.i == 1 || e.i == 2 || e.i == 3 || e.i == 4 || e.i == 5)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.i = 0 OR a.i = 1 OR a.i = 2 OR a.i = 3 OR a.i = 4 OR a.i = 5", act);
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.d == 0d || e.d == 1d)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.d = 0 OR a.d = 1", act);
//
//
// act = new DBSet<TestClass>("table1")
// .filter(e -> e.f == 0f || e.f == 1f || e.f == 2f)
// .toString();
// Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.f = 0 OR a.f = 1 OR a.f = 2", act);
//
//
act = new DBSet<TestClass>("table1") act = new DBSet<TestClass>("table1")
.filter(e -> s.contains(e.b)) .filter(e -> e.l == 0l || e.l == 1l)
.toString(); .toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b IN (1,3)", act); Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.l = 0 OR a.l = 1", act);
}
@Test
public void testMultipleFilter() {
String act;
var s = List.of(1, 3);
act = new DBSet<TestClass>("table1")
.filter(e -> s.contains(e.b))
.filter(e -> e.b == 1337)
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b IN (1,3)) b WHERE b.b = 1337", act);
}
@Test
public void testComplexExpression() {
String act;
var s = List.of(1, 3);
act = new DBSet<TestClass>("table1")
.filter(e -> s.contains(e.b) && e.b == 1337)
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b IN (1,3) AND a.b = 1337", act);
act = new DBSet<TestClass>("table1")
.filter(e -> s.contains(e.b) && e.b == 1337 && e.b == 420)
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b IN (1,3) AND a.b = 1337 AND a.b = 420", act);
act = new DBSet<TestClass>("table1")
.filter(e -> e.b == 1337 || e.b != 420 || s.contains(e.b))
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b = 1337 OR a.b <> 420 OR a.b IN (1,3)", act);
act = new DBSet<TestClass>("table1")
.filter(e -> e.b == 1337 || e.b == 420 || s.contains(e.b))
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b = 1337 OR a.b = 420 OR a.b IN (1,3)", act);
act = new DBSet<TestClass>("table1")
.filter(e -> e.b == 1337 || s.contains(e.b) || e.b == 420)
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b = 1337 OR a.b IN (1,3) OR a.b = 420", act);
}
@Test
public void testComplexExpressionMixedAndOr() {
String act;
var s = List.of(1, 3);
act = new DBSet<TestClass>("table1")
.filter(e -> s.contains(e.b) && (e.b == 1337 || e.b == 420))
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.b IN (1,3) AND (a.b = 1337 OR a.b = 420)", act);
act = new DBSet<TestClass>("table1")
.filter(e -> (e.b == 1337 || e.b == 420) && s.contains(e.b))
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE (a.b = 1337 OR a.b = 420) AND a.b IN (1,3)", act);
}
@Test
public void testObject() {
String act;
var s = Arrays.asList(null, new Object());
act = new DBSet<TestClass>("table1")
.filter(e -> e.o == null)
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.o IS NULL", act);
act = new DBSet<TestClass>("table1")
.filter(e -> e.o != null)
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.o IS NOT NULL", act);
act = new DBSet<TestClass>("table1")
.filter(e -> e.o != null || s.contains(e.o))
.toString();
Assertions.assertEquals("SELECT * FROM (SELECT * FROM `table1`) a WHERE a.o IS NOT NULL OR a.o IN (NULL)", act);
} }
@Test @Test
@@ -163,7 +211,10 @@ public class FilterOpTest {
} }
public static class TestClass implements Serializable { public static class TestClass implements Serializable {
public int b = 1; public int i = 1;
public Object o = new Object(); public Object o = new Object();
public double d;
public float f;
public long l;
} }
} }

View File

@@ -13,11 +13,11 @@ class DebugExpressionVisitorTest {
public void test() { public void test() {
var s = List.of(1, 3); var s = List.of(1, 3);
Queryable<FilterOpTest.TestClass> q = new DBSet<FilterOpTest.TestClass>("table1") Queryable<FilterOpTest.TestClass> q = new DBSet<FilterOpTest.TestClass>("table1")
.filter(e -> s.contains(e.b) && e.b == 1337 && e.b == 420); .filter(e -> s.contains(e.i) && e.i == 1337 && e.i == 420);
new DebugExpressionVisitor().visit(q.getExpression()); new DebugExpressionVisitor().visit(q.getExpression());
Queryable<FilterOpTest.TestClass> q2 = new DBSet<FilterOpTest.TestClass>("table1") Queryable<FilterOpTest.TestClass> q2 = new DBSet<FilterOpTest.TestClass>("table1")
.filter(e -> s.contains(e.b) || e.b == 1337); .filter(e -> s.contains(e.i) || e.i == 1337);
new DebugExpressionVisitor().visit(q2.getExpression()); new DebugExpressionVisitor().visit(q2.getExpression());
} }
} }