/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.jena.tdb.index ; import static org.apache.jena.tdb.base.record.RecordLib.r ; import static org.apache.jena.tdb.base.record.RecordLib.toIntList ; import static org.apache.jena.tdb.index.IndexTestLib.add ; import static org.apache.jena.tdb.index.IndexTestLib.randTest ; import static org.apache.jena.tdb.index.IndexTestLib.testInsert ; import static org.apache.jena.tdb.index.IndexTestLib.testInsertDelete ; import java.util.List ; import org.apache.jena.atlas.junit.BaseTest ; import org.apache.jena.tdb.base.record.RecordLib ; import org.apache.jena.tdb.index.RangeIndex ; import org.junit.After ; import org.junit.Test ; public abstract class AbstractTestRangeIndex extends BaseTest { private RangeIndex rIndex = null ; @After public void afterTest() { if ( rIndex != null ) rIndex.close() ; rIndex = null ; } // ---- Overridable maker protected RangeIndex makeRangeIndex(int order) { return makeRangeIndex(order, order) ; } protected abstract RangeIndex makeRangeIndex(int order, int minRecords) ; // -- Root-only @Test public void tree_ins_0_0() { // Empty tree int[] keys = {} ; rIndex = makeRangeIndex(2) ; testInsert(rIndex, keys) ; assertTrue(rIndex.isEmpty()) ; assertNull(rIndex.minKey()) ; assertNull(rIndex.maxKey()) ; } @Test public void tree_ins_0_1() { int[] keys = {0, 1, 2} ; rIndex = makeRangeIndex(2) ; testInsert(rIndex, keys) ; assertFalse(rIndex.isEmpty()) ; assertEquals(0, r(rIndex.minKey())) ; assertEquals(2, r(rIndex.maxKey())) ; } @Test public void tree_ins_2_01() { int[] keys = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; rIndex = makeRangeIndex(2) ; testInsert(rIndex, keys) ; assertEquals(0, r(rIndex.minKey())) ; assertEquals(9, r(rIndex.maxKey())) ; } @Test public void tree_ins_2_02() { int[] keys = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} ; rIndex = makeRangeIndex(2) ; testInsert(rIndex, keys) ; assertEquals(0, r(rIndex.minKey())) ; assertEquals(9, r(rIndex.maxKey())) ; } @Test public void tree_ins_2_03() { int[] keys = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9} ; rIndex = makeRangeIndex(2) ; testInsert(rIndex, keys) ; assertEquals(0, r(rIndex.minKey())) ; assertEquals(9, r(rIndex.maxKey())) ; } @Test public void tree_ins_2_04() { int[] keys = {0, 9, 2, 7, 4, 5, 6, 3, 8, 1} ; rIndex = makeRangeIndex(2) ; testInsert(rIndex, keys) ; assertEquals(0, r(rIndex.minKey())) ; assertEquals(9, r(rIndex.maxKey())) ; } @Test public void tree_ins_2_05() { int[] keys = {0, 18, 4, 14, 8, 10, 12, 6, 16, 2} ; rIndex = makeRangeIndex(2) ; testInsert(rIndex, keys) ; assertFalse(rIndex.contains(r(1))) ; assertFalse(rIndex.contains(r(999))) ; assertFalse(rIndex.contains(r(-9))) ; assertFalse(rIndex.contains(r(7))) ; assertEquals(0, r(rIndex.minKey())) ; assertEquals(18, r(rIndex.maxKey())) ; } @Test public void tree_del_0_1() { int[] keys1 = {0, 1, 2} ; int[] keys2 = {0, 1, 2} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_0_2() { int[] keys1 = {0, 1, 2} ; int[] keys2 = {2, 1, 0} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_0_3() { int[] keys1 = {0, 1, 2} ; int[] keys2 = {1, 0, 2} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_01() { int[] keys1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; int[] keys2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_02() { int[] keys1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; int[] keys2 = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_03() { int[] keys1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; int[] keys2 = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_04() { int[] keys1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; int[] keys2 = {0, 9, 2, 7, 4, 5, 6, 3, 8, 1} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_05() { int[] keys1 = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} ; int[] keys2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_06() { int[] keys1 = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} ; int[] keys2 = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_07() { int[] keys1 = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} ; int[] keys2 = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_08() { int[] keys1 = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} ; int[] keys2 = {0, 9, 2, 7, 4, 5, 6, 3, 8, 1} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_09() { int[] keys1 = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9} ; int[] keys2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_10() { int[] keys1 = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9} ; int[] keys2 = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_11() { int[] keys1 = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9} ; int[] keys2 = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_del_2_12() { int[] keys1 = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9} ; int[] keys2 = {0, 9, 2, 7, 4, 5, 6, 3, 8, 1} ; rIndex = makeRangeIndex(2) ; testInsertDelete(rIndex, keys1, keys2) ; } @Test public void tree_iter_2_01() { int[] keys = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9} ; rIndex = makeRangeIndex(2) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(r(4), r(6))) ; List<Integer> expected = toIntList(4, 5) ; assertEquals(expected, x) ; } @Test public void tree_iter_2_02() { int[] keys = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; rIndex = makeRangeIndex(2) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(r(4), r(7))) ; List<Integer> expected = toIntList(4, 5, 6) ; assertEquals(expected, x) ; } @Test public void tree_iter_2_03() { int[] keys = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; rIndex = makeRangeIndex(2) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(r(4), null)) ; List<Integer> expected = toIntList(4, 5, 6, 7, 8, 9) ; assertEquals(expected, x) ; } @Test public void tree_iter_2_04() { int[] keys = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; rIndex = makeRangeIndex(2) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(null, null)) ; List<Integer> expected = toIntList(keys) ; assertEquals(expected, x) ; } @Test public void tree_iter_2_05() { int[] keys = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; rIndex = makeRangeIndex(2) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(null, r(4))) ; List<Integer> expected = toIntList(0, 1, 2, 3) ; assertEquals(expected, x) ; } @Test public void tree_iter_2_07() { int[] keys = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; rIndex = makeRangeIndex(2) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(null, r(99))) ; List<Integer> expected = toIntList(keys) ; assertEquals(expected, x) ; } @Test public void tree_iter_2_08() { int[] keys = {1, 2, 3, 4, 5, 6, 7, 8, 9} ; rIndex = makeRangeIndex(2) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(r(0), r(99))) ; List<Integer> expected = toIntList(keys) ; assertEquals(expected, x) ; } @Test public void tree_iter_2_09() { int[] keys = {1, 2, 3, 4, /* 5, 6, */7, 8, 9, 10, 11} ; rIndex = makeRangeIndex(2) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(r(5), r(7))) ; List<Integer> expected = toIntList() ; assertEquals(expected, x) ; } // Root @Test public void tree_iter_0_01() { int[] keys = {1, 2, 3, 4, 5} ; rIndex = makeRangeIndex(5) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(r(2), r(4))) ; List<Integer> expected = toIntList(2, 3) ; assertEquals(expected, x) ; } @Test public void tree_iter_0_02() { int[] keys = {1, 2, 3, 4, 5} ; rIndex = makeRangeIndex(5) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(null, null)) ; List<Integer> expected = toIntList(keys) ; assertEquals(expected, x) ; } @Test public void tree_iter_0_03() { int[] keys = {1, 2, 3, 4, 5} ; rIndex = makeRangeIndex(5) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(r(5), null)) ; List<Integer> expected = toIntList(5) ; assertEquals(expected, x) ; } @Test public void tree_iter_0_04() { int[] keys = {1, 2, 3, 4, 5} ; rIndex = makeRangeIndex(5) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(r(0), r(0))) ; List<Integer> expected = toIntList() ; assertEquals(expected, x) ; } @Test public void tree_iter_0_05() { int[] keys = {1, 2, 3, 4, 5} ; rIndex = makeRangeIndex(5) ; add(rIndex, keys) ; List<Integer> x = RecordLib.toIntList(rIndex.iterator(r(1), r(0))) ; List<Integer> expected = toIntList() ; assertEquals(expected, x) ; } @Test public void tree_ret_1() { int[] keys = {1, 2, 3, 4, 5} ; rIndex = makeRangeIndex(2) ; add(rIndex, keys) ; boolean b = rIndex.add(RecordLib.intToRecord(3)) ; assertFalse(b) ; b = rIndex.add(RecordLib.intToRecord(9)) ; assertTrue(b) ; } @Test public void tree_ret_2() { int[] keys = {1, 2, 3, 4, 5} ; rIndex = makeRangeIndex(2) ; add(rIndex, keys) ; boolean b = rIndex.delete(RecordLib.intToRecord(9)) ; assertFalse(b) ; b = rIndex.add(RecordLib.intToRecord(1)) ; assertFalse(b) ; } @Test public void tree_2_N() { for ( int i = 0 ; i < 10 ; i++ ) randTest(makeRangeIndex(2), 999, 20) ; } @Test public void tree_3_N() { for ( int i = 0 ; i < 10 ; i++ ) randTest(makeRangeIndex(3), 9999, 100) ; } @Test public void tree_clear_00() { testClear(0) ; } @Test public void tree_clear_01() { testClear(5) ; } @Test public void tree_clear_02() { testClear(998) ; } @Test public void tree_clear_03() { testClear(999) ; } @Test public void tree_clear_04() { testClear(1000) ; } @Test public void tree_clear_05() { testClear(1001) ; } @Test public void tree_clear_06() { testClear(5500) ; } void testClear(int N) { int[] keys = new int[N] ; // Slice is 1000. for ( int i = 0 ; i < keys.length ; i++ ) keys[i] = i ; rIndex = makeRangeIndex(3) ; add(rIndex, keys) ; if ( N > 0 ) assertFalse(rIndex.isEmpty()) ; rIndex.clear() ; assertTrue(rIndex.isEmpty()) ; } }