def test_round_range(): start, end, interval = get_constrained_date_range({"statsPeriod": "2d"}) assert start == datetime(2018, 12, 9, 4, tzinfo=pytz.utc) assert end == datetime(2018, 12, 11, 3, 22, tzinfo=pytz.utc) start, end, interval = get_constrained_date_range({ "statsPeriod": "2d", "interval": "1d" }) assert start == datetime(2018, 12, 10, tzinfo=pytz.utc) assert end == datetime(2018, 12, 11, 3, 22, tzinfo=pytz.utc)
def test_inclusive_end(): start, end, interval = get_constrained_date_range( { "start": "2021-02-24T00:00:00", "end": "2021-02-25T00:00:00", "interval": "1h" }, ) assert start == datetime(2021, 2, 24, tzinfo=pytz.utc) assert end == datetime(2021, 2, 25, 1, tzinfo=pytz.utc)
def test_round_exact(): start, end, interval = get_constrained_date_range( { "start": "2021-01-12T04:06:16", "end": "2021-01-17T08:26:13", "interval": "1d" }, ) assert start == datetime(2021, 1, 12, tzinfo=pytz.utc) assert end == datetime(2021, 1, 18, tzinfo=pytz.utc)
def __init__( self, query: QueryDict, params: Mapping[Any, Any], allow_minute_resolution: Optional[bool] = True, ): raw_fields = query.getlist("field", []) raw_groupby = query.getlist("groupBy", []) if len(raw_fields) == 0: raise InvalidField('At least one "field" is required.') self.fields = {} self.query: List[Any] = [] # not used but needed for compat with sessions logic allowed_resolution = ( AllowedResolution.one_minute if allow_minute_resolution else AllowedResolution.one_hour ) start, end, rollup = get_constrained_date_range(query, allowed_resolution) self.dataset, self.match = _outcomes_dataset(rollup) self.rollup = rollup self.start = start self.end = end self.select_params = [] for key in raw_fields: if key not in COLUMN_MAP: raise InvalidField(f'Invalid field: "{key}"') field = COLUMN_MAP[key] self.select_params.append(field.select_params(self.dataset)) self.fields[key] = field self.groupby = [] for key in raw_groupby: if key not in GROUPBY_MAP: raise InvalidField(f'Invalid groupBy: "{key}"') self.groupby.append(GROUPBY_MAP[key]) if len(query.getlist("category", [])) == 0 and "category" not in raw_groupby: raise InvalidQuery("Query must have category as groupby or filter") query_columns = set() for field in self.fields.values(): query_columns.update(field.get_snuba_columns(raw_groupby)) for groupby in self.groupby: query_columns.update(groupby.get_snuba_columns()) self.query_columns = list(query_columns) query_groupby = set() for groupby in self.groupby: query_groupby.update(groupby.get_snuba_groupby()) self.query_groupby = list(query_groupby) self.group_by = [] for key in self.query_groupby: self.group_by.append(Column(key)) self.conditions = self.get_conditions(query, params)
def __init__(self, query_params, allow_minute_resolution=False): self.query = query_params.get("query", "") raw_fields = query_params.getlist("field", []) self.groupby = query_params.getlist("groupBy", []) if len(raw_fields) == 0: raise InvalidField('Request is missing a "field"') self.fields = {key: parse_field(key) for key in raw_fields} start, end, rollup = get_constrained_date_range( query_params, allow_minute_resolution, max_points=MAX_POINTS) self.rollup = rollup self.start = start self.end = end
def test_invalid_interval(): with pytest.raises(InvalidParams): start, end, interval = get_constrained_date_range({"interval": "0d"})