示例#1
0
 def shape(self):
     try:
         if self.data.type.python_type is list:
             df = self.ctx.read_sql(sa.select([func.min(func.array_length(self.data, 1)).label("min"),
                                     func.max(func.array_length(self.data, 1)).label("max")]))
             return df.values[0]
     except:
         return 1
示例#2
0
    def _search(self, query, catalog):
        # build filters
        filters = []

        if query is not None:
            for query_part in query.split(' '):
                if query_part == '':
                    continue
                query_filter = func.join_text_array(Data.catalog_id, ' ')\
                                   .ilike('%%%s%%' % query_part)
                filters.append(query_filter)

        if catalog is not None:
            catalog_filter = catalog.split('/')

            filters.append(Data.catalog_id.op('@>')(catalog_filter))
            catalog_depth = len(catalog_filter)
        else:
            catalog_depth = 1

        # redirect if empty search
        if filters == []:
            return redirect('/', 302)

        # look for catalogs
        cat_q = g.dbsession.query((Data.catalog_id[ 1 : func.least(func.array_length(Data.catalog_id, 1) - 1, catalog_depth + 1) ]).distinct())\
                 .filter(*filters).all()
        cat_q = map(tuple, map(itemgetter0, cat_q))

        catalogs = combine_catalogs(cat_q)

        # query data with the last version as sort key
        sq = g.dbsession.query(Version.data_id, Version.updated,
                               func.max(Version.updated).over(partition_by=Version.data_id)\
                                   .label('max_updated'))\
              .subquery()

        q = g.dbsession.query(Data, sq.c.updated)\
             .join((sq, and_(sq.c.data_id == Data.id,
                             sq.c.updated == sq.c.max_updated)))\
             .filter(*filters)

        q = q.order_by(sq.c.updated.desc(), Data.catalog_id)

        # pagination
        try:
            page = int(request.args['page'])
        except (ValueError, BadRequest):
            page = 1
        offset = (page - 1) * 15

        data = q.offset(offset).limit(16).all()

        final_page = (len(data) != 16)

        # check for single result
        if page == 1 and len(data) == 1:
            entry = data[0][0]
            return redirect('/entry/' + uuid2b64(entry.id))

        data = data[:15]

        # group by catalog
        data.sort(key=catalog_id_getter)

        data2 = [(catalog_id,
                  map(itemgetter0, sorted(catalog_data, key=itemgetter1, reverse=True)))
            for catalog_id, catalog_data in groupby(data, key=catalog_id_getter)]

        self.view.update({'data': data2,
                          'page': page,
                          'final_page': final_page,
                          'catalogs': catalogs,
                          'query': query})
        if catalog is not None:
            self.view['catalog'] = catalog.split('/')

        return render_template('search.html', **self.view)
示例#3
0
文件: mixin.py 项目: 4xxi/resonances
 def is_pure(cls):
     res = or_(
         func.array_length(cls._circulation_breaks, 1) < cls.MIN_BREAKS,
         func.array_length(cls._circulation_breaks, 1).is_(None))
     return res
示例#4
0
文件: mixin.py 项目: 4xxi/resonances
 def is_pure(cls):
     res = or_(func.array_length(cls._circulation_breaks, 1) < cls.MIN_BREAKS,
               func.array_length(cls._circulation_breaks, 1).is_(None))
     return res