From d4969b5a1e375145e5ca399be7fe9cb6b59f39e5 Mon Sep 17 00:00:00 2001 From: "Brian S. O'Neill" Date: Sun, 20 May 2007 00:24:06 +0000 Subject: Merged in covering index optimization. --- .../carbonado/qe/TestUnionQueryAnalyzer.java | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src/test/java/com/amazon/carbonado/qe/TestUnionQueryAnalyzer.java') diff --git a/src/test/java/com/amazon/carbonado/qe/TestUnionQueryAnalyzer.java b/src/test/java/com/amazon/carbonado/qe/TestUnionQueryAnalyzer.java index 21d0b0c..69a0aa4 100644 --- a/src/test/java/com/amazon/carbonado/qe/TestUnionQueryAnalyzer.java +++ b/src/test/java/com/amazon/carbonado/qe/TestUnionQueryAnalyzer.java @@ -37,6 +37,7 @@ import com.amazon.carbonado.repo.toy.ToyRepository; import com.amazon.carbonado.stored.Address; import com.amazon.carbonado.stored.Order; +import com.amazon.carbonado.stored.OverIndexedUserAddress; import com.amazon.carbonado.stored.Shipment; import com.amazon.carbonado.stored.Shipper; import com.amazon.carbonado.stored.StorableTestBasic; @@ -285,6 +286,42 @@ public class TestUnionQueryAnalyzer extends TestCase { res_0.getRemainderFilter().unbind()); } + public void testSimpleCoveringMerge() throws Exception { + // Because query has an 'or' operation, the analyzer will initially + // split this into a union. After futher analysis, it should decide + // that this offers no benefit and will merge them back. + UnionQueryAnalyzer uqa = + new UnionQueryAnalyzer(OverIndexedUserAddress.class, + TestIndexedQueryAnalyzer.RepoAccess.INSTANCE); + Filter filter = Filter.filterFor + (OverIndexedUserAddress.class, + "city = ? & (city = ? | line1 = ?)"); + filter = filter.bind(); + UnionQueryAnalyzer.Result result = uqa.analyze(filter, null); + List.Result> subResults = + result.getSubResults(); + + assertEquals(1, subResults.size()); + IndexedQueryAnalyzer.Result res_0 = subResults.get(0); + + assertTrue(res_0.handlesAnything()); + assertEquals(Filter.filterFor(OverIndexedUserAddress.class, "city = ?").bind(), + res_0.getCompositeScore().getFilteringScore().getIdentityFilter()); + assertEquals(makeIndex(OverIndexedUserAddress.class, + "city", "state", "country", "line1", "line2"), + res_0.getLocalIndex()); + assertEquals(null, res_0.getForeignIndex()); + assertEquals(null, res_0.getForeignProperty()); + assertEquals(0, res_0.getRemainderOrdering().size()); + assertEquals(Filter.filterFor(OverIndexedUserAddress.class, "city = ? | line1 = ?"), + res_0.getRemainderFilter().unbind()); + + Filter covering = + res_0.getCompositeScore().getFilteringScore().getCoveringFilter(); + assertEquals(Filter.filterFor(OverIndexedUserAddress.class, "city = ? | line1 = ?"), + covering.unbind()); + } + public void testFullScan() throws Exception { // Because no indexes were selected, there's no union to perform. UnionQueryAnalyzer uqa = -- cgit v1.2.3