diff --git a/flatisfy/database/__init__.py b/flatisfy/database/__init__.py index 4092758..5c9704d 100644 --- a/flatisfy/database/__init__.py +++ b/flatisfy/database/__init__.py @@ -46,6 +46,12 @@ def init_db(database_uri=None, search_db_uri=None): BASE.metadata.create_all(engine, checkfirst=True) Session = sessionmaker(bind=engine) # pylint: disable=locally-disabled,invalid-name + if search_db_uri: + index_service = IndexService( + whoosh_base=search_db_uri + ) + index_service.register_class(flatisfy.models.flat.Flat) + @contextmanager def get_session(): # pylint: disable=locally-disabled,line-too-long @@ -57,12 +63,6 @@ def init_db(database_uri=None, search_db_uri=None): """ # pylint: enable=line-too-long,locally-disabled session = Session() - if search_db_uri: - index_service = IndexService( - whoosh_base=search_db_uri, - session=session - ) - index_service.register_class(flatisfy.models.flat.Flat) try: yield session session.commit() diff --git a/flatisfy/database/whooshalchemy.py b/flatisfy/database/whooshalchemy.py index af656bc..07cfc0d 100644 --- a/flatisfy/database/whooshalchemy.py +++ b/flatisfy/database/whooshalchemy.py @@ -31,8 +31,7 @@ from whoosh.qparser import MultifieldParser class IndexService(object): - def __init__(self, config=None, session=None, whoosh_base=None): - self.session = session + def __init__(self, config=None, whoosh_base=None): if not whoosh_base and config: whoosh_base = config.get("WHOOSH_BASE") if not whoosh_base: @@ -60,8 +59,7 @@ class IndexService(object): index = whoosh.index.create_in(index_path, schema) self.indexes[model_class.__name__] = index - model_class.search_query = Searcher(model_class, primary, index, - self.session) + model_class.search_query = Searcher(model_class, primary, index) return index def index_for_model_class(self, model_class): @@ -118,7 +116,6 @@ class IndexService(object): we update the whoosh index for the model. If no index exists, it will be created here; this could impose a penalty on the initial commit of a model. """ - for typ, values in self.to_update.items(): model_class = values[0][1].__class__ index = self.index_for_model_class(model_class) @@ -152,21 +149,15 @@ class Searcher(object): Assigned to a Model class as ``search_query``, which enables text-querying. """ - def __init__(self, model_class, primary, index, session=None): + def __init__(self, model_class, primary, index): self.model_class = model_class self.primary = primary self.index = index - self.session = session self.searcher = index.searcher() fields = set(index.schema._fields.keys()) - set([self.primary]) self.parser = MultifieldParser(list(fields), index.schema) - def __call__(self, query, limit=None): - session = self.session - # When using Flask, get the session from the query attached to the model class. - if not session: - session = self.model_class.query.session - + def __call__(self, session, query, limit=None): results = self.index.searcher().search( self.parser.parse(query), limit=limit) diff --git a/flatisfy/web/routes/api.py b/flatisfy/web/routes/api.py index b2b9a7e..e4e1018 100644 --- a/flatisfy/web/routes/api.py +++ b/flatisfy/web/routes/api.py @@ -220,7 +220,7 @@ def time_to_places_v1(config): } -def search_v1(config): +def search_v1(db, config): """ API v1 route to perform a fulltext search on flats. @@ -238,7 +238,7 @@ def search_v1(config): except (ValueError, KeyError): return bottle.HTTPError(400, "Invalid query provided.") - flats_db_query = flat_model.Flat.search_query(query) + flats_db_query = flat_model.Flat.search_query(db, query) flats = [ flat.json_api_repr() for flat in flats_db_query