def search_tags(self, request): """ API Endpoint to search global tags. Object disposed after request is completed. """ results_limit = 10 project_search_results = [] global_search_results = [] i = Index(name='tags') search_query = i.search(AutoCompleteTagDocument) if request.q: search_query = search_query.filter(n_grams=request.q) if request.project_id: search_query = search_query.filter(project_ids=request.project_id) project_search_results = list(search_query[:results_limit]) # get 5 global results or more if we don't have enough project # results if len(project_search_results) < (results_limit / 2): remaining = results_limit - len(project_search_results) else: remaining = results_limit / 2 # hack - need to get the search package to clone queries # shouldn't need to build up an entirely new object search_query = i.search(AutoCompleteTagDocument).filter( ~Q(project_ids=request.project_id)) if request.q: search_query = search_query.filter(n_grams=request.q) # get global results global_search_results = list(search_query[:remaining]) else: global_search_results = search_query[:results_limit] return TagSplitListResponse( project_tags=[ self.tag_document_mapper.map( tag, project_id=request.project_id) for tag in project_search_results ], global_tags=[ self.tag_document_mapper.map(tag) for tag in global_search_results ])