Пример #1
0
    def query_export(self, request):
        request = request['unigrid']
        entity = request['entities']

        # array of requested fields
        fields = []
        # array of all query entities for simple field search
        entities = []
        # parse UniGridRequest. Get array of fields and array of entities
        for e in entity:
            self._process_entity_attrs(e, fields, entities)

        query = Session().query(*[f['ref'] for f in fields if f['selected']])
        for e in entities:
            if 'join' in e:
                query = query.outerjoin((e['alias'], e['join']))
        # filtration
        where = self._process_where(request.get('where', {}), fields)
        if where is not None:
            query = query.filter(where)
        # sorting
        for order in self._process_order(request.get('order', []), fields):
            query = query.order_by(order)

        class QueryIterable(object):
            def __init__(self, query):
                self.query = query

            def __iter__(self):
                return QueryIterator(self.query)

        class QueryIterator(object):
            offset = 0
            chunk_size = 10000

            def __init__(self, query):
                self.query = query

            def __iter__(self):
                return self

            def next(self):
                chunk = query.offset(self.offset).limit(self.chunk_size).all()
                self.offset += self.chunk_size
                if not chunk:
                    raise StopIteration
                return bytes(
                    '\n'.join([';'.join([str(f) for f in r])
                               for r in chunk]) + '\n', 'utf-8')

            __next__ = next  # py3 compat

        res = Response(content_type='text/csv',
                       headerlist=[('Content-disposition',
                                    'attachment;filename=export.csv')])
        res.app_iter = QueryIterable(query)
        return res
Пример #2
0
    def query_summaries(self, request):
        request = request['unigrid']
        entity = request['entities']

        # array of requested fields
        fields = []
        # array of all query entities for simple field search
        entities = []
        # parse UniGridRequest. Get array of fields and array of entities
        for e in entity:
            self._process_entity_attrs(e, fields, entities)

        offset = request.get('offset', 0)
        query = Session().query(*[f['ref'] for f in fields if f['selected']])
        for e in entities:
            if 'join' in e:
                query = query.outerjoin((e['alias'], e['join']))
        # filtration
        where = self._process_where(request.get('where', {}), fields)
        if where is not None:
            query = query.filter(where)

        sum_fields = [(getattr(sql.func, s)(f['ref']), s, f['alias'])
                      for f in fields if f['summaries']
                      for s in f['summaries']]
        data = []
        if sum_fields:
            data = query.from_self(*[f[0] for f in sum_fields]).one()
        count = 1
        return {
            'cols': [str(f[1]) + '_' + str(f[2]) for f in sum_fields],
            'data': [to_json_type(data[i]) for i in range(len(data))],
            'size': {
                'total': count,
                'offset': offset,
                'frame': len(data)
            }
        }
Пример #3
0
    def query(self, request):
        request = request['unigrid']
        entity = request['entities']

        # array of requested fields
        fields = []
        # array of all query entities for simple field search
        entities = []
        # parse UniGridRequest. Get array of fields and array of entities
        for e in entity:
            self._process_entity_attrs(e, fields, entities)

        offset = request.get('offset', 0)
        query = Session().query(*[f['ref'] for f in fields if f['selected']])
        for e in entities:
            if 'join' in e:
                query = query.outerjoin((e['alias'], e['join']))
        # filtration
        where = self._process_where(request.get('where', {}), fields)
        if where is not None:
            query = query.filter(where)
        # sorting
        for order in self._process_order(request.get('order', []), fields):
            query = query.order_by(order)
        count = query.count()
        data = query.offset(offset).limit(request.get('limit', 100)).all()
        return {
            'cols': [f['alias'] for f in fields if f['selected']],
            'data':
            [[to_json_type(r[i]) for i in range(len(r))] for r in data],
            'size': {
                'total': count,
                'offset': offset,
                'frame': len(data)
            }
        }