def _apply_date_criterion_to_column(column, criterion): ''' Decorate SQLAlchemy filter on given column using supplied criterion. Parse the datetime inside the criterion. ''' if isinstance(criterion, criteria.PlainSearchCriterion): min_date, max_date = util.parse_time_range(criterion.value) expr = column.between(min_date, max_date) elif isinstance(criterion, criteria.ArraySearchCriterion): expr = sqlalchemy.sql.false() for value in criterion.values: min_date, max_date = util.parse_time_range(value) expr = expr | column.between(min_date, max_date) elif isinstance(criterion, criteria.RangedSearchCriterion): assert criterion.min_value or criterion.max_value if criterion.min_value and criterion.max_value: min_date = util.parse_time_range(criterion.min_value)[0] max_date = util.parse_time_range(criterion.max_value)[1] expr = column.between(min_date, max_date) elif criterion.min_value: min_date = util.parse_time_range(criterion.min_value)[0] expr = column >= min_date elif criterion.max_value: max_date = util.parse_time_range(criterion.max_value)[1] expr = column <= max_date else: assert False if criterion.negated: expr = ~expr return expr
def apply_date_criterion_to_column( column: SaQuery, criterion: criteria.BaseCriterion) -> SaQuery: if isinstance(criterion, criteria.PlainCriterion): min_date, max_date = util.parse_time_range(criterion.value) expr = column.between(min_date, max_date) elif isinstance(criterion, criteria.ArrayCriterion): expr = sa.sql.false() for value in criterion.values: min_date, max_date = util.parse_time_range(value) expr = expr | column.between(min_date, max_date) elif isinstance(criterion, criteria.RangedCriterion): assert criterion.min_value or criterion.max_value if criterion.min_value and criterion.max_value: min_date = util.parse_time_range(criterion.min_value)[0] max_date = util.parse_time_range(criterion.max_value)[1] expr = column.between(min_date, max_date) elif criterion.min_value: min_date = util.parse_time_range(criterion.min_value)[0] expr = column >= min_date elif criterion.max_value: max_date = util.parse_time_range(criterion.max_value)[1] expr = column <= max_date else: assert False return expr
def test_parsing_date_time(fake_datetime, input, output): with fake_datetime("1997-01-02 03:04:05"): assert util.parse_time_range(input) == output
def test_parsing_empty_date_time(): with pytest.raises(errors.ValidationError): util.parse_time_range("")
def test_parsing_empty_date_time(): with pytest.raises(errors.ValidationError): util.parse_time_range('')
def test_parsing_date_time(fake_datetime, input, output): with fake_datetime('1997-01-02 03:04:05'): assert util.parse_time_range(input) == output