def sort_and_rank_records(recids, so=None, rm=None, p=''): output = recids.tolist() if so: output.reverse() elif rm: from invenio.bibrank_record_sorter import rank_records ranked = rank_records(rm, 0, output, p.split()) if ranked[0]: output = ranked[0] output.reverse() else: output = output.tolist() else: output.reverse() return output
def find_similar_videos(recid, collection="Videos", threshold=75, maximum=3, shuffle=True): """ Returns a list of similar video records """ similar_records = [] collection_recids = intbitset(perform_request_search(cc=collection)) ranking = rank_records('wrd', 0, collection_recids, ['recid:' + str(recid)]) ## ([6, 7], [81, 100], '(', ')', '') for list_pos, rank in enumerate(ranking[1]): if rank >= threshold: similar_records.append(ranking[0][list_pos]) if shuffle: if maximum > len(similar_records): maximum = len(similar_records) return random.sample(similar_records, maximum) else: return similar_records[:maximum]
def results(qid): """ Generates results for cached query using POSTed filter. @param qid: query indentifier """ try: recIDsHitSet = get_current_user_records_that_can_be_displayed(qid) except KeyError: return 'KeyError' except: return _('Please reload the page') cc = search_results_cache.get( get_search_results_cache_key_from_qid(qid) + '::cc') try: filter = json.loads(request.values.get('filter', '[]')) except: return _('Invalid filter data') collection = Collection.query.filter(Collection.name == cc).first_or_404() sortkeytype = lambda v: v[0] sortfacet = lambda v: v[1] data = sorted(filter, key=sortkeytype) out = {} for t, vs in groupby(data, key=sortkeytype): out[t] = {} for v, k in groupby(sorted(vs, key=sortfacet), key=sortfacet): out[t][v] = map(lambda i: i[2], k) filter = out output = recIDsHitSet FACET_DICTS = current_app.config.get('FACET_DICTS', {}) if '+' in filter: values = filter['+'] for key, facet in FACET_DICTS.iteritems(): if key in values: output.intersection_update(facet.get_facet_recids(values[key])) if '-' in filter: values = filter['-'] for key, facet in FACET_DICTS.iteritems(): if key in values: output.difference_update(facet.get_facet_recids(values[key])) #TODO sort if request.values.get('so'): recids = output.tolist() recids.reverse() elif request.values.get('rm'): from invenio.bibrank_record_sorter import rank_records ranked = rank_records( request.values.get('rm'), 0, output, request.values.get('p', '').split()) if ranked[0]: recids = ranked[0] recids.reverse() else: recids = output.tolist() else: recids = output.tolist() recids.reverse() rg = request.values.get('rg', 10, type=int) page = request.values.get('jrec', 1, type=int) @register_template_context_processor def index_context(): return dict( collection=collection, RecordInfo=RecordInfo, create_nearest_terms_box=_create_neareset_term_box, pagination=Pagination(int(ceil(page / float(rg))), rg, len(recids)), rg=rg, format_record=cached_format_record) if len(recids): return render_template('websearch_results.html', recids=recids, export_formats=get_export_formats()) else: return _('Your search did not match any records. Please try again.')