Ejemplo n.º 1
0
def suggest(dataset):
    """ 
    Suggest API, emulates Google Refine API. See:
    http://code.google.com/p/google-refine/wiki/SuggestApi
    """
    try:
        start = int(request.args.get('start', 0))
        limit = int(request.args.get('limit', 20))
    except:
        raise BadRequest('Invalid result range!')

    dataset = type_to_dataset(dataset)
    query = request.args.get('prefix', '').strip()
    results = prefix_search(query, dataset)[start:start+limit]
    entities = Entity.id_map(dataset, map(lambda (c,v): v, results))
    matches = []
    for candidate, entity_id in results:
        entity = entities[entity_id]
        matches.append({
            'name': entity.name,
            'n:type': {
                'id': '/' + dataset.name,
                'name': dataset.label
                },
            'id': url_for('entity.view', dataset=dataset.name, entity=entity_id)
            })
    return jsonify({
        "code" : "/api/status/ok",
        "status" : "200 OK",
        "prefix" : query,
        "result" : matches
        })
Ejemplo n.º 2
0
def match(dataset, alias, random=False):
    dataset = Dataset.find(dataset)
    authz.require(authz.dataset_edit(dataset))
    alias = Alias.find(dataset, alias)
    random = random or request.args.get('random')=='True'
    choices = match_op(alias.name, dataset,
            query=request.args.get('query'))
    pager = Pager(choices, '.match',
        dataset=dataset.name, alias=alias.id,
        limit=10)

    # HACK: Fetch only the entities on the selected page.
    entities = Entity.id_map(dataset, map(lambda (c,e,s): e,
        pager.query[pager.offset:pager.offset+pager.limit]))
    for i, (c,e,s) in enumerate(pager.query):
        if e in entities:
            pager.query[i] = (c, entities.get(e), s)

    html = render_template('alias/match.html',
            dataset=dataset, alias=alias, choices=pager,
            random=random)
    choice = 'INVALID' if alias.is_invalid else alias.entity_id
    if len(choices) and choice is None:
        c, e, s = choices[0]
        choice = 'INVALID' if s <= 50 else e.id
    return htmlfill.render(html, force_defaults=False,
            defaults={'choice': choice,
                      'name': alias.name,
                      'query': request.args.get('query', ''),
                      'random': random})
Ejemplo n.º 3
0
def view(dataset, entity):
    dataset = Dataset.find(dataset)
    entity = Entity.find(dataset, entity)
    print entity.data
    format = response_format()
    if format == 'json':
        return jsonify(entity)
    query = request.args.get('query', '').strip().lower()
    choices = match_op(entity.name, dataset)
    choices = filter(lambda (c,e,s): e != entity.id, choices)
    if len(query):
        choices = filter(lambda (c,e,s): query in Entity.find(dataset,e).name.lower(),
                         choices)
                         # THIS is very inefficient - rather do this
                         # differently
    pager = Pager(choices, '.view', dataset=dataset.name,
                  entity=entity.id, limit=10)

    # HACK: Fetch only the entities on the selected page.
    entities = Entity.id_map(dataset, map(lambda (c,v,s): v,
        pager.query[pager.offset:pager.offset+pager.limit]))
    for i, (c,e,s) in enumerate(pager.query):
        if e in entities:
            pager.query[i] = (c, entities.get(e), s)

    return render_template('entity/view.html', dataset=dataset,
                           entity=entity, entities=pager, query=query)
Ejemplo n.º 4
0
 def __iter__(self):
     rp = db.engine.execute(self.lq)
     rows = rp.fetchall()
     ids = [r[0] for r in rows]
     entities = Entity.id_map(ids)
     for (id, score) in rows:
         yield {'score': int(score), 'entity': entities.get(id)}
Ejemplo n.º 5
0
def reconcile_op(dataset, query):
    try:
        limit = max(1, min(100, int(query.get('limit'))))
    except ValueError: limit = 5
    except TypeError: limit = 5

    filters = [(p.get('p'), p.get('v')) for p in query.get('properties', [])]

    if dataset is None:
        dataset = type_to_dataset(query.get('type', ''))

    results = match(query.get('query', ''), dataset)[:limit]
    entities = Entity.id_map(dataset, map(lambda (c,e,s): e, results))
    matches = []
    skip = False
    for (candidate, entity_id, score) in results:
        entity = entities[entity_id]

        for key, fv in filters:
            if entity.data.get(key) != fv:
                skip = True
        if skip:
            continue

        id = url_for('entity.view', dataset=dataset.name, entity=entity.id)
        uri = url_for('entity.view', dataset=dataset.name, entity=entity.id, _external=True)
        matches.append({
            'name': entity.name,
            'score': score,
            'type': [{
                'id': '/' + dataset.name,
                'name': dataset.label
                }],
            'id': id,
            'uri': uri,
            'match': score==100
            })
    return {
        'result': matches, 
        'num': len(results)
        }