def create_index(index_name, table, col, buf): schemas = load(table_schema_file) if table in schemas: schema = schemas[table] else: raise MiniSQLError('table {} does not exit'.format(table)) index_file = index_file_prefix.format(index_name) if os.path.exists(index_file): raise MiniSQLError('index {} all ready exits'.format(index_name)) tree = BPlusTree(TREE_ORDER) table_blocks = [] for i, b in enumerate(buf.header): if b['table'] == table: table_blocks.append(i) idx = schema['cols'].index(col) for block_idx in table_blocks: b = buf.get_block(block_idx) records = b.data() for i, r in enumerate(records): ptr = block_idx * MAX_RECORDS_PER_BLOCK + i tree.insert(r[idx], ptr) schemas[table]['index'].append([col, index_name]) dump(schemas, table_schema_file) dump(tree, index_file) log('create index {}'.format(index_name))
def test_contains(): bt = BPlusTree(20) key_a = index.Span(1, 6) key_b = index.Span(6, 10) bt.insert(key_a, "a_value") bt.insert(key_b, "b_value") assert key_a in bt assert key_b in bt assert bt[key_a] == "a_value" assert bt[key_b] == "b_value"
def test_additions_sorted(): bt = BPlusTree(20) rl = [index.Span(a, a + 5) for a in range(0, 100, 5)] for item in rl: bt.insert(item, str(item)) for item in rl: assert str(item) == bt[item] assert rl == list(bt)
def test_additions_sorted(): bt = BPlusTree(20) l = range(2000) for item in l: bt.insert(item, str(item)) for item in l: assert str(item) == bt[item] assert l == list(bt)
def test_split(): bt = BPlusTree(20) key_a = index.Span(1, 6) key_b = index.Span(3, 10) key_a_prime = index.Span(1, 3) bt.insert(key_a, "a_value") bt.insert(key_b, "b_value") assert not (key_a in bt) assert key_a_prime in bt assert key_b in bt assert bt[key_a_prime] == "a_value" assert bt[key_b] == "b_value"
def test_additions_random(): bt = BPlusTree(20) l = range(2000) random.shuffle(l) for item in l: bt.insert(item, str(item)) for item in l: assert str(item) == bt[item] assert range(2000) == list(bt)