def get_range(self): text = self.page_range_widget.text() try: page_range = PageRange(text) except ValueError: page_range = PageRange("{}-{}".format(1, self.page_cnt)) return page_range
def test(): pr = PageRange() pr.base_page_count = 6 pr.tail_page_count = 2 def _create_page(i): page = Page() page.write_tps(666 + i) page.write(int_to_bytes(777 + i)) page.write(int_to_bytes(888 + i)) page.write(int_to_bytes(999 + i)) return page pr.base_pages[0] = _create_page(0) pr.base_pages[1] = _create_page(1) pr.base_pages[2] = _create_page(2) pr.base_pages[3] = _create_page(3) pr.base_pages[4] = _create_page(4) pr.base_pages[5] = _create_page(5) pr.tail_pages.append(_create_page(6)) pr.tail_pages.append(_create_page(7)) pr_bytes = encode_pagerange(pr) new_pr = decode_pagerange(pr_bytes) print(compare_page_ranges(pr, new_pr))
def decode_pagerange(BYTES_pr) -> PageRange: pr = PageRange() # # Read Meta # BYTES_base_page_count = BYTES_pr[META_OFFSETS[0]: META_OFFSETS[1]] # 8 bytes BYTES_tail_page_count = BYTES_pr[META_OFFSETS[1]: META_OFFSETS[2]] # 8 bytes pr.base_page_count = int_from_bytes(BYTES_base_page_count) pr.tail_page_count = int_from_bytes(BYTES_tail_page_count) # # Read Base Pages # bytes_page_size = 8 + 4096 offset_end_base = 16 for i in range(pr.base_page_count): start = META_OFFSETS[-1] + (i * bytes_page_size) end = start + bytes_page_size BYTES_page = BYTES_pr[start:end] page = decode_page(BYTES_page) pr.base_pages[i] = page offset_end_base = end # so we know where the tails start # # Read Tail Pages # for i in range(pr.tail_page_count): start = offset_end_base + (i * bytes_page_size) end = start + bytes_page_size BYTES_page = BYTES_pr[start:end] page = decode_page(BYTES_page) pr.tail_pages.append(page) return pr
class PageRangeTestCase(TestCase): def setUp(self): self.page_range_1 = PageRange([1, 2, 3, 4, 5, 10, 42]) self.page_range_2 = PageRange("1-5, 10, 42") def test_add_page(self): self.assertNotIn(6, self.page_range_1) self.assertTrue(7 == len(self.page_range_1)) self.page_range_1.add_page(6) self.assertIn(6, self.page_range_1) self.assertTrue(8 == len(self.page_range_1.pages)) def test_remove_page(self): self.assertIn(42, self.page_range_1) self.assertTrue(7 == len(self.page_range_1)) self.page_range_1.remove_page(42) self.assertNotIn(42, self.page_range_1) self.assertTrue(6 == len(self.page_range_1)) def test_equality(self): self.assertEquals(self.page_range_1, self.page_range_2) def test_unique(self): self.page_range_2.add_page(1) self.assertEquals(self.page_range_1, self.page_range_2) def test_noninteger(self): self.assertRaises(TypeError, self.page_range_1.add_page, "x") self.assertRaises(TypeError, self.page_range_1.remove_page, "x")
def setUp(self): self.page_range_1 = PageRange([1, 2, 3, 4, 5, 10, 42]) self.page_range_2 = PageRange("1-5, 10, 42")
def get_open_base_page(self, col_idx): # how many pages for this column exists num_col_pages = ceil(self.table.num_rows / CELLS_PER_PAGE) # index of the last used page in respect to all pages across all page ranges prev_outer_page_idx = col_idx + max( 0, num_col_pages - 1) * self.table.num_total_cols # index of last used page range prev_page_range_idx = floor(prev_outer_page_idx / PAGE_RANGE_MAX_BASE_PAGES) # index of last used page in respect to the specific page range prev_inner_page_idx = get_inner_index_from_outer_index( prev_outer_page_idx, PAGE_RANGE_MAX_BASE_PAGES) # index of cell within page mod = self.table.num_rows % CELLS_PER_PAGE max_cell_index = CELLS_PER_PAGE - 1 prev_cell_idx = max_cell_index if (0 == mod) else (mod - 1) if max_cell_index == prev_cell_idx: # last page was full # Go to next col page # New cell's page index in respect to all pages outer_page_idx = col_idx if 0 == self.table.num_rows else prev_outer_page_idx + self.table.num_total_cols # New cell's page range index page_range_idx = floor(outer_page_idx / PAGE_RANGE_MAX_BASE_PAGES) try: page_range = self.page_ranges[ page_range_idx] # type: PageRange except IndexError: page_range = PageRange() self.page_ranges.append(page_range) # New cell's page index in respect to pages in page range inner_page_idx = get_inner_index_from_outer_index( outer_page_idx, PAGE_RANGE_MAX_BASE_PAGES) cell_idx = 0 created_inner_page_idx, page = page_range.create_base_page() if created_inner_page_idx != inner_page_idx: raise Exception( 'Created inner page index is not the same as the expected inner page index', page.get_num_records(), created_inner_page_idx, cell_idx, inner_page_idx, page_range_idx, outer_page_idx) else: # there's space in the last used page outer_page_idx = prev_outer_page_idx page_range_idx = prev_page_range_idx inner_page_idx = prev_inner_page_idx cell_idx = prev_cell_idx + 1 page_range = self.page_ranges[page_range_idx] # type: PageRange page = page_range.get_page(inner_page_idx) if (None == page): raise Exception('No page returned', cell_idx, inner_page_idx, page_range_idx, outer_page_idx, self.table.num_rows, col_idx) pid = [cell_idx, inner_page_idx, page_range_idx] return (pid, page)
def get_open_base_page(self, col_idx, new_row_num): # how many pages for this column exists num_col_pages = ceil((new_row_num - 1) / CELLS_PER_PAGE) # index of the last used page in respect to all pages across all page ranges prev_outer_page_idx = col_idx + max( 0, num_col_pages - 1) * self.num_total_cols # index of last used page range prev_page_range_idx = floor(prev_outer_page_idx / PAGE_RANGE_MAX_BASE_PAGES) # index of last used page in respect to the specific page range prev_inner_page_idx = get_inner_index_from_outer_index( prev_outer_page_idx, PAGE_RANGE_MAX_BASE_PAGES) # index of cell within page mod = (new_row_num - 1) % CELLS_PER_PAGE max_cell_index = CELLS_PER_PAGE - 1 prev_cell_idx = max_cell_index if (0 == mod) else (mod - 1) if max_cell_index == prev_cell_idx: # last page was full # Go to next col page # New cell's page index in respect to all pages outer_page_idx = col_idx if 0 == ( new_row_num - 1) else prev_outer_page_idx + self.num_total_cols # New cell's page range index page_range_idx = floor(outer_page_idx / PAGE_RANGE_MAX_BASE_PAGES) try: page_range = self.page_ranges[ page_range_idx] # type: PageRange except IndexError: page_range = PageRange() index = len(self.page_ranges) self.page_ranges.append(page_range) self.bp.write_new_page_range(page_range, index) # New cell's page index in respect to pages in page range inner_page_idx = get_inner_index_from_outer_index( outer_page_idx, PAGE_RANGE_MAX_BASE_PAGES) cell_idx = 0 created_inner_page_idx, page = page_range.create_base_page() # print("Created new base page") if created_inner_page_idx != inner_page_idx: raise Exception( 'Created inner page index is not the same as the expected inner page index', page.get_num_records(), created_inner_page_idx, cell_idx, inner_page_idx, page_range_idx, outer_page_idx) # base_page_is_new = True else: # there's space in the last used page outer_page_idx = prev_outer_page_idx page_range_idx = prev_page_range_idx inner_page_idx = prev_inner_page_idx cell_idx = prev_cell_idx + 1 page_range = self.page_ranges[page_range_idx] # type: PageRange page = page_range.get_page(inner_page_idx) if (None == page): raise Exception('No page returned', cell_idx, inner_page_idx, page_range_idx, outer_page_idx, (new_row_num - 1), col_idx) pid = [cell_idx, inner_page_idx, page_range_idx] # if base_page_is_new or not page.is_loaded: # print("Trying to add", pid, "to bufferpool") self.bp.add_page(pid, page, pin=True) return (pid, page)