def _make_query_from_terms(self, terms, limit=None):
        """ Creates a query for dataset from decomposed search terms.

        Args:
            terms (dict or unicode or string):

        Returns:
            tuple of (TextClause, dict): First element is FTS query, second is parameters
                of the query. Element of the execution of the query is pair: (vid, score).

        """

        expanded_terms = self._expand_terms(terms)

        if expanded_terms['doc']:
            # create query with real score.
            query_parts = ["SELECT vid, ts_rank_cd(setweight(doc,'C'), to_tsquery(:doc)) as score"]
        if expanded_terms['doc'] and expanded_terms['keywords']:
            query_parts = ["SELECT vid, ts_rank_cd(setweight(doc,'C'), to_tsquery(:doc)) "
                           " +  ts_rank_cd(setweight(to_tsvector(coalesce(keywords::text,'')),'B'), to_tsquery(:keywords))"
                           ' as score']
        else:
            # create query with score = 1 because query will not touch doc field.
            query_parts = ['SELECT vid, 1 as score']

        query_parts.append('FROM dataset_index')
        query_params = {}
        where_counter = 0

        if expanded_terms['doc']:
            where_counter += 1
            query_parts.append('WHERE doc @@ to_tsquery(:doc)')
            query_params['doc'] = self.backend._and_join(expanded_terms['doc'])

        if expanded_terms['keywords']:

            query_params['keywords'] = self.backend._and_join(expanded_terms['keywords'])

            kw_q = "to_tsvector(coalesce(keywords::text,'')) @@ to_tsquery(:keywords)"

            query_parts.append( ("AND " if where_counter else "WHERE ") + kw_q )


        query_parts.append('ORDER BY score DESC')
        if limit:
            query_parts.append('LIMIT :limit')
            query_params['limit'] = limit

        query_parts.append(';')
        deb_msg = 'Dataset terms conversion: `{}` terms converted to `{}` with `{}` params query.'\
            .format(terms, query_parts, query_params)
        logger.debug(deb_msg)


        q = text('\n'.join(query_parts)), query_params
        logger.debug('Dataset search query: {}'.format(q))
        return q
def _make_query_from_terms ( self , terms , limit = None ) : expanded_terms = self . _expand_terms ( terms ) if expanded_terms [ 'doc' ] : query_parts = [ "SELECT vid, ts_rank_cd(setweight(doc,'C'), to_tsquery(:doc)) as score" ] if expanded_terms [ 'doc' ] and expanded_terms [ 'keywords' ] : query_parts = [ "SELECT vid, ts_rank_cd(setweight(doc,'C'), to_tsquery(:doc)) " " +  ts_rank_cd(setweight(to_tsvector(coalesce(keywords::text,'')),'B'), to_tsquery(:keywords))" ' as score' ] else : query_parts = [ 'SELECT vid, 1 as score' ] query_parts . append ( 'FROM dataset_index' ) query_params = { } where_counter = 0 if expanded_terms [ 'doc' ] : where_counter += 1 query_parts . append ( 'WHERE doc @@ to_tsquery(:doc)' ) query_params [ 'doc' ] = self . backend . _and_join ( expanded_terms [ 'doc' ] ) if expanded_terms [ 'keywords' ] : query_params [ 'keywords' ] = self . backend . _and_join ( expanded_terms [ 'keywords' ] ) kw_q = "to_tsvector(coalesce(keywords::text,'')) @@ to_tsquery(:keywords)" query_parts . append ( ( "AND " if where_counter else "WHERE " ) + kw_q ) query_parts . append ( 'ORDER BY score DESC' ) if limit : query_parts . append ( 'LIMIT :limit' ) query_params [ 'limit' ] = limit query_parts . append ( ';' ) deb_msg = 'Dataset terms conversion: `{}` terms converted to `{}` with `{}` params query.' . format ( terms , query_parts , query_params ) logger . debug ( deb_msg ) q = text ( '\n' . join ( query_parts ) ) , query_params logger . debug ( 'Dataset search query: {}' . format ( q ) ) return q
Creates a query for dataset from decomposed search terms.

        Args:
            terms (dict or unicode or string):

        Returns:
            tuple of (TextClause, dict): First element is FTS query, second is parameters
                of the query. Element of the execution of the query is pair: (vid, score).