Skip to content

Commit 5df92a4

Browse files
committed
query: fix find_ids/find_with_scores, improve builder objectbox#24
1 parent 4720ab9 commit 5df92a4

File tree

2 files changed

+93
-58
lines changed

2 files changed

+93
-58
lines changed

objectbox/query.py

+12-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def find(self) -> list:
3030
# OBX_bytes_array
3131
c_bytes_array = c_bytes_array_p.contents
3232

33-
result = list()
33+
result = []
3434
for i in range(c_bytes_array.count):
3535
# OBX_bytes
3636
c_bytes = c_bytes_array.data[i]
@@ -44,7 +44,11 @@ def find_ids(self) -> List[int]:
4444
""" Finds a list of object IDs matching query. The result is sorted by ID (ascending order). """
4545
c_id_array_p = obx_query_find_ids(self._c_query)
4646
try:
47-
return list(c_id_array_p.contents)
47+
c_id_array: OBX_id_array = c_id_array_p.contents
48+
result = []
49+
for i in range(c_id_array.count):
50+
result.append(c_id_array.ids[i])
51+
return result
4852
finally:
4953
obx_id_array_free(c_id_array_p)
5054

@@ -57,8 +61,12 @@ def find_with_scores(self):
5761
c_bytes_score_array: OBX_bytes_score_array = c_bytes_score_array_p.contents
5862
result = []
5963
for i in range(c_bytes_score_array.count):
60-
# TODO implement
61-
pass
64+
c_bytes_score: OBX_bytes_score = c_bytes_score_array.bytes_scores[i]
65+
data = c_voidp_as_bytes(c_bytes_score.data, c_bytes_score.size)
66+
score = c_bytes_score.score
67+
68+
object_ = self._box._entity.unmarshal(data)
69+
result.append((object_, score))
6270
return result
6371
finally:
6472
obx_bytes_score_array_free(c_bytes_score_array_p)

objectbox/query_builder.py

+81-54
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import numpy as np
33
from typing import *
44

5+
from objectbox.model.properties import Property
56
from objectbox.objectbox import ObjectBox
67
from objectbox.query import Query
78
from objectbox.c import *
@@ -13,87 +14,113 @@ def __init__(self, ob: ObjectBox, box: 'Box'):
1314
self._entity = box._entity
1415
self._c_builder = obx_query_builder(ob._c_store, box._entity.id)
1516

17+
def _get_property_id(self, prop: Union[int, str, Property]) -> int:
18+
if type(prop) is int:
19+
return prop
20+
elif type(prop) is str:
21+
prop = self._entity.get_property(prop)
22+
return prop._id
23+
1624
def close(self) -> int:
17-
return obx_qb_close(self)
25+
return obx_qb_close(self._c_builder)
1826

1927
def error_code(self) -> int:
20-
return obx_qb_error_code(self)
21-
28+
return obx_qb_error_code(self._c_builder)
29+
2230
def error_message(self) -> str:
23-
return obx_qb_error_message(self)
24-
25-
def equals_string(self, property_id: int, value: str, case_sensitive: bool):
26-
obx_qb_equals_string(self._c_builder, property_id, c_str(value), case_sensitive)
31+
return obx_qb_error_message(self._c_builder)
32+
33+
def equals_string(self, prop: Union[int, str, Property], value: str, case_sensitive: bool = True):
34+
prop_id = self._get_property_id(prop)
35+
obx_qb_equals_string(self._c_builder, prop_id, c_str(value), case_sensitive)
2736
return self
28-
29-
def not_equals_string(self, property_id: int, value: str, case_sensitive: bool):
30-
obx_qb_not_equals_string(self._c_builder, property_id, c_str(value), case_sensitive)
37+
38+
def not_equals_string(self, prop: Union[int, str, Property], value: str, case_sensitive: bool = True):
39+
prop_id = self._get_property_id(prop)
40+
obx_qb_not_equals_string(self._c_builder, prop_id, c_str(value), case_sensitive)
3141
return self
32-
33-
def contains_string(self, property_id: int, value: str, case_sensitive: bool):
34-
obx_qb_contains_string(self._c_builder, property_id, c_str(value), case_sensitive)
42+
43+
def contains_string(self, prop: Union[int, str, Property], value: str, case_sensitive: bool = True):
44+
prop_id = self._get_property_id(prop)
45+
obx_qb_contains_string(self._c_builder, prop_id, c_str(value), case_sensitive)
3546
return self
36-
37-
def starts_with_string(self, property_id: int, value: str, case_sensitive: bool):
38-
obx_qb_starts_with_string(self._c_builder, property_id, c_str(value), case_sensitive)
47+
48+
def starts_with_string(self, prop: Union[int, str, Property], value: str, case_sensitive: bool = True):
49+
prop_id = self._get_property_id(prop)
50+
obx_qb_starts_with_string(self._c_builder, prop_id, c_str(value), case_sensitive)
3951
return self
40-
41-
def ends_with_string(self, property_id: int, value: str, case_sensitive: bool):
42-
obx_qb_ends_with_string(self._c_builder, property_id, c_str(value), case_sensitive)
52+
53+
def ends_with_string(self, prop: Union[int, str, Property], value: str, case_sensitive: bool = True):
54+
prop_id = self._get_property_id(prop)
55+
obx_qb_ends_with_string(self._c_builder, prop_id, c_str(value), case_sensitive)
4356
return self
44-
45-
def greater_than_string(self, property_id: int, value: str, case_sensitive: bool):
46-
obx_qb_greater_than_string(self._c_builder, property_id, c_str(value), case_sensitive)
57+
58+
def greater_than_string(self, prop: Union[int, str, Property], value: str, case_sensitive: bool = True):
59+
prop_id = self._get_property_id(prop)
60+
obx_qb_greater_than_string(self._c_builder, prop_id, c_str(value), case_sensitive)
4761
return self
48-
49-
def greater_or_equal_string(self, property_id: int, value: str, case_sensitive: bool):
50-
obx_qb_greater_or_equal_string(self._c_builder, property_id, c_str(value), case_sensitive)
62+
63+
def greater_or_equal_string(self, prop: Union[int, str, Property], value: str, case_sensitive: bool = True):
64+
prop_id = self._get_property_id(prop)
65+
obx_qb_greater_or_equal_string(self._c_builder, prop_id, c_str(value), case_sensitive)
5166
return self
52-
53-
def less_than_string(self, property_id: int, value: str, case_sensitive: bool):
54-
obx_qb_less_than_string(self._c_builder, property_id, c_str(value), case_sensitive)
67+
68+
def less_than_string(self, prop: Union[int, str, Property], value: str, case_sensitive: bool = True):
69+
prop_id = self._get_property_id(prop)
70+
obx_qb_less_than_string(self._c_builder, prop_id, c_str(value), case_sensitive)
5571
return self
56-
57-
def less_or_equal_string(self, property_id: int, value: str, case_sensitive: bool):
58-
obx_qb_less_or_equal_string(self._c_builder, property_id, c_str(value), case_sensitive)
72+
73+
def less_or_equal_string(self, prop: Union[int, str, Property], value: str, case_sensitive: bool = True):
74+
prop_id = self._get_property_id(prop)
75+
obx_qb_less_or_equal_string(self._c_builder, prop_id, c_str(value), case_sensitive)
5976
return self
60-
61-
def equals_int(self, property_id: int, value: int):
62-
obx_qb_equals_int(self._c_builder, property_id, value)
77+
78+
def equals_int(self, prop: Union[int, str, Property], value: int):
79+
prop_id = self._get_property_id(prop)
80+
obx_qb_equals_int(self._c_builder, prop_id, value)
6381
return self
64-
65-
def not_equals_int(self, property_id: int, value: int):
66-
obx_qb_not_equals_int(self._c_builder, property_id, value)
82+
83+
def not_equals_int(self, prop: Union[int, str, Property], value: int):
84+
prop_id = self._get_property_id(prop)
85+
obx_qb_not_equals_int(self._c_builder, prop_id, value)
6786
return self
68-
69-
def greater_than_int(self, property_id: int, value: int):
70-
obx_qb_greater_than_int(self._c_builder, property_id, value)
87+
88+
def greater_than_int(self, prop: Union[int, str, Property], value: int):
89+
prop_id = self._get_property_id(prop)
90+
obx_qb_greater_than_int(self._c_builder, prop_id, value)
7191
return self
72-
73-
def greater_or_equal_int(self, property_id: int, value: int):
74-
obx_qb_greater_or_equal_int(self._c_builder, property_id, value)
92+
93+
def greater_or_equal_int(self, prop: Union[int, str, Property], value: int):
94+
prop_id = self._get_property_id(prop)
95+
obx_qb_greater_or_equal_int(self._c_builder, prop_id, value)
7596
return self
76-
77-
def less_than_int(self, property_id: int, value: int):
78-
obx_qb_less_than_int(self._c_builder, property_id, value)
97+
98+
def less_than_int(self, prop: Union[int, str, Property], value: int):
99+
prop_id = self._get_property_id(prop)
100+
obx_qb_less_than_int(self._c_builder, prop_id, value)
79101
return self
80-
81-
def less_or_equal_int(self, property_id: int, value: int):
82-
obx_qb_less_or_equal_int(self._c_builder, property_id, value)
102+
103+
def less_or_equal_int(self, prop: Union[int, str, Property], value: int):
104+
prop_id = self._get_property_id(prop)
105+
obx_qb_less_or_equal_int(self._c_builder, prop_id, value)
83106
return self
84-
85-
def between_2ints(self, property_id: int, value_a: int, value_b: int):
86-
obx_qb_between_2ints(self._c_builder, property_id, value_a, value_b)
107+
108+
def between_2ints(self, prop: Union[int, str, Property], value_a: int, value_b: int):
109+
prop_id = self._get_property_id(prop)
110+
obx_qb_between_2ints(self._c_builder, prop_id, value_a, value_b)
87111
return self
88112

89-
def nearest_neighbors_f32(self, vector_property_id: int, query_vector: Union[np.ndarray, List[float]], element_count: int):
113+
def nearest_neighbors_f32(self, prop: Union[int, str, Property], query_vector: Union[np.ndarray, List[float]],
114+
element_count: int):
90115
if isinstance(query_vector, np.ndarray):
91116
if query_vector.dtype != np.float32:
92117
raise Exception(f"query_vector dtype must be float32")
93118
query_vector_data = query_vector.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
94119
else: # List[float]
95120
query_vector_data = (ctypes.c_float * len(query_vector))(*query_vector)
96-
obx_qb_nearest_neighbors_f32(self._c_builder, vector_property_id, query_vector_data, element_count)
121+
122+
prop_id = self._get_property_id(prop)
123+
obx_qb_nearest_neighbors_f32(self._c_builder, prop_id, query_vector_data, element_count)
97124
return self
98125

99126
def build(self) -> Query:

0 commit comments

Comments
 (0)