"""
Search for studies based on name, used metabolites, microbial strains, and
other criteria.
"""
from flask import (
g,
render_template,
request,
)
import sqlalchemy as sql
from app.view.forms.search_form import SearchForm, SearchFormClause
from app.model.lib.search import dynamical_query
from app.model.orm import (
Study,
StudyUser,
)
[docs]
def search_index_page():
form = SearchForm(request.args)
template_clause = SearchFormClause()
results = []
if form.data['clauses'] and form.data['clauses'][0]['value']:
if not form.data['clauses'][0]['option']:
form.data
query, values = dynamical_query(form.data['clauses'])
value_dict = {f"value_{i}": v for i, v in enumerate(values)}
studyIds = [
studyId for (studyId,)
in g.db_conn.execute(sql.text(query), value_dict)
]
if len(studyIds) == 0:
message = "Couldn't find a study with these parameters."
return render_template(
"pages/search/index.html",
form=form,
error=message,
template_clause=template_clause,
)
else:
if g.current_user:
publish_clause = sql.or_(
Study.isPublished,
StudyUser.userUniqueID == g.current_user.uuid
)
else:
publish_clause = Study.isPublished
# TODO (2025-04-15) Extract, test with multiple users
studyIds = g.db_session.scalars(
sql.select(Study.studyId)
.join(StudyUser, isouter=True)
.where(publish_clause)
.order_by(Study.updatedAt.desc())
.limit(5)
).all()
if studyIds:
query = sql.select(Study).where(Study.publicId.in_(studyIds))
results = g.db_session.scalars(query)
return render_template(
"pages/search/index.html",
form=form,
template_clause=template_clause,
results=results
)