Exemple #1
0
    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
            ])