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
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)
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
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