worked on splitting regions and implemented set_allocator / set_consumer
[sfa.git] / gacks / gackscalendar.py
1 from gacksexcep import *
2 from gackshandle import *
3
4 class GacksCalendar:
5     def __init__(self):
6         pass
7
8     def query(self, id=None, unitStart=0, unitStop=INFINITY, timeStart=0, timeStop=INFINITY):
9         pass
10
11     def insert_record(self, item):
12         pass
13
14     def query_handles(self, handles):
15         results = []
16         for handle in handles:
17             items = query(handle.id, handle.unitStart, handle.unitStop, handle.timeStart, handle.timeStop)
18             for item in items:
19                 if not item.is_in_list(results):
20                     results.append(item)
21         return results
22
23     def update_record(self, item):
24         remove_record(item)
25         insert_record(item)
26
27 class GacksListCalendar(GacksCalendar):
28     def __init__(self):
29         self.items = []
30
31     def test_id(self, x, y):
32         if not x:
33             return True
34         else:
35             return (x == y)
36
37     def test_lesser(self, x, y):
38         if not x:
39             return True
40         elif y==INFINITY:
41             return True
42         else:
43             return (x<y)
44
45     def test_greater(self, x, y):
46         if not x:
47             return True
48         elif x==INFINITY:
49             return True
50         elif y==INFINITY:
51             return False
52         else:
53             return (x>y)
54
55     def query(self, id=None, unitStart=0, unitStop=INFINITY, timeStart=0, timeStop=INFINITY):
56         list = []
57         for item in self.items:
58             if self.test_id(id, item.id) and \
59                self.test_lesser(unitStart, item.unitStop) and \
60                self.test_greater(unitStop, item.unitStart) and \
61                self.test_lesser(timeStart, item.timeStop) and \
62                self.test_greater(timeStop, item.timeStart):
63                  list.append(item)
64         return list
65
66     def find_record(self, item_to_delete):
67         list = []
68         for item in self.items:
69             if item.is_same_cell(item_to_delete):
70                 list.append(item)
71
72         if not list:
73             return None
74
75         if len(list) > 1:
76             raise GacksMultipleRecordCollision(item_to_delete.as_string())
77
78         return list[0]
79
80     def insert_record(self, item):
81         conflicts = self.query(item.id, item.unitStart, item.unitStop, item.timeStart, item.timeStop)
82         if conflicts:
83             raise GacksConflictingInsert(item.as_string())
84
85         self.items.append(item)
86
87     def remove_record(self, item):
88          existing_record = self.find_record(item)
89          if existing_record:
90              self.items.remove(existing_record)
91
92