FilterPreProcessor { public static QueryTreeNode optimize(QueryTreeNode qtn, boolean typeConvert) throws QueryException { qtn = preProcess(qtn, typeConvert); return qtn; }  static QueryTreeNode optimize(QueryTreeNode qtn, boolean typeConvert);  }
@Test public void test_路径短化_永真() { TableNode table = new TableNode("TABLE1"); table.query("1=1 AND ID = 1"); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "TABLE1.ID = 1"); }
@Test public void test_路径短化_永真_多路() { TableNode table = new TableNode("TABLE1"); table.query("(ID = 1 AND NAME = 'HELLO') OR (1=1) "); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "1"); }
@Test public void test_路径短化_永假() { TableNode table = new TableNode("TABLE1"); table.query("0=1 AND ID = 1"); table.build(); try { FilterPreProcessor.optimize(table, true); Assert.fail(); } catch (EmptyResultFilterException e) { } }
@Test public void test_路径短化_永假_多路() { TableNode table = new TableNode("TABLE1"); table.query("(ID = 1 AND NAME = 'HELLO') OR (0=1) "); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "(TABLE1.ID = 1 AND TABLE1.NAME = HELLO)"); }
@Test public void test_路径短化_组合() { TableNode table = new TableNode("TABLE1"); table.query("(1 = 1 AND (ID = 1 OR ID = 2) AND NAME = 'HELLO') OR (0=1 AND 1=1) OR (ID = 3)"); table.build(); FilterPreProcessor.optimize(table, true); System.out.println(FilterUtils.toDNFAndFlat(table.getWhereFilter())); Assert.assertEquals(table.getWhereFilter().toString(), "((TABLE1.ID = 1 AND TABLE1.NAME = HELLO) OR (TABLE1.ID = 2 AND TABLE1.NAME = HELLO) OR TABLE1.ID = 3)"); }
@Test public void test_列调整_常量() { TableNode table = new TableNode("TABLE1"); table.query("1 = ID AND NAME = 'HELLO'"); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "(TABLE1.ID = 1 AND TABLE1.NAME = HELLO)"); }
@Test public void test_列调整_列值() { TableNode table = new TableNode("TABLE1"); table.query("ID = NAME AND 'HELLO'= NAME AND NAME = ID "); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "(TABLE1.ID = TABLE1.NAME AND TABLE1.NAME = TABLE1.ID AND TABLE1.NAME = HELLO)"); }
@Test public void test_列调整_函数() { TableNode table = new TableNode("TABLE1"); table.query("2 = ID+1"); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "ID + 1 = 2"); }
@Test public void test_列调整_各种组合() { TableNode table = new TableNode("TABLE1"); table.query("HEX(2) = ID+1 AND NAME = HEX(NAME)"); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "(HEX(2) = ID + 1 AND TABLE1.NAME = HEX(NAME))"); }
@Test public void test_合并_AND条件() { TableNode table = new TableNode("TABLE1"); table.query("ID > 1 AND ID < 10"); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "(TABLE1.ID > 1 AND TABLE1.ID < 10)"); table.query("ID > 1 AND ID < 10 AND ID >= 2 AND ID < 11"); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "(TABLE1.ID >= 2 AND TABLE1.ID < 10)"); table.query("ID > 1 AND ID < 0"); table.build(); try { FilterPreProcessor.optimize(table, true); Assert.fail(); } catch (EmptyResultFilterException e) { } }
@Test public void test_合并_OR条件() { TableNode table = new TableNode("TABLE1"); table.query("ID > 1 OR ID < 3"); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "1"); table.query("ID > 1 OR ID > 3"); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "TABLE1.ID > 1"); table.query("ID > 1 OR ID = 5"); table.build(); FilterPreProcessor.optimize(table, true); Assert.assertEquals(table.getWhereFilter().toString(), "TABLE1.ID > 1"); }