22
33from sqlalchemy import func , select
44from sqlalchemy .orm import Query , Session
5-
5+ from sqlalchemy . dialects . postgresql import array
66from shared .database .database import Database , with_db_session
77from shared .database .sql_functions .unaccent import unaccent
88from shared .database_gen .sqlacodegen_models import t_feedsearch
@@ -31,7 +31,9 @@ def get_parsed_search_tsquery(search_query: str) -> str:
3131 return func .plainto_tsquery ("english" , unaccent (parsed_query ))
3232
3333 @staticmethod
34- def add_search_query_filters (query , search_query , data_type , feed_id , status , is_official , features ) -> Query :
34+ def add_search_query_filters (
35+ query , search_query , data_type , feed_id , status , is_official , features , version
36+ ) -> Query :
3537 """
3638 Add filters to the search query.
3739 Filter values are trimmed and converted to lowercase.
@@ -58,6 +60,10 @@ def add_search_query_filters(query, search_query, data_type, feed_id, status, is
5860 query = query .where (t_feedsearch .c .official .is_ (True ))
5961 else :
6062 query = query .where (or_ (t_feedsearch .c .official .is_ (False ), t_feedsearch .c .official .is_ (None )))
63+ if version :
64+ versions_list = [v .strip ().lower () for v in version .split ("," ) if v ]
65+ if versions_list :
66+ query = query .where (t_feedsearch .c .versions .op ("?|" )(array (versions_list )))
6167 if search_query and len (search_query .strip ()) > 0 :
6268 query = query .filter (
6369 t_feedsearch .c .document .op ("@@" )(SearchApiImpl .get_parsed_search_tsquery (search_query ))
@@ -77,15 +83,16 @@ def create_count_search_query(
7783 feed_id : str ,
7884 data_type : str ,
7985 is_official : bool ,
80- search_query : str ,
8186 features ,
87+ version : str ,
88+ search_query : str ,
8289 ) -> Query :
8390 """
8491 Create a search query for the database.
8592 """
8693 query = select (func .count (t_feedsearch .c .feed_id ))
8794 return SearchApiImpl .add_search_query_filters (
88- query , search_query , data_type , feed_id , status , is_official , features
95+ query , search_query , data_type , feed_id , status , is_official , features , version
8996 )
9097
9198 @staticmethod
@@ -96,6 +103,7 @@ def create_search_query(
96103 is_official : bool ,
97104 search_query : str ,
98105 features : List [str ],
106+ version : str ,
99107 ) -> Query :
100108 """
101109 Create a search query for the database.
@@ -109,7 +117,7 @@ def create_search_query(
109117 * feed_search_columns ,
110118 )
111119 query = SearchApiImpl .add_search_query_filters (
112- query , search_query , data_type , feed_id , status , is_official , features
120+ query , search_query , data_type , feed_id , status , is_official , features , version
113121 )
114122 return query .order_by (rank_expression .desc ())
115123
@@ -122,12 +130,13 @@ def search_feeds(
122130 feed_id : str ,
123131 data_type : str ,
124132 is_official : bool ,
133+ version : str ,
125134 search_query : str ,
126- features : List [str ],
135+ feature : List [str ],
127136 db_session : "Session" ,
128137 ) -> SearchFeeds200Response :
129138 """Search feeds using full-text search on feed, location and provider's information."""
130- query = self .create_search_query (status , feed_id , data_type , is_official , search_query , features )
139+ query = self .create_search_query (status , feed_id , data_type , is_official , search_query , feature , version )
131140 feed_rows = Database ().select (
132141 session = db_session ,
133142 query = query ,
@@ -136,7 +145,9 @@ def search_feeds(
136145 )
137146 feed_total_count = Database ().select (
138147 session = db_session ,
139- query = self .create_count_search_query (status , feed_id , data_type , is_official , search_query , features ),
148+ query = self .create_count_search_query (
149+ status , feed_id , data_type , is_official , feature , version , search_query
150+ ),
140151 )
141152 if feed_rows is None or feed_total_count is None :
142153 return SearchFeeds200Response (
0 commit comments