Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support RANGE query parameters #1827

Merged
merged 14 commits into from
Mar 4, 2024
Prev Previous commit
Next Next commit
lint
  • Loading branch information
Linchin committed Feb 24, 2024
commit c154622bdc6ca2525f0bb33926b06bd2f27706d1
135 changes: 68 additions & 67 deletions tests/unit/test_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@ def test_ctor_str(self):

def test_ctor_type(self):
from google.cloud.bigquery import ScalarQueryParameterType

scalar_type = ScalarQueryParameterType("DATE")
param_type = self._make_one(scalar_type, name="foo", description="bar")
self.assertEqual(param_type.type_._type, "DATE")
Expand All @@ -406,6 +407,7 @@ def test_ctor_unsupported_type_str(self):

def test_ctor_unsupported_type_type(self):
from google.cloud.bigquery import ScalarQueryParameterType

scalar_type = ScalarQueryParameterType("TIME")
with self.assertRaises(ValueError):
self._make_one(scalar_type)
Expand Down Expand Up @@ -769,7 +771,9 @@ def test_ctor(self):
from google.cloud.bigquery.query import RangeQueryParameterType

range_element_type = RangeQueryParameterType(type_="DATE")
param = self._make_one(range_element_type="DATE", start="2016-08-11", name="foo")
param = self._make_one(
range_element_type="DATE", start="2016-08-11", name="foo"
)
self.assertEqual(param.name, "foo")
self.assertEqual(param.range_element_type, range_element_type)
self.assertEqual(param.start, "2016-08-11")
Expand Down Expand Up @@ -885,6 +889,7 @@ def test_ctor_w_unsupported_query_parameter_type_str(self):

def test_ctor_w_unsupported_query_parameter_type_type(self):
from google.cloud.bigquery.query import RangeQueryParameterType

range_element_type = RangeQueryParameterType(type_="DATE")
range_element_type.type_._type = "TIME"
with self.assertRaises(ValueError):
Expand All @@ -899,7 +904,9 @@ def test_positional(self):

range_element_type = RangeQueryParameterType(type_="DATE")
klass = self._get_target_class()
param = klass.positional(range_element_type="DATE", start="2016-08-11", end="2016-08-12")
param = klass.positional(
range_element_type="DATE", start="2016-08-11", end="2016-08-12"
)
self.assertIs(param.name, None)
self.assertEqual(param.range_element_type, range_element_type)
self.assertEqual(param.start, "2016-08-11")
Expand All @@ -914,14 +921,11 @@ def test_from_api_repr_w_name(self):
"type": "RANGE",
"rangeElementType": {
"type": "DATE",
}
},
},
"parameterValue": {
"rangeValue": {
"start": {"value": None},
"end": {"value": "2020-12-31"}
}
}
"rangeValue": {"start": {"value": None}, "end": {"value": "2020-12-31"}}
},
}
klass = self._get_target_class()
param = klass.from_api_repr(RESOURCE)
Expand All @@ -933,19 +937,17 @@ def test_from_api_repr_w_name(self):

def test_from_api_repr_wo_name(self):
from google.cloud.bigquery.query import RangeQueryParameterType

RESOURCE = {
"parameterType": {
"type": "RANGE",
"rangeElementType": {
"type": "DATE",
}
},
},
"parameterValue": {
"rangeValue": {
"start": {"value": None},
"end": {"value": "2020-12-31"}
}
}
"rangeValue": {"start": {"value": None}, "end": {"value": "2020-12-31"}}
},
}
klass = self._get_target_class()
param = klass.from_api_repr(RESOURCE)
Expand All @@ -964,7 +966,7 @@ def test_from_api_repr_wo_value(self):
"type": "RANGE",
"rangeElementType": {
"type": "DATE",
}
},
},
}
range_element_type = RangeQueryParameterType(type_="DATE")
Expand All @@ -982,14 +984,11 @@ def test_to_api_repr_w_name(self):
"type": "RANGE",
"rangeElementType": {
"type": "DATE",
}
},
},
"parameterValue": {
"rangeValue": {
"start": {"value": None},
"end": {"value": "2016-08-11"}
}
}
"rangeValue": {"start": {"value": None}, "end": {"value": "2016-08-11"}}
},
}
param = self._make_one(range_element_type="DATE", end="2016-08-11", name="foo")
self.assertEqual(param.to_api_repr(), EXPECTED)
Expand All @@ -1000,14 +999,11 @@ def test_to_api_repr_wo_name(self):
"type": "RANGE",
"rangeElementType": {
"type": "DATE",
}
},
},
"parameterValue": {
"rangeValue": {
"start": {"value": None},
"end": {"value": "2016-08-11"}
}
}
"rangeValue": {"start": {"value": None}, "end": {"value": "2016-08-11"}}
},
}
klass = self._get_target_class()
param = klass.positional(range_element_type="DATE", end="2016-08-11")
Expand All @@ -1022,14 +1018,11 @@ def test_to_api_repr_w_date_date(self):
"type": "RANGE",
"rangeElementType": {
"type": "DATE",
}
},
},
"parameterValue": {
"rangeValue": {
"start": {"value": None},
"end": {"value": today_str}
}
}
"rangeValue": {"start": {"value": None}, "end": {"value": today_str}}
},
}
param = self._make_one(range_element_type="DATE", end=today, name="foo")
self.assertEqual(param.to_api_repr(), EXPECTED)
Expand All @@ -1040,14 +1033,14 @@ def test_to_api_repr_w_datetime_str(self):
"type": "RANGE",
"rangeElementType": {
"type": "DATETIME",
}
},
},
"parameterValue": {
"rangeValue": {
"start": {"value": None},
"end": {"value": "2020-01-01T12:00:00.000000"}
"end": {"value": "2020-01-01T12:00:00.000000"},
}
}
},
}
klass = self._get_target_class()
end_datetime = datetime.datetime(year=2020, month=1, day=1, hour=12)
Expand All @@ -1064,14 +1057,11 @@ def test_to_api_repr_w_datetime_datetime(self):
"type": "RANGE",
"rangeElementType": {
"type": "DATETIME",
}
},
},
"parameterValue": {
"rangeValue": {
"start": {"value": None},
"end": {"value": now_str}
}
}
"rangeValue": {"start": {"value": None}, "end": {"value": now_str}}
},
}
klass = self._get_target_class()
param = klass.positional(range_element_type="DATETIME", end=now)
Expand All @@ -1083,14 +1073,14 @@ def test_to_api_repr_w_timestamp_str(self):
"type": "RANGE",
"rangeElementType": {
"type": "TIMESTAMP",
}
},
},
"parameterValue": {
"rangeValue": {
"start": {"value": None},
"end": {"value": "2020-01-01 12:00:00+00:00"}
"end": {"value": "2020-01-01 12:00:00+00:00"},
}
}
},
}
klass = self._get_target_class()
end_timestamp = datetime.datetime(year=2020, month=1, day=1, hour=12)
Expand All @@ -1108,14 +1098,11 @@ def test_to_api_repr_w_timestamp_timestamp(self):
"type": "RANGE",
"rangeElementType": {
"type": "TIMESTAMP",
}
},
},
"parameterValue": {
"rangeValue": {
"start": {"value": None},
"end": {"value": now_str}
}
}
"rangeValue": {"start": {"value": None}, "end": {"value": now_str}}
},
}
klass = self._get_target_class()
param = klass.positional(range_element_type="TIMESTAMP", end=now)
Expand All @@ -1128,47 +1115,61 @@ def test_to_api_repr_wo_values(self):
"type": "RANGE",
"rangeElementType": {
"type": "DATE",
}
},
},
"parameterValue": {
"rangeValue": {
"start": {"value": None},
"end": {"value": None}
}
}
"rangeValue": {"start": {"value": None}, "end": {"value": None}}
},
}
param = self._make_one(range_element_type="DATE", name="foo")
self.assertEqual(param.to_api_repr(), EXPECTED)

def test_to_api_repr_unsupported_value_type(self):
with self.assertRaisesRegex(ValueError, "Cannot covert range element value from type"):
with self.assertRaisesRegex(
ValueError, "Cannot covert range element value from type"
Linchin marked this conversation as resolved.
Show resolved Hide resolved
):
range_param = self._make_one(
range_element_type="DATE",
start=datetime.date.today()
range_element_type="DATE", start=datetime.date.today()
)
range_param.range_element_type.type_._type = "LONG"
range_param.to_api_repr()

def test___eq__(self):
param = self._make_one(range_element_type="DATE", start="2016-08-11", name="foo")
param = self._make_one(
range_element_type="DATE", start="2016-08-11", name="foo"
)
self.assertEqual(param, param)
self.assertNotEqual(param, object())
alias = self._make_one(range_element_type="DATE", start="2016-08-11", name="bar")
alias = self._make_one(
range_element_type="DATE", start="2016-08-11", name="bar"
)
self.assertNotEqual(param, alias)
wrong_type = self._make_one(range_element_type="DATETIME", start="2020-12-31 12:00:00.000000", name="foo")
wrong_type = self._make_one(
range_element_type="DATETIME",
start="2020-12-31 12:00:00.000000",
name="foo",
)
self.assertNotEqual(param, wrong_type)
wrong_val = self._make_one(range_element_type="DATE", start="2016-08-12", name="foo")
wrong_val = self._make_one(
range_element_type="DATE", start="2016-08-12", name="foo"
)
self.assertNotEqual(param, wrong_val)

def test___eq___wrong_type(self):
param = self._make_one(range_element_type="DATE", start="2016-08-11", name="foo")
param = self._make_one(
range_element_type="DATE", start="2016-08-11", name="foo"
)
other = object()
self.assertNotEqual(param, other)
self.assertEqual(param, mock.ANY)

def test___eq___name_mismatch(self):
param = self._make_one(range_element_type="DATE", start="2016-08-11", name="foo")
other = self._make_one(range_element_type="DATE", start="2016-08-11", name="bar")
param = self._make_one(
range_element_type="DATE", start="2016-08-11", name="foo"
)
other = self._make_one(
range_element_type="DATE", start="2016-08-11", name="bar"
)
self.assertNotEqual(param, other)

def test___eq___field_type_mismatch(self):
Expand Down