def _get_filter_field(field_name, field_value): """ Return field to apply into filter, if an array then use a range, otherwise look for a term match """ filter_field = None if isinstance(field_value, ValueRange): range_values = {} if field_value.lower: range_values.update({"gte": field_value.lower_string}) if field_value.upper: range_values.update({"lte": field_value.upper_string}) filter_field = { "range": { field_name: range_values } } elif _is_iterable(field_value): filter_field = { "terms": { field_name: field_value } } else: filter_field = { "term": { field_name: field_value } } return filter_field
def _get_filter_field(field_name, field_value): """ Return field to apply into filter. If an array then use a range, otherwise look for a term match. """ filter_query_field = {"term": {field_name: field_value}} if isinstance(field_value, ValueRange): range_values = {} if field_value.lower: range_values["gte"] = field_value.lower_string if field_value.upper: range_values["lte"] = field_value.upper_string filter_query_field = { "range": { field_name: range_values } } elif _is_iterable(field_value): filter_query_field = { "terms": { field_name: field_value }, } return filter_query_field
def value_matches(doc, field_name, field_value): """ Does the document's field match the desired value, or is the field not present if include_blanks is True """ compare_value = _find_field(doc, field_name) if compare_value is None: return include_blanks # if we have a string that we are trying to process as a date object if isinstance(field_value, DateRange) or isinstance( field_value, datetime): if isinstance(compare_value, basestring): compare_value = json_date_to_datetime(compare_value) field_has_tz_info = False if isinstance(field_value, DateRange): field_has_tz_info = ((field_value.lower and field_value.lower.tzinfo is not None) or (field_value.upper and field_value.upper.tzinfo is not None)) else: field_has_tz_info = field_value.tzinfo is not None if not field_has_tz_info: compare_value = compare_value.replace(tzinfo=None) elif compare_value.tzinfo is None: compare_value = compare_value.replace(tzinfo=pytz.UTC) if isinstance(field_value, ValueRange): return ((field_value.lower is None or compare_value >= field_value.lower) and (field_value.upper is None or compare_value <= field_value.upper)) elif _is_iterable(compare_value) and not _is_iterable(field_value): return any((item == field_value for item in compare_value)) elif _is_iterable(field_value) and not _is_iterable(compare_value): return any((item == compare_value for item in field_value)) elif _is_iterable(compare_value) and _is_iterable(field_value): return any( (unicode(item) in field_value for item in compare_value)) else: return compare_value == field_value
def value_matches(doc, field_name, field_value): """ Does the document's field match the desired value, or is the field not present if include_blanks is True """ compare_value = _find_field(doc, field_name) if compare_value is None: return include_blanks # if we have a string that we are trying to process as a date object if isinstance(field_value, DateRange) or isinstance(field_value, datetime): if isinstance(compare_value, basestring): compare_value = json_date_to_datetime(compare_value) field_has_tz_info = False if isinstance(field_value, DateRange): field_has_tz_info = ( (field_value.lower and field_value.lower.tzinfo is not None) or (field_value.upper and field_value.upper.tzinfo is not None) ) else: field_has_tz_info = field_value.tzinfo is not None if not field_has_tz_info: compare_value = compare_value.replace(tzinfo=None) elif compare_value.tzinfo is None: compare_value = compare_value.replace(tzinfo=pytz.UTC) if isinstance(field_value, ValueRange): return ( (field_value.lower is None or compare_value >= field_value.lower) and (field_value.upper is None or compare_value <= field_value.upper) ) elif _is_iterable(compare_value) and not _is_iterable(field_value): return any((item == field_value for item in compare_value)) elif _is_iterable(field_value) and not _is_iterable(compare_value): return any((item == compare_value for item in field_value)) elif _is_iterable(compare_value) and _is_iterable(field_value): return any((unicode(item) in field_value for item in compare_value)) else: return compare_value == field_value