Fix whooshalchemy
Whooshalchemy was adding an event every time a new db session was created, thus increasing a lot the computation time at each new call. This is now fixed, and is a partial fix for #43.
This commit is contained in:
parent
a5aeadef86
commit
e0f8434877
@ -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()
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user