def perform_aggregation(self, deadline): candidates = self.deadlines_in_group_with_same_name(deadline) candidates_dates = [ deadline.deadline for deadline in candidates] gr = GroupRepository() threshold = math.ceil(gr.get_group_size(deadline.group_id) / 3) dmr = DeadlineMetadataRepository() print "Dates: " + str(candidates_dates) print "Threshold: " + str(threshold) print "Should Aggregate? " + str(should_aggregate(candidates_dates, threshold)) if deadline.type == 'END': print "Performing Aggregation for Endorsed Deadline." for candidate in candidates: if candidate.meta: candidate.meta.deadline_id = deadline.id dmr.persist(candidate.meta) elif should_aggregate(candidates_dates, threshold): print "Aggregating for general deadline." canonical = deadline for candidate in candidates: if candidate.type == 'END': deadline.meta.deadline_id = candidate.id dmr.persist(deadline.meta) canonical = candidate if canonical != deadline: canonical.meta = deadline.meta else: deadline.type = 'COM' for candidate in candidates: if candidate.meta: candidate.meta.deadline_id = deadline.id dmr.persist(candidate.meta) self.raw_persist(deadline, False) deadline = canonical self.cleanup_orphan_deadlines() return deadline
def raw_persist(self, deadline, aggregate): super(DeadlineRepository, self).persist(deadline) delta = deadline.get_delta() delta.pop('id', None) # make sure id does not exist delta.pop('meta', None) if deadline.id is None: with self._conn.cursor() as cursor: cursor.execute('INSERT INTO `deadline` (name, group_id, deadline, type) ' 'VALUES (?,?,?,?);', (delta['name'], delta['group_id'], delta['deadline'], delta['type'])) cursor.execute('SELECT `id`, `name`, `group_id`, `deadline`, `type` ' 'FROM `deadline` ' 'WHERE `id`=LAST_INSERT_ID()') new_deadline = self._fetch_deadline(cursor) if deadline.meta: new_deadline.meta = deadline.meta new_deadline.meta.deadline_id = new_deadline.id new_deadline.meta.insert = True dmr = DeadlineMetadataRepository() dmr.persist(new_deadline.meta) deadline = new_deadline else: if deadline.meta: dmr = DeadlineMetadataRepository() dmr.persist(deadline.meta) if delta: assert 'id' not in delta keys = delta.keys() args = list(delta.values()) args.append(deadline.id) query = ','.join('`{}`=?'.format(k) for k in keys) with self._conn.cursor() as cursor: cursor.execute('UPDATE `deadline` ' 'SET {} WHERE `id`=?'.format(query), args) if aggregate: return self.perform_aggregation(deadline)