Skip to content

Commit fb2e926

Browse files
committed
query/condition: support for float scalar values #29
1 parent ce746bd commit fb2e926

3 files changed

Lines changed: 59 additions & 1 deletion

File tree

objectbox/condition.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ def _apply_gt(self, qb: QueryBuilder) -> obx_qb_cond:
162162
return qb.greater_than_string(self._property_id, value, case_sensitive)
163163
elif isinstance(value, int):
164164
return qb.greater_than_int(self._property_id, value)
165+
elif isinstance(value, float):
166+
return qb.greater_than_double(self._property_id, value)
165167
else:
166168
raise Exception(f"Unsupported type for 'GT': {type(value)}")
167169

@@ -172,6 +174,8 @@ def _apply_gte(self, qb: QueryBuilder) -> obx_qb_cond:
172174
return qb.greater_or_equal_string(self._property_id, value, case_sensitive)
173175
elif isinstance(value, int):
174176
return qb.greater_or_equal_int(self._property_id, value)
177+
elif isinstance(value, float):
178+
return qb.greater_or_equal_double(self._property_id, value)
175179
else:
176180
raise Exception(f"Unsupported type for 'GTE': {type(value)}")
177181

@@ -182,6 +186,8 @@ def _apply_lt(self, qb: QueryBuilder) -> obx_qb_cond:
182186
return qb.less_than_string(self._property_id, value, case_sensitive)
183187
elif isinstance(value, int):
184188
return qb.less_than_int(self._property_id, value)
189+
elif isinstance(value, float):
190+
return qb.less_than_double(self._property_id, value)
185191
else:
186192
raise Exception("Unsupported type for 'LT': " + str(type(value)))
187193

@@ -192,14 +198,18 @@ def _apply_lte(self, qb: QueryBuilder) -> obx_qb_cond:
192198
return qb.less_or_equal_string(self._property_id, value, case_sensitive)
193199
elif isinstance(value, int):
194200
return qb.less_or_equal_int(self._property_id, value)
201+
elif isinstance(value, float):
202+
return qb.less_or_equal_double(self._property_id, value)
195203
else:
196204
raise Exception(f"Unsupported type for 'LTE': {type(value)}")
197205

198206
def _apply_between(self, qb: QueryBuilder) -> obx_qb_cond:
199207
a = self._args['a']
200208
b = self._args['b']
201-
if isinstance(a, int):
209+
if isinstance(a, int) and isinstance(b, int):
202210
return qb.between_2ints(self._property_id, a, b)
211+
elif isinstance(a, float) or isinstance(b, float):
212+
return qb.between_2doubles(self._property_id, a, b)
203213
else:
204214
raise Exception(f"Unsupported type for 'BETWEEN': {type(a)}")
205215

objectbox/query_builder.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,26 +88,51 @@ def greater_than_int(self, prop: Union[int, str, Property], value: int) -> obx_q
8888
prop_id = self._entity.get_property_id(prop)
8989
cond = obx_qb_greater_than_int(self._c_builder, prop_id, value)
9090
return cond
91+
92+
def greater_than_double(self, prop: Union[int, str, Property], value: float) -> obx_qb_cond:
93+
prop_id = self._entity.get_property_id(prop)
94+
cond = obx_qb_greater_than_double(self._c_builder, prop_id, value)
95+
return cond
9196

9297
def greater_or_equal_int(self, prop: Union[int, str, Property], value: int) -> obx_qb_cond:
9398
prop_id = self._entity.get_property_id(prop)
9499
cond = obx_qb_greater_or_equal_int(self._c_builder, prop_id, value)
95100
return cond
101+
102+
def greater_or_equal_double(self, prop: Union[int, str, Property], value: float) -> obx_qb_cond:
103+
prop_id = self._entity.get_property_id(prop)
104+
cond = obx_qb_greater_or_equal_double(self._c_builder, prop_id, value)
105+
return cond
96106

97107
def less_than_int(self, prop: Union[int, str, Property], value: int) -> obx_qb_cond:
98108
prop_id = self._entity.get_property_id(prop)
99109
cond = obx_qb_less_than_int(self._c_builder, prop_id, value)
100110
return cond
111+
112+
def less_than_double(self, prop: Union[int, str, Property], value: float) -> obx_qb_cond:
113+
prop_id = self._entity.get_property_id(prop)
114+
cond = obx_qb_less_than_double(self._c_builder, prop_id, value)
115+
return cond
101116

102117
def less_or_equal_int(self, prop: Union[int, str, Property], value: int) -> obx_qb_cond:
103118
prop_id = self._entity.get_property_id(prop)
104119
cond = obx_qb_less_or_equal_int(self._c_builder, prop_id, value)
105120
return cond
121+
122+
def less_or_equal_double(self, prop: Union[int, str, Property], value: float) -> obx_qb_cond:
123+
prop_id = self._entity.get_property_id(prop)
124+
cond = obx_qb_less_or_equal_double(self._c_builder, prop_id, value)
125+
return cond
106126

107127
def between_2ints(self, prop: Union[int, str, Property], value_a: int, value_b: int) -> obx_qb_cond:
108128
prop_id = self._entity.get_property_id(prop)
109129
cond = obx_qb_between_2ints(self._c_builder, prop_id, value_a, value_b)
110130
return cond
131+
132+
def between_2doubles(self, prop: Union[int, str, Property], value_a: float, value_b: float) -> obx_qb_cond:
133+
prop_id = self._entity.get_property_id(prop)
134+
cond = obx_qb_between_2doubles(self._c_builder, prop_id, value_a, value_b)
135+
return cond
111136

112137
def nearest_neighbors_f32(self,
113138
prop: Union[int, str, Property],

tests/test_query.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,29 @@ def test_float_scalars():
216216
assert query.count() == 2
217217
assert query.find()[0].id == id1
218218
assert query.find()[1].id == id2
219+
220+
# Test float scalar values
221+
for p in props:
222+
prop = TestEntity.get_property(p)
223+
query = box_test_entity.query(prop.greater_or_equal(11.0)).build()
224+
assert query.count() == 2
225+
assert query.find()[0].id == id1
226+
assert query.find()[1].id == id2
227+
query = box_test_entity.query(prop.greater_than(12.0)).build()
228+
assert query.count() == 1
229+
assert query.find()[0].id == id2
230+
query = box_test_entity.query(prop.less_than(45.0)).build()
231+
assert query.count() == 1
232+
assert query.find()[0].id == id1
233+
query = box_test_entity.query(prop.less_or_equal(45.0)).build()
234+
assert query.count() == 2
235+
assert query.find()[0].id == id1
236+
assert query.find()[1].id == id2
237+
query = box_test_entity.query(prop.between(10.0,50.0)).build()
238+
assert query.count() == 2
239+
assert query.find()[0].id == id1
240+
assert query.find()[1].id == id2
241+
219242

220243
def test_flex_contains_key_value():
221244
store = create_test_store()

0 commit comments

Comments
 (0)