Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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)