@@ -150,7 +150,7 @@ def __init__(self, **data):
150150
151151def prefix_search (
152152 site : mwclient .client .Site , text : Union [str , SearchParam ]
153- ) -> List [str ]:
153+ ) -> Union [ List [str ], List [ dict ] ]:
154154 """Standard query. Equivalent to the following mediawiki API call
155155 api.php?action=query&list=prefixsearch&pssearch=Star Wars.
156156
@@ -165,15 +165,17 @@ def prefix_search(
165165
166166 Returns
167167 -------
168- page_list :
169- List of page titles
168+ result:
169+ With ``return_json=False`` (default): a flat list of page titles. With
170+ ``return_json=True``: a list of raw MediaWiki ``prefixsearch`` API response
171+ dicts, one per query (always a list, even for a single query).
170172 """
171173 if not isinstance (text , SearchParam ):
172174 query = SearchParam (query = text )
173175 else :
174176 query = text
175177
176- def prefix_search_ (single_text ):
178+ def prefix_search_ (single_text ) -> Union [ List [ str ], dict ] :
177179 page_list = list ()
178180 result = site .api (
179181 "query" ,
@@ -182,15 +184,16 @@ def prefix_search_(single_text):
182184 pslimit = query .limit ,
183185 format = "json" ,
184186 )
185- if len (result ["query" ]["prefixsearch" ]) == 0 :
187+ if query .debug and len (result ["query" ]["prefixsearch" ]) == 0 :
188+ print ("No results" )
189+ if query .return_json :
190+ return result
191+
192+ for page in result ["query" ]["prefixsearch" ]:
193+ title = page ["title" ]
186194 if query .debug :
187- print ("No results" )
188- else :
189- for page in result ["query" ]["prefixsearch" ]:
190- title = page ["title" ]
191- if query .debug :
192- print (title )
193- page_list .append (title )
195+ print (title )
196+ page_list .append (title )
194197 return page_list
195198
196199 if query .parallel :
@@ -200,11 +203,17 @@ def prefix_search_(single_text):
200203 else :
201204 query_results = [prefix_search_ (single_text = sq ) for sq in query .query ]
202205
206+ if query .return_json :
207+ # Each entry of query_results is the raw API response dict for one query.
208+ # Do not flatten dicts; always return the list of responses (one per query),
209+ # even when only a single query was passed.
210+ return query_results
211+
203212 return [item for sublist in query_results for item in sublist ]
204213 # todo: @Simon: a list of lists of strings (sublist for each query in query list)
205214 # or a list of strings (results of all queries combined)?
206215 # The last option would not change the behavior of the function, but would
207- # return page_list # original return
216+ # return page_list # original return
208217
209218
210219def semantic_search (
@@ -221,8 +230,10 @@ def semantic_search(
221230
222231 Returns
223232 -------
224- page_list:
225- List of page titles
233+ result:
234+ With ``return_json=False`` (default): a flat list of page-title fulltext
235+ strings. With ``return_json=True``: a list of raw SMW ``ask`` result dicts,
236+ one per query (always a list, even for a single query).
226237 """
227238 if not isinstance (query , SearchParam ):
228239 query = SearchParam (query = query )
@@ -231,27 +242,26 @@ def semantic_search_(single_query):
231242 page_list = list ()
232243 single_query += f"|limit={ query .limit } "
233244 result = site .api ("ask" , query = single_query , format = "json" )
234- if len ( result [ " query" ][ "results" ]) == 0 :
235- if query . debug :
245+ if query . debug :
246+ if len ( result [ " query" ][ "results" ]) == 0 :
236247 print ("Query '{}' returned no results" .format (single_query ))
237- else :
238- if query .debug :
248+ else :
239249 print (
240250 "Query '{}' returned {} results" .format (
241251 single_query , len (result ["query" ]["results" ])
242252 )
243253 )
244- if query .return_json :
245- return result
246-
247- for page in result ["query" ]["results" ].values ():
248- title = page ["fulltext" ]
249- exists = page ["exists" ]
250- if "#" not in title and query .debug :
251- print (title )
252- # original position of "page_list.append(title)" line
253- if exists == "1" :
254- page_list .append (title )
254+ if query .return_json :
255+ return result
256+
257+ for page in result ["query" ]["results" ].values ():
258+ title = page ["fulltext" ]
259+ exists = page ["exists" ]
260+ if "#" not in title and query .debug :
261+ print (title )
262+ # original position of "page_list.append(title)" line
263+ if exists == "1" :
264+ page_list .append (title )
255265 return page_list
256266
257267 if query .parallel :
@@ -261,6 +271,12 @@ def semantic_search_(single_query):
261271 else :
262272 query_results = [semantic_search_ (single_query = sq ) for sq in query .query ]
263273
274+ if query .return_json :
275+ # Each entry of query_results is the raw SMW result dict for one query.
276+ # Do not flatten dicts; always return the list of result dicts (one per
277+ # query), even when only a single query was passed.
278+ return query_results
279+
264280 return [item for sublist in query_results for item in sublist ]
265281 # todo: @Simon: a list of lists of strings (sublist for each query in query list)
266282 # or a list of strings (results of all queries combined)?
0 commit comments