def test_read_1_record(self): pr = PageRange(5) columns = [20, 21, 22, 23, 24] pr.add_record(0, columns) self.assertTrue(pr.num_base_records == 1) data = pr.get_record(0, [1, 1, 1, 1, 1]) self.assertTrue(columns == data)
def test_add_8192_records(self): pr = PageRange(5) columns = [] for i in range(8192): columns.append([20 + i, 21 + i, 22 + i, 23 + i, 24 + i]) pr.add_record(i, columns[i]) self.assertTrue(pr.num_base_records == 8192)
def test_read_8192_records(self): pr = PageRange(5) columns = [] for i in range(8192): columns.append([20 + i, 21 + i, 22 + i, 23 + i, 24 + i]) pr.add_record(i, columns[i]) read_data = [] for i in range(8192): read_data.append(pr.get_record(i, [1, 1, 1, 1, 1])) self.assertTrue(columns == read_data)
def test_update_twice_1_record_2(self): pr = PageRange(5) update = [0, 1, 2, 3, 4] pr.add_record(0, [20, 21, 22, 23, 24]) pr.update_record(0, 0, update) self.assertTrue(pr.num_tail_records == 1) update = [500, None, 700, None, 900] pr.update_record(0, 1, update) data = pr.get_record(0, [1, 1, 1, 1, 1]) self.assertTrue(pr.num_base_records == 1) self.assertTrue(pr.num_tail_records == 2) self.assertTrue(data == [500, 1, 700, 3, 900])
def __load_record_from_disk(self, rid, page_range_index, set_type): block_start_index = self.brid_block_start[ rid] if set_type == BASE_RID_TYPE else self.trid_block_start[rid] if set_type == BASE_RID_TYPE: page_set_index = block_start_index // (self.num_columns + META_DATA_PAGES) page_set, brids, times, schema, indir, indir_t = BUFFER_POOL.get_page_set( self.name, self.num_columns, self.disk, page_range_index, page_set_index, set_type, block_start_index) if self.page_ranges.get( page_range_index) is None: # check if page range exists self.page_ranges[page_range_index] = PageRange( self.num_columns) self.__add_brids_to_page_directory(brids, indir, indir_t, page_range_index, page_set_index) self.page_ranges[page_range_index].add_base_page_set_from_disk( page_set, page_set_index, brids, times, schema, indir, indir_t) else: page_set_index = len( self.page_ranges[page_range_index].tail_page_sets) page_set, trids, times, schema, indir, indir_t = BUFFER_POOL.get_page_set( self.name, self.num_columns, self.disk, page_range_index, page_set_index, set_type, block_start_index) # this implementation will first be in mem self.page_ranges[page_range_index].add_tail_page_set_from_disk( page_set, page_set_index, trids, times, schema, indir, indir_t) # new_block_start_index = self.__get_tail_block(page_range_index, page_set_index) self.__add_trids_to_key_directory_info(trids, block_start_index) LOCK_MANAGER.build_rid_lock(rid, set_type)
def test_update_one_column_1_record(self): pr = PageRange(5) update = [0, None, None, None, None] pr.add_record(0, [20, 21, 22, 23, 24]) pr.update_record(0, 0, update) update = [0, 21, 22, 23, 24] data = pr.get_record(0, [1, 1, 1, 1, 1]) self.assertTrue(data == update)
def __get_next_available_page_range(self, new_rid): # For optimization purposes, we must lessen the how often we use latches page_range_index = new_rid // (RECORDS_PER_PAGE * PAGE_SETS) LOCK_MANAGER.latches[AVAILABLE_PAGE_RANGE].acquire() if self.page_ranges.get( page_range_index) is None: # page range doesn't exist new_page_range = PageRange(self.num_columns) page_range_index = new_rid // (RECORDS_PER_PAGE * PAGE_SETS) self.page_ranges[page_range_index] = new_page_range LOCK_MANAGER.latches[AVAILABLE_PAGE_RANGE].release() return page_range_index
def test_update_once_8192_records(self): pr = PageRange(5) columns = [] for i in range(8192): columns.append([20 + i, 21 + i, 22 + i, 23 + i, 24 + i]) pr.add_record(i, columns[i]) updated_columns = [] for i in range(8192): updated_columns.append([i, i * 2, i * 3, i * 4, i * 5]) pr.update_record(i, i, updated_columns[i]) data = [] for i in range(8192): data.append(pr.get_record(i, [1, 1, 1, 1, 1])) self.assertTrue(data == updated_columns)
def test_add_1_record(self): pr = PageRange(5) pr.add_record(0, [20, 21, 22, 23, 24]) self.assertTrue(pr.num_base_records == 1)
def test_update_once_1_record(self): pr = PageRange(5) pr.add_record(0, [20, 21, 22, 23, 24]) pr.update_record(0, 0, [0, 1, 2, 3, 4]) data = pr.get_record(0, [1, 1, 1, 1, 1]) self.assertTrue(data == [0, 1, 2, 3, 4])
def test_create_page_range(self): pr = PageRange(5) self.assertTrue(pr.num_base_records == 0)
def test_update_different_columns_1_record(self): pr = PageRange(5) update = [0, None, None, None, None] pr.add_record(0, [20, 21, 22, 23, 24]) pr.update_record(0, 0, update) data = pr.get_record(0, [1, 1, 1, 1, 1]) self.assertTrue(pr.num_base_records == 1) self.assertTrue(pr.num_tail_records == 1) self.assertTrue(data == [0, 21, 22, 23, 24]) update = [0, 1, 2, 3, None] pr.update_record(0, 1, update) data = pr.get_record(0, [1, 1, 1, 1, 1]) self.assertTrue(pr.num_base_records == 1) self.assertTrue(pr.num_tail_records == 2) self.assertTrue(data == [0, 1, 2, 3, 24]) update = [None, None, None, None, 100] pr.update_record(0, 2, update) data = pr.get_record(0, [1, 1, 1, 1, 1]) self.assertTrue(pr.num_base_records == 1) self.assertTrue(pr.num_tail_records == 3) self.assertTrue(data == [0, 1, 2, 3, 100])