def api_search(search_form, target_file=None, extra_parameters=False, merging_strategy='merge_optimized', resource=None): if search_form.cleaned_data['query'] == None and search_form.cleaned_data['filter'] == None and not search_form.cleaned_data['descriptors_filter'] and not search_form.cleaned_data['target'] and not target_file: # No input data for search, return empty results return [], 0, None, None, None, None, None if search_form.cleaned_data['query'] == None and search_form.cleaned_data['filter'] == None: # Standard content-based search try: results, count, note = similarity_api_search(target=search_form.cleaned_data['target'], filter=search_form.cleaned_data['descriptors_filter'], num_results=search_form.cleaned_data['page_size'], offset=(search_form.cleaned_data['page'] - 1) * search_form.cleaned_data['page_size'], target_file=target_file) gaia_ids = [result[0] for result in results] distance_to_target_data = None if search_form.cleaned_data['target'] or target_file: # Save sound distance to target into view class so it can be accessed by the serializer # We only do that when a target is specified (otherwise there is no meaningful distance value) distance_to_target_data = dict(results) gaia_count = count return gaia_ids, gaia_count, distance_to_target_data, None, note, None, None except SimilarityException, e: if e.status_code == 500: raise ServerErrorException(msg=e.message, resource=resource) elif e.status_code == 400: raise BadRequestException(msg=e.message, resource=resource) elif e.status_code == 404: raise NotFoundException(msg=e.message, resource=resource) else: raise ServerErrorException(msg='Similarity server error: %s' % e.message, resource=resource) except Exception, e: raise ServerErrorException(msg='The similarity server could not be reached or some unexpected error occurred.', resource=resource)
def get_gaia_results(search_form, target_file, page_size, max_pages, start_page=1, valid_ids=None, offset=None): gaia_ids = list() gaia_count = None distance_to_target_data = dict() note = None try: current_page = start_page n_page_requests = 1 # Iterate over gaia result pages while (len(gaia_ids) < gaia_count or gaia_count == None) and n_page_requests <= max_pages: if not offset: offset = (current_page - 1) * page_size results, count, note = similarity_api_search( target=search_form.cleaned_data['target'], filter=search_form.cleaned_data['descriptors_filter'], num_results=page_size, offset=offset, target_file=target_file, in_ids=valid_ids) gaia_ids += [id[0] for id in results] gaia_count = count if search_form.cleaned_data['target'] or target_file: # Save sound distance to target into so it can be later used in the view class and added to results distance_to_target_data.update(dict(results)) #print 'Gaia page %i (total %i sounds)' % (current_page, gaia_count) current_page += 1 n_page_requests += 1 except SimilarityException as e: if e.status_code == 500: raise ServerErrorException(msg=e.message) elif e.status_code == 400: raise BadRequestException(msg=e.message) elif e.status_code == 404: raise NotFoundException(msg=e.message) else: raise ServerErrorException(msg='Similarity server error: %s' % e.message) except Exception as e: raise ServerErrorException( msg= 'The similarity server could not be reached or some unexpected error occurred.' ) return gaia_ids, gaia_count, distance_to_target_data, note
def get_gaia_results(search_form, target_file, page_size, max_pages, start_page=1, valid_ids=None, offset=None): gaia_ids = list() gaia_count = None distance_to_target_data = dict() note = None try: current_page = start_page n_page_requests = 1 # Iterate over gaia result pages while (len(gaia_ids) < gaia_count or gaia_count == None) and n_page_requests <= max_pages: if not offset: offset = (current_page - 1) * page_size results, count, note = similarity_api_search(target=search_form.cleaned_data['target'], filter=search_form.cleaned_data['descriptors_filter'], num_results=page_size, offset=offset, target_file=target_file, in_ids=valid_ids) gaia_ids += [id[0] for id in results] gaia_count = count if search_form.cleaned_data['target'] or target_file: # Save sound distance to target into so it can be later used in the view class and added to results distance_to_target_data.update(dict(results)) #print 'Gaia page %i (total %i sounds)' % (current_page, gaia_count) current_page += 1 n_page_requests += 1 except SimilarityException as e: if e.status_code == 500: raise ServerErrorException(msg=e.message) elif e.status_code == 400: raise BadRequestException(msg=e.message) elif e.status_code == 404: raise NotFoundException(msg=e.message) else: raise ServerErrorException(msg='Similarity server error: %s' % e.message) except Exception as e: raise ServerErrorException(msg='The similarity server could not be reached or some unexpected error occurred.') return gaia_ids, gaia_count, distance_to_target_data, note
def api_search(search_form, target_file=None, extra_parameters=False, merging_strategy='merge_optimized', resource=None): if search_form.cleaned_data['query'] is None \ and search_form.cleaned_data['filter'] is None \ and not search_form.cleaned_data['descriptors_filter'] \ and not search_form.cleaned_data['target'] \ and not target_file: # No input data for search, return empty results return [], 0, None, None, None, None, None if search_form.cleaned_data['query'] is None and search_form.cleaned_data[ 'filter'] is None: # Standard content-based search try: results, count, note = similarity_api_search( target=search_form.cleaned_data['target'], filter=search_form.cleaned_data['descriptors_filter'], num_results=search_form.cleaned_data['page_size'], offset=(search_form.cleaned_data['page'] - 1) * search_form.cleaned_data['page_size'], target_file=target_file) gaia_ids = [result[0] for result in results] distance_to_target_data = None if search_form.cleaned_data['target'] or target_file: # Save sound distance to target into view class so it can be accessed by the serializer # We only do that when a target is specified (otherwise there is no meaningful distance value) distance_to_target_data = dict(results) gaia_count = count return gaia_ids, gaia_count, distance_to_target_data, None, note, None, None except SimilarityException as e: if e.status_code == 500: raise ServerErrorException(msg=e.message, resource=resource) elif e.status_code == 400: raise BadRequestException(msg=e.message, resource=resource) elif e.status_code == 404: raise NotFoundException(msg=e.message, resource=resource) else: raise ServerErrorException(msg='Similarity server error: %s' % e.message, resource=resource) except Exception as e: raise ServerErrorException( msg= 'The similarity server could not be reached or some unexpected error occurred.', resource=resource) elif not search_form.cleaned_data['descriptors_filter'] \ and not search_form.cleaned_data['target'] \ and not target_file: # Standard text-based search try: solr = Solr(settings.SOLR_URL) query = search_prepare_query( unquote(search_form.cleaned_data['query'] or ""), unquote(search_form.cleaned_data['filter'] or ""), search_form.cleaned_data['sort'], search_form.cleaned_data['page'], search_form.cleaned_data['page_size'], grouping=search_form.cleaned_data['group_by_pack'], include_facets=False) result = SolrResponseInterpreter(solr.select(unicode(query))) solr_ids = [element['id'] for element in result.docs] solr_count = result.num_found more_from_pack_data = None if search_form.cleaned_data['group_by_pack']: # If grouping option is on, store grouping info in a dictionary that we can add when serializing sounds more_from_pack_data = dict([(int(element['id']), [ element['more_from_pack'], element['pack_id'], element['pack_name'] ]) for element in result.docs]) return solr_ids, solr_count, None, more_from_pack_data, None, None, None except SolrException as e: if search_form.cleaned_data['filter'] is not None: raise BadRequestException( msg= 'Search server error: %s (please check that your filter syntax and field ' 'names are correct)' % e.message, resource=resource) raise BadRequestException(msg='Search server error: %s' % e.message, resource=resource) except Exception as e: raise ServerErrorException( msg= 'The search server could not be reached or some unexpected error occurred.', resource=resource) else: # Combined search (there is at least one of query/filter and one of descriptors_filter/target) # Strategies are implemented in 'combined_search_strategies' strategy = getattr(combined_search_strategies, merging_strategy) return strategy(search_form, target_file=target_file, extra_parameters=extra_parameters)
def api_search( search_form, target_file=None, extra_parameters=False, merging_strategy='merge_optimized', resource=None): if search_form.cleaned_data['query'] is None \ and search_form.cleaned_data['filter'] is None \ and not search_form.cleaned_data['descriptors_filter'] \ and not search_form.cleaned_data['target'] \ and not target_file: # No input data for search, return empty results return [], 0, None, None, None, None, None if search_form.cleaned_data['query'] is None and search_form.cleaned_data['filter'] is None: # Standard content-based search try: results, count, note = similarity_api_search( target=search_form.cleaned_data['target'], filter=search_form.cleaned_data['descriptors_filter'], num_results=search_form.cleaned_data['page_size'], offset=(search_form.cleaned_data['page'] - 1) * search_form.cleaned_data['page_size'], target_file=target_file) gaia_ids = [result[0] for result in results] distance_to_target_data = None if search_form.cleaned_data['target'] or target_file: # Save sound distance to target into view class so it can be accessed by the serializer # We only do that when a target is specified (otherwise there is no meaningful distance value) distance_to_target_data = dict(results) gaia_count = count return gaia_ids, gaia_count, distance_to_target_data, None, note, None, None except SimilarityException as e: if e.status_code == 500: raise ServerErrorException(msg=e.message, resource=resource) elif e.status_code == 400: raise BadRequestException(msg=e.message, resource=resource) elif e.status_code == 404: raise NotFoundException(msg=e.message, resource=resource) else: raise ServerErrorException(msg='Similarity server error: %s' % e.message, resource=resource) except Exception as e: raise ServerErrorException( msg='The similarity server could not be reached or some unexpected error occurred.', resource=resource) elif not search_form.cleaned_data['descriptors_filter'] \ and not search_form.cleaned_data['target'] \ and not target_file: # Standard text-based search try: solr = Solr(settings.SOLR_URL) query = search_prepare_query(unquote(search_form.cleaned_data['query'] or ""), unquote(search_form.cleaned_data['filter'] or ""), search_form.cleaned_data['sort'], search_form.cleaned_data['page'], search_form.cleaned_data['page_size'], grouping=search_form.cleaned_data['group_by_pack'], include_facets=False) result = SolrResponseInterpreter(solr.select(unicode(query))) solr_ids = [element['id'] for element in result.docs] solr_count = result.num_found more_from_pack_data = None if search_form.cleaned_data['group_by_pack']: # If grouping option is on, store grouping info in a dictionary that we can add when serializing sounds more_from_pack_data = dict([ (int(element['id']), [element['more_from_pack'], element['pack_id'], element['pack_name']]) for element in result.docs ]) return solr_ids, solr_count, None, more_from_pack_data, None, None, None except SolrException as e: if search_form.cleaned_data['filter'] is not None: raise BadRequestException(msg='Search server error: %s (please check that your filter syntax and field ' 'names are correct)' % e.message, resource=resource) raise BadRequestException(msg='Search server error: %s' % e.message, resource=resource) except Exception as e: raise ServerErrorException( msg='The search server could not be reached or some unexpected error occurred.', resource=resource) else: # Combined search (there is at least one of query/filter and one of descriptors_filter/target) # Strategies are implemented in 'combined_search_strategies' strategy = getattr(combined_search_strategies, merging_strategy) return strategy(search_form, target_file=target_file, extra_parameters=extra_parameters)