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]
Example #3
0
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.')