@@ -27,6 +27,7 @@ from typing import Generator
2727from cython.operator import dereference, preincrement
2828from cpython.ref cimport PyObject
2929from cpython.buffer cimport PyBUF_WRITABLE
30+ from cython.operator import preincrement
3031
3132from libc.stdint cimport uint64_t
3233from libcpp.string cimport string
@@ -647,92 +648,85 @@ cdef class PyArchive:
647648 except RuntimeError as e:
648649 raise KeyError(str(e ))
649650
650- def suggest (self , query: str , start: int = 0 , end: int = 10 ) -> Generator[ str , None , None] :
651- """ Paths of suggested entries in the archive from a title query -> Generator[ str , None , None]
651+ def __repr__ (self ) -> str:
652+ return f"{self.__class__.__name__}( filename = { self .filename})"
652653
653- Parameters
654- ----------
655- query : str
656- Title query string
657- start : int
658- Iterator start (default 0)
659- end : end
660- Iterator end (default 10)
661- Returns
662- -------
663- Generator
664- Path of suggested entry """
665- # cdef wrapper.ZimSearch search = wrapper.ZimSearch(dereference(self .c_archive))
666- # search.set_suggestion_mode(True )
667- # search.set_query(query.encode('UTF-8'))
668- # search.set_range(start , end )
669654
670- # cdef wrapper.search_iterator it = search.begin()
671- # while it != search.end():
672- # yield it.get_path().decode('UTF-8')
673- # preincrement(it)
655+ #########################
656+ # Searcher #
657+ #########################
674658
675- def search ( self , query: str , start: int = 0 , end: int = 10 ) -> Generator[ str , None , None] :
676- """ Paths of entries in the archive from a search query -> Generator[ str , None , None]
659+ cdef class PyQuery :
660+ cdef wrapper.Query c_query
677661
678- Parameters
679- ----------
680- query : str
681- Query string
682- start : int
683- Iterator start (default 0)
684- end : end
685- Iterator end (default 10)
686- Returns
687- -------
688- Generator
689- Path of entry matching the search query """
662+ def set_query( self , query: str ):
663+ self .c_query.setQuery(query.encode( ' utf8 ' ))
664+
665+
666+ cdef class SearchResultSet:
667+ cdef wrapper.WSearchResultSet c_resultset
668+
669+ @ staticmethod
670+ cdef from_resultset(wrapper.WSearchResultSet _resultset):
671+ cdef SearchResultSet resultset = SearchResultSet()
672+ resultset.c_resultset = move(_resultset)
673+ return resultset
690674
691- # cdef wrapper.ZimSearch search = wrapper.ZimSearch(dereference(self .c_archive))
692- # search.set_suggestion_mode(False )
693- # search.set_query(query.encode('UTF-8'))
694- # search.set_range(start , end )
675+ def __iter__ (self ):
676+ cdef wrapper.SearchIterator current = self .c_resultset.begin()
677+ cdef wrapper.SearchIterator end = self .c_resultset.end()
678+ while current != end:
679+ yield current.getPath().decode(' UTF-8' )
680+ preincrement(current)
695681
696- # cdef wrapper.search_iterator it = search.begin()
697- # while it != search.end():
698- # yield it.get_path().decode('UTF-8')
699- # preincrement(it)
682+ cdef class Search:
683+ cdef wrapper.WSearch c_search
700684
701- def get_estimated_search_results_count (self , query: str ) -> int:
702- """ Estimated number of search results for a query -> int
685+ # Factory functions - Currently Cython can't use classmethods
686+ @staticmethod
687+ cdef from_search(wrapper.WSearch _search):
688+ """ Creates a python ReadArticle from a C++ Article (zim::) -> ReadArticle
703689
704690 Parameters
705691 ----------
706- query : str
707- Query string
692+ _item : Item
693+ A C++ Item
708694 Returns
709- -------
710- int
711- Estimated number of search results """
712- # cdef wrapper.ZimSearch search = wrapper.ZimSearch(dereference(self .c_archive))
713- # search.set_suggestion_mode(False )
714- # search.set_query(query.encode('UTF-8'))
715- # search.set_range(0, self.entry_count )
695+ ------
696+ Item
697+ Casted item """
698+ cdef Search search = Search()
699+ search.c_search = move(_search)
700+ return search
701+
702+ def getEstimatedMatches (self ):
703+ return self .c_search.getEstimatedMatches()
704+
705+ def getResults (self , start , count ):
706+ return SearchResultSet.from_resultset(move(self .c_search.getResults(start, count)))
707+
708+
709+ cdef class Searcher:
710+ """ Zim Archive Searcher
711+
712+ Attributes
713+ ----------
714+ *c_archive : Searcher
715+ a pointer to a C++ Searcher object
716+ """
716717
717- # return search.get_matches_estimated()
718+ cdef wrapper.WSearcher c_searcher
718719
719- def get_estimated_suggestions_results_count (self , query: str ) -> int :
720- """ Estimated number of suggestions for a query -> int
720+ def __cinit__ (self , object archive: PyArchive ) :
721+ """ Constructs an Archive from full zim file path
721722
722723 Parameters
723724 ----------
724- query : str
725- Query string
726- Returns
727- -------
728- int
729- Estimated number of article suggestions """
730- # cdef wrapper.ZimSearch search = wrapper.ZimSearch(dereference(self .c_archive))
731- # search.set_suggestion_mode(True )
732- # search.set_query(query.encode('UTF-8'))
733- # search.set_range(0, self.entry_count )
725+ filename : pathlib.Path
726+ Full path to a zim file """
734727
735- # return search.get_matches_estimated()
728+ self .c_searcher = move(wrapper.WSearcher(archive.c_archive))
729+
730+ def search (self , object query: PyQuery ):
731+ return Search.from_search(move(self .c_searcher.search(query.c_query)))
736732
737- def __repr__(self ) -> str:
738- return f"{self.__class__.__name__}(filename = {self .filename})"
0 commit comments