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/repo/indexed/TestCoveringIndex.java | 172 +++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 src/test/java/com/amazon/carbonado/repo/indexed/TestCoveringIndex.java (limited to 'src/test/java/com/amazon/carbonado/repo') diff --git a/src/test/java/com/amazon/carbonado/repo/indexed/TestCoveringIndex.java b/src/test/java/com/amazon/carbonado/repo/indexed/TestCoveringIndex.java new file mode 100644 index 0000000..2c2007a --- /dev/null +++ b/src/test/java/com/amazon/carbonado/repo/indexed/TestCoveringIndex.java @@ -0,0 +1,172 @@ +/* + * Copyright 2007 Amazon Technologies, Inc. or its affiliates. + * Amazon, Amazon.com and Carbonado are trademarks or registered trademarks + * of Amazon Technologies, Inc. or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.amazon.carbonado.repo.indexed; + +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import com.amazon.carbonado.Query; +import com.amazon.carbonado.Repository; +import com.amazon.carbonado.Storage; + +import com.amazon.carbonado.TestUtilities; +import com.amazon.carbonado.stored.OverIndexedUserAddress; + +/** + * + * + * @author Brian S O'Neill + */ +public class TestCoveringIndex extends TestCase { + public static void main(String[] args) { + junit.textui.TestRunner.run(suite()); + } + + public static TestSuite suite() { + return new TestSuite(TestCoveringIndex.class); + } + + private Repository mRepository; + + public TestCoveringIndex(String name) { + super(name); + } + + protected void setUp() throws Exception { + super.setUp(); + mRepository = TestUtilities.buildTempRepository("indexed"); + } + + protected void tearDown() throws Exception { + super.tearDown(); + mRepository.close(); + mRepository = null; + } + + public void testFullCoverage() throws Exception { + assertTrue(mRepository instanceof IndexedRepository); + + Storage storage = + mRepository.storageFor(OverIndexedUserAddress.class); + + Query query = + storage.query("country > ? & city != ? & state = ? & postalCode = ?"); + + StringBuffer buf = new StringBuffer(); + query.printPlan(buf); + String plan = buf.toString(); + + String expected = + "filter: postalCode = ?\n" + + " index scan: com.amazon.carbonado.stored.OverIndexedUserAddress\n" + + " ...index: {properties=[+state, +city, +country, +line2, +line1, ~addressID], unique=true}\n" + + " ...identity filter: state = ?\n" + + " ...covering filter: country > ? & city != ?"; + + //System.out.println(plan); + assertEquals(expected, plan); + + query = query.withValues("D", "Springfield", "Unknown", "12345"); + + buf = new StringBuffer(); + query.printPlan(buf); + plan = buf.toString(); + + expected = + "filter: postalCode = 12345\n" + + " index scan: com.amazon.carbonado.stored.OverIndexedUserAddress\n" + + " ...index: {properties=[+state, +city, +country, +line2, +line1, ~addressID], unique=true}\n" + + " ...identity filter: state = Unknown\n" + + " ...covering filter: country > D & city != Springfield"; + + //System.out.println(plan); + assertEquals(expected, plan); + + assertEquals(0, query.count()); + assertEquals(0, query.fetch().toList().size()); + + // Insert some test data. + OverIndexedUserAddress address; + + address = storage.prepare(); + address.setAddressID(1); + address.setLine1("abc"); + address.setLine2("123"); + address.setCity("Springfield"); + address.setState("Illinois"); + address.setCountry("USA"); + address.setPostalCode("12345"); + address.insert(); + + address = storage.prepare(); + address.setAddressID(2); + address.setLine1("abc"); + address.setLine2("123"); + address.setCity("Springfield"); + address.setState("Unknown"); + address.setCountry("USA"); + address.setPostalCode("12345"); + address.insert(); + + address = storage.prepare(); + address.setAddressID(3); + address.setLine1("abc"); + address.setLine2("123"); + address.setCity("San Dimas"); + address.setState("Unknown"); + address.setCountry("USA"); + address.setPostalCode("12345"); + address.insert(); + + address = storage.prepare(); + address.setAddressID(4); + address.setLine1("abc"); + address.setLine2("123"); + address.setCity("San Dimas"); + address.setState("Unknown"); + address.setCountry("USA"); + address.setPostalCode("54321"); + address.insert(); + + address = storage.prepare(); + address.setAddressID(5); + address.setLine1("abc"); + address.setLine2("123"); + address.setCity("San Dimas"); + address.setState("California"); + address.setCountry("USA"); + address.setPostalCode("12345"); + address.insert(); + + address = storage.prepare(); + address.setAddressID(6); + address.setLine1("abc"); + address.setLine2("123"); + address.setCity("Greenwood"); + address.setState("Unknown"); + address.setCountry("Canada"); + address.setPostalCode("12345"); + address.insert(); + + assertEquals(1, query.count()); + + address = query.loadOne(); + assertEquals(3, address.getAddressID()); + } +} -- cgit v1.2.3