Source code for app.model.lib.search_queries
"""
This module contains the main function that performs the search query. In the
long run, it should be replaced by something that uses a full-text search and
is less complicated.
"""
[docs]
def dynamical_query(all_advance_query):
base_query = "SELECT DISTINCT publicId"
search_final_query = ""
values = []
for query_dict in all_advance_query:
where_clause = ""
if not query_dict['option']:
query_dict['option'] = 'Study Name'
if query_dict['option'] == 'Project Name':
project_name = query_dict['value'].strip().lower()
if project_name != '':
where_clause = f"""
FROM Studies
WHERE projectUuid IN (
SELECT uuid
FROM Projects
WHERE LOWER(name) LIKE :value_{len(values)}
)
"""
values.append(f'%{project_name}%')
elif query_dict['option'] == 'Project ID':
project_id = query_dict['value'].strip()
where_clause = f"""
FROM Studies
WHERE projectUuid IN (
SELECT uuid
FROM Projects
WHERE publicId = :value_{len(values)}
)
"""
values.append(project_id)
elif query_dict['option'] == 'Study Name':
study_name = query_dict['value'].strip().lower()
if study_name != '':
where_clause = f"""
FROM Studies
WHERE LOWER(name) LIKE :value_{len(values)}
"""
values.append(f"%{study_name}%")
elif query_dict['option'] == 'Study ID':
study_id = query_dict['value'].strip()
where_clause = f"""
FROM Studies
WHERE publicId = :value_{len(values)}
"""
values.append(study_id)
elif query_dict['option'] == 'Microbial Strain':
microb_strain = query_dict['value'].strip().lower()
# Note: Creating a nested query so that "Strains.studyId" can be
# renamed to "publicId"
where_clause = f"""
FROM (
SELECT studyId as publicId, name, ncbiId
FROM StudyStrains
) as Strains_Alias
WHERE LOWER(name) LIKE :value_{len(values)}
"""
values.append(f"%{microb_strain}%")
elif query_dict['option'] == 'NCBI ID':
microb_ID = query_dict['value'].strip()
where_clause = f"""
FROM (
SELECT studyId as publicId, name, ncbiId
FROM StudyStrains
) as Strains_Alias
WHERE ncbiId = :value_{len(values)}
"""
values.append(microb_ID)
elif query_dict['option'] == 'Metabolites':
metabo = query_dict['value'].strip().lower()
where_clause = f"""
FROM (
SELECT
studyId as publicId,
Metabolites.name as name,
Metabolites.chebiId
FROM StudyMetabolites
INNER JOIN Metabolites ON Metabolites.chebiId = StudyMetabolites.chebiId
) as StudyMetabolites_Alias
WHERE LOWER(name) LIKE :value_{len(values)}
"""
values.append(f"%{metabo}%")
elif query_dict['option'] == 'chEBI ID':
chebi_id = query_dict['value'].strip()
if not chebi_id.startswith('CHEBI:'):
chebi_id = f"CHEBI:{chebi_id}"
where_clause = f"""
FROM (
SELECT
studyId as publicId,
Metabolites.name as name,
Metabolites.chebiId
FROM StudyMetabolites
INNER JOIN Metabolites ON Metabolites.chebiId = StudyMetabolites.chebiId
) as StudyMetabolites_Alias
WHERE chebiId = :value_{len(values)}
"""
values.append(chebi_id)
else:
raise ValueError(f"Unknown option: {query_dict['option']}")
logic_add = ""
if 'logic_operator' in query_dict:
if query_dict['logic_operator'] == 'AND':
logic_add = " AND publicId IN ("
if query_dict['logic_operator'] == 'OR':
logic_add = " OR publicId IN ("
if query_dict['logic_operator'] == 'NOT':
logic_add = " AND publicId NOT IN ("
if logic_add != "":
final_query = logic_add + " " + base_query + " " + where_clause + " )"
else:
final_query = base_query + " " + where_clause + " "
search_final_query += final_query
search_final_query = search_final_query + ";"
return search_final_query, values