Source code for allensdk.brain_observatory.ecephys.ecephys_project_api.utilities
import copy as cp
from jinja2 import Environment, BaseLoader, DictLoader
[docs]def macros():
return {
"macros": """
{%- macro comma_sep(data, quote=False) -%}
{%- for datum in data -%}
{% if quote%}\'{%endif -%}
{{datum}}
{%- if quote %}\'{% endif %}
{% if not loop.last %},{% endif %}
{%- endfor -%}
{%- endmacro -%}
{%- macro str(x) -%}
{{- x ~ "" -}}
{%- endmacro -%}
"""
}
[docs]def postgres_macros():
return {
"postgres_macros": """
{% import 'macros' as m %}
{% macro optional_contains(key, data, quote=False) %}
{% if data is not none -%}
and {{key}} in ({{m.comma_sep(data, quote)}})
{% endif %}
{% endmacro %}
{% macro optional_equals(key, value) %}
{% if value is not none -%}
and {{key}} = {{value}}
{% endif %}
{% endmacro %}
{% macro optional_not_null(key, value=True) %}
{% if value is not none -%}
and {{key}} is {{- ' not ' if value -}} null
{% endif %}
{% endmacro %}
{% macro optional_le(key, value) %}
{% if value is not none -%}
and {{key}} <= {{value}}
{% endif %}
{% endmacro %}
{% macro optional_ge(key, value) %}
{% if value is not none -%}
and {{key}} >= {{value}}
{% endif %}
{% endmacro %}
""",
"macros": macros()["macros"]
}
[docs]def rma_macros():
return {
"rma_macros": """
{% import 'macros' as m %}
{% macro optional_contains(key, data, quote=False) -%}
{%- if data is not none %}[{{key}}$in{{m.comma_sep(data,quote)}}]{% endif -%}
{%- endmacro -%}
""",
"macros": macros()["macros"]
}
[docs]def build_and_execute(query, base=None, engine=None, **kwargs):
env = build_environment({"__tmp__": query}, base=base)
return execute_templated(env, "__tmp__", engine=engine, **kwargs)
[docs]def build_environment(template_strings, base=None):
if base is None:
base = {}
else:
base = cp.deepcopy(base)
base.update(template_strings)
return Environment(loader=DictLoader(base), lstrip_blocks=True, trim_blocks=True)
[docs]def execute_templated(environment, name, engine, engine_kwargs=None, **kwargs):
if engine_kwargs is None:
engine_kwargs = {}
template = environment.get_template(name)
rendered = template.render(**kwargs)
return engine(rendered)