示例#1
0
 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
示例#2
0
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))
示例#3
0
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
示例#4
0
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")
示例#5
0
 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)
示例#7
0
    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)