def consume_params(self, raw_params): value = raw_params.pop(self.param, None) if value: return filters.OR( filters.AND(filters.NOT(filters.missing(self.param)), filters.range_filter(self.param, **value)), filters.AND(filters.missing(self.param), filters.range_filter("received_on", **value)))
class NumericFilterValue(FilterValue): DBSpecificFilter = namedtuple('DBSpecificFilter', ['sql', 'es']) operators_to_filters = { '=': DBSpecificFilter(EQFilter, filters.term), '!=': DBSpecificFilter(NOTEQFilter, filters.not_term), 'distinct from': DBSpecificFilter(IsDistinctFromFilter, filters.not_term), '>=': DBSpecificFilter( GTEFilter, lambda field, val: filters.range_filter(field, gte=val)), '>': DBSpecificFilter( GTFilter, lambda field, val: filters.range_filter(field, gt=val)), '<=': DBSpecificFilter( LTEFilter, lambda field, val: filters.range_filter(field, lte=val)), '<': DBSpecificFilter( LTFilter, lambda field, val: filters.range_filter(field, lt=val)), } def __init__(self, filter, value): assert filter.type == "numeric" assert (isinstance(value, dict) and "operator" in value and "operand" in value) or value is None if value: assert value['operator'] in self.operators_to_filters assert isinstance(value['operand'], int) or isinstance( value['operand'], float) super(NumericFilterValue, self).__init__(filter, value) def to_sql_filter(self): if self.value is None: return None filter_class = self.operators_to_filters[self.value['operator']].sql return filter_class(self.filter.field, self.filter.slug) def to_sql_values(self): if self.value is None: return {} return { self.filter.slug: self.value["operand"], } def to_es_filter(self): if self.value is None: return None filter_class = self.operators_to_filters[self.value['operator']].es return filter_class(self.filter.field, self.value['operand'])
def _get_cursor_query(domain, params, last_date, last_id): query = _get_query(domain, params) return query.filter( filters.OR( filters.AND( filters.term('@indexed_on', last_date), filters.range_filter('_id', gt=last_id), ), case_search.indexed_on(gt=last_date), ) )
def dots_submissions_by_case(case_id, query_date, username=None): """ Actually run query for username submissions todo: do terms for the pact_ids instead of individual term? """ xform_es = ReportFormESView(PACT_DOMAIN) script_fields = { "doc_id": get_report_script_field('_id', is_known=True), "pact_id": get_report_script_field("form.pact_id"), "encounter_date": get_report_script_field('form.encounter_date'), "username": get_report_script_field('form.meta.username', is_known=True), "visit_type": get_report_script_field('form.visit_type'), "visit_kept": get_report_script_field('form.visit_kept'), "contact_type": get_report_script_field('form.contact_type'), "observed_art": get_report_script_field('form.observed_art'), "observed_non_art": get_report_script_field('form.observed_non_art'), "observer_non_art_dose": get_report_script_field('form.observed_non_art_dose'), "observed_art_dose": get_report_script_field('form.observed_art_dose'), "pillbox_check": get_report_script_field('form.pillbox_check.check'), "scheduled": get_report_script_field('form.scheduled'), } term_block = {'form.#type': 'dots_form'} if username is not None: term_block['form.meta.username'] = username query = (get_by_case_id_form_es_query(0, 1, case_id).filter( filters.range_filter('form.encounter_date.#value', gte=query_date, lte=query_date)).sort('received_on').raw_query) query['script_fields'] = script_fields res = xform_es.run_query(query) print(json.dumps(res, indent=2)) return res