def update_filters_labeller(project_id):
    '''
    Update filters for a labeller and receive the updated labeller state. 
    
    GET:
        project_id: ID for "link" project
    
    POST:
        module_params:
            must: #TODO: document
            must_not: #TODO: document
    '''
    _, module_params = _parse_request()
    
    logging.info('update_musts got:', module_params)
    must = module_params['must']    
    must_not = module_params['must_not'] 
    
    proj = ESLinker(project_id=project_id)
    labeller = proj.labeller_from_json()
    
    labeller.update_musts(must, must_not)
    
    proj.labeller_to_json(labeller)
    
    encoder = MyEncoder()
    return jsonify(error=False,
                   result=encoder.encode(labeller.to_emit()))
def update_targets_labeller(project_id):
    '''
    Update filters for a labeller and receive the updated labeller state. 
    
    GET:
        project_id: ID for "link" project
    
    POST:
        module_params:
            target_precision: value between 0 and 1 representing the minimal 
                acceptable value for precision (results with lower values will
                be strongly penalised)
            target_recall:value between 0 and 1 representing the minimal 
                acceptable value for recall (results with lower values will
                be strongly penalised)
    '''
    _, module_params = _parse_request()
    
    logging.info('update_musts got:', module_params)
    t_p = module_params['target_precision']    
    t_r = module_params['target_recall'] 
    
    proj = ESLinker(project_id=project_id)
    labeller = proj.labeller_from_json()
    
    labeller.update_targets(t_p, t_r)
    
    proj.labeller_to_json(labeller)
    
    encoder = MyEncoder()
    return jsonify(error=False,
                   result=encoder.encode(labeller.to_emit()))  
def update_labeller(project_id):
    '''
    Send an user input to the labeller and receive the updated labeller state    
    
    GET:
        project_id: ID for "link" project
    
    POST:
        module_params:
            user_input: #TODO: document
    '''
    _, module_params = _parse_request()
    logging.info(module_params)
    user_input = module_params['user_input']

    proj = ESLinker(project_id=project_id)
    labeller = proj.labeller_from_json()

    if labeller.answer_is_valid(user_input):
        labeller.update(user_input)
    else:
        raise ValueError('Answer received "{0}" is not valid'.format(user_input))
    
    proj.labeller_to_json(labeller)
        
    encoder = MyEncoder()
    return jsonify(error=False,
                   result=encoder.encode(labeller.to_emit()))
def add_search(project_id):
    '''
    # Perform search on specific user-specified terms
    
    GET:
        project_id: ID for "link" project
    
    POST:
        module_params:
            col_to_search: A dictionnary mapping the column name to query string
                Ex: [{'columns': ['col1', 'col2'], 'values_to_search': ['val1']}, ...]
            max_num_results: (optional) Max number of results for search
    '''
    _, module_params = _parse_request()
    
    proj = ESLinker(project_id)
    
    labeller = proj.labeller_from_json()
    
    # TODO: change this hack
    def temp(cols):
        if isinstance(cols, str):
            return cols
        elif isinstance(cols, list):
            return tuple(cols)
    pms = {temp(search['columns']): search['values_to_search'] for search in module_params['search']}
    labeller.add_custom_search(pms, module_params.get('max_num_results', 15))
    
    proj.labeller_to_json(labeller)
        
    encoder = MyEncoder()
    return jsonify(error=False,
                   result=encoder.encode(labeller.to_emit()))
def current_state(project_id):
    '''
    Get the current state for an ES labeller.
    
    GET:
        project_id: ID for "link" project
    '''
    # Generate necessary paths and create labeller
    proj = ESLinker(project_id=project_id)
    
    labeller = proj.labeller_from_json()

    encoder = MyEncoder()
    return jsonify(error=False,
                   result=encoder.encode(labeller.to_emit()))
def clear_search(project_id):
    '''
    Remove user search items from the list of next labeller proposals
    '''
    _, module_params = _parse_request()
    
    proj = ESLinker(project_id)
    
    labeller = proj.labeller_from_json()
    
    labeller.clear_custom_search()
    
    proj.labeller_to_json(labeller)
        
    encoder = MyEncoder()
    return jsonify(error=False,
                   result=encoder.encode(labeller.to_emit()))
def complete_training(project_id):
    '''
    # TODO: SOON deprecated 
    
    GET:
        project_id: ID for "link" project
    '''
    proj = ESLinker(project_id)

    logging.info('Writing train')
    labeller = proj.labeller_from_json()
    
    learned_settings = labeller.export_best_params()
    
    proj.add_es_learned_settings(learned_settings)
    logging.info('Wrote train')
    
    return jsonify(error=False)