-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3-hypermedia_del_pagination.py
64 lines (53 loc) · 1.71 KB
/
3-hypermedia_del_pagination.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/env python3
"""
Deletion-resilient hypermedia pagination
"""
import csv
import math
from typing import List, Dict
class Server:
"""Server class to paginate a database of popular baby names.
"""
DATA_FILE = "Popular_Baby_Names.csv"
def __init__(self):
self.__dataset = None
self.__indexed_dataset = None
def dataset(self) -> List[List]:
"""Cached dataset
"""
if self.__dataset is None:
with open(self.DATA_FILE) as f:
reader = csv.reader(f)
dataset = [row for row in reader]
self.__dataset = dataset[1:]
return self.__dataset
def indexed_dataset(self) -> Dict[int, List]:
"""Dataset indexed by sorting position, starting at 0
"""
if self.__indexed_dataset is None:
dataset = self.dataset()
truncated_dataset = dataset[:1000]
self.__indexed_dataset = {
i: dataset[i] for i in range(len(dataset))
}
return self.__indexed_dataset
def get_hyper_index(self, index: int = None, page_size: int = 10) -> Dict:
"""
deletion resilient hypermedia pagination
"""
dataset = self.indexed_dataset()
assert type(index) is int and index in range(len(dataset))
data = []
start, end = index, index + page_size
while start < end:
if start in dataset.keys():
data.append(dataset[start])
else:
end += 1
start += 1
return {
"index": index,
"data": data,
"page_size": len(data),
"next_index": end
}