Skip to content

Commit 96e9d36

Browse files
committed
support Query.param() on linked entities
1 parent 34a6568 commit 96e9d36

File tree

4 files changed

+43
-22
lines changed

4 files changed

+43
-22
lines changed

objectbox/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## latest
22

3+
* Add support for `Query.param()` on linked entities.
34
* Fix generated `openStore()` for apps that don't enable null-safety yet.
45

56
## 1.1.0 (2021-07-06)

objectbox/lib/src/native/query/params.dart

+22-20
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
part of query;
22

33
/// Adds capabilities to set query parameters
4-
extension QuerySetParam<EntityT> on Query<EntityT> {
4+
extension QuerySetParam on Query {
55
/// Allows overwriting a query condition value, making queries reusable.
66
///
77
/// Example for a property that's used only once in a query (no alias needed):
@@ -35,18 +35,24 @@ extension QuerySetParam<EntityT> on Query<EntityT> {
3535
/// ..param(Person_.name, alias: 'end').value = 'b';
3636
/// final people = app.query.find();
3737
/// ```
38-
QueryParam<DartType> param<DartType>(QueryProperty<EntityT, DartType> prop,
38+
QueryParam<DartType> param<EntityT, DartType>(
39+
QueryProperty<EntityT, DartType> prop,
3940
{String? alias}) =>
40-
QueryParam._(this, prop, alias);
41+
QueryParam._(
42+
this,
43+
InternalStoreAccess.entityDef<EntityT>(_store).model.id.id,
44+
prop,
45+
alias);
4146
}
4247

4348
/// QueryParam
4449
class QueryParam<DartType> {
4550
final Query _query;
51+
final int _entityId;
4652
final QueryProperty _prop;
4753
final String? _alias;
4854

49-
QueryParam._(this._query, this._prop, this._alias);
55+
QueryParam._(this._query, this._entityId, this._prop, this._alias);
5056
}
5157

5258
/// QueryParam for string properties
@@ -56,7 +62,7 @@ extension QueryParamString on QueryParam<String> {
5662
withNativeString(
5763
value,
5864
(Pointer<Int8> cStr) => checkObx(C.query_param_string(
59-
_query._ptr, _query.entityId, _prop._model.id.id, cStr)));
65+
_query._ptr, _entityId, _prop._model.id.id, cStr)));
6066
} else {
6167
withNativeStrings(
6268
[_alias!, value],
@@ -69,7 +75,7 @@ extension QueryParamString on QueryParam<String> {
6975
values,
7076
(Pointer<Pointer<Int8>> ptr, int size) => checkObx((_alias == null)
7177
? C.query_param_strings(
72-
_query._ptr, _query.entityId, _prop._model.id.id, ptr, size)
78+
_query._ptr, _entityId, _prop._model.id.id, ptr, size)
7379
: withNativeString(
7480
_alias!,
7581
(Pointer<Int8> cAlias) => C.query_param_alias_strings(
@@ -82,7 +88,7 @@ extension QueryParamBytes on QueryParam<List<int>> {
8288
Uint8List.fromList(value),
8389
(Pointer<Uint8> ptr, int size) => checkObx((_alias == null)
8490
? C.query_param_bytes(
85-
_query._ptr, _query.entityId, _prop._model.id.id, ptr, size)
91+
_query._ptr, _entityId, _prop._model.id.id, ptr, size)
8692
: withNativeString(
8793
_alias!,
8894
(Pointer<Int8> cAlias) =>
@@ -92,8 +98,7 @@ extension QueryParamBytes on QueryParam<List<int>> {
9298
/// QueryParam for int properties
9399
extension QueryParamInt on QueryParam<int> {
94100
set value(int value) => checkObx((_alias == null)
95-
? C.query_param_int(
96-
_query._ptr, _query.entityId, _prop._model.id.id, value)
101+
? C.query_param_int(_query._ptr, _entityId, _prop._model.id.id, value)
97102
: withNativeString(
98103
_alias!,
99104
(Pointer<Int8> cAlias) =>
@@ -113,10 +118,10 @@ extension QueryParamInt on QueryParam<int> {
113118
}
114119
if (_alias == null) {
115120
checkObx(is64bit
116-
? C.query_param_int64s(_query._ptr, _query.entityId,
117-
_prop._model.id.id, ptr as Pointer<Int64>, values.length)
118-
: C.query_param_int32s(_query._ptr, _query.entityId,
119-
_prop._model.id.id, ptr as Pointer<Int32>, values.length));
121+
? C.query_param_int64s(_query._ptr, _entityId, _prop._model.id.id,
122+
ptr as Pointer<Int64>, values.length)
123+
: C.query_param_int32s(_query._ptr, _entityId, _prop._model.id.id,
124+
ptr as Pointer<Int32>, values.length));
120125
} else {
121126
withNativeString(
122127
_alias!,
@@ -133,8 +138,7 @@ extension QueryParamInt on QueryParam<int> {
133138

134139
/// set values for condition consisting of two values
135140
void twoValues(int a, int b) => checkObx((_alias == null)
136-
? C.query_param_2ints(
137-
_query._ptr, _query.entityId, _prop._model.id.id, a, b)
141+
? C.query_param_2ints(_query._ptr, _entityId, _prop._model.id.id, a, b)
138142
: withNativeString(
139143
_alias!,
140144
(Pointer<Int8> cAlias) =>
@@ -144,17 +148,15 @@ extension QueryParamInt on QueryParam<int> {
144148
/// QueryParam for double properties
145149
extension QueryParamDouble on QueryParam<double> {
146150
set value(double value) => checkObx((_alias == null)
147-
? C.query_param_double(
148-
_query._ptr, _query.entityId, _prop._model.id.id, value)
151+
? C.query_param_double(_query._ptr, _entityId, _prop._model.id.id, value)
149152
: withNativeString(
150153
_alias!,
151154
(Pointer<Int8> cAlias) =>
152155
C.query_param_alias_double(_query._ptr, cAlias, value)));
153156

154157
/// set values for condition consisting of two values
155158
void twoValues(double a, double b) => checkObx((_alias == null)
156-
? C.query_param_2doubles(
157-
_query._ptr, _query.entityId, _prop._model.id.id, a, b)
159+
? C.query_param_2doubles(_query._ptr, _entityId, _prop._model.id.id, a, b)
158160
: withNativeString(
159161
_alias!,
160162
(Pointer<Int8> cAlias) =>
@@ -165,7 +167,7 @@ extension QueryParamDouble on QueryParam<double> {
165167
extension QueryParamBool on QueryParam<bool> {
166168
set value(bool value) => checkObx((_alias == null)
167169
? C.query_param_int(
168-
_query._ptr, _query.entityId, _prop._model.id.id, value ? 1 : 0)
170+
_query._ptr, _entityId, _prop._model.id.id, value ? 1 : 0)
169171
: withNativeString(
170172
_alias!,
171173
(Pointer<Int8> cAlias) =>

objectbox/lib/src/native/query/query.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ import '../bindings/helpers.dart';
2020

2121
part 'builder.dart';
2222

23-
part 'property.dart';
24-
2523
part 'params.dart';
2624

25+
part 'property.dart';
26+
2727
// ignore_for_file: public_member_api_docs
2828

2929
/// Groups query order flags.

objectbox/test/query_test.dart

+18
Original file line numberDiff line numberDiff line change
@@ -832,4 +832,22 @@ void main() {
832832
fail('Invalid query: ' + q3.describeParameters());
833833
}
834834
});
835+
836+
test('set param on links', () async {
837+
final query = (box.query(TestEntity_.tString.equals(''))
838+
..link(TestEntity_.relB, RelatedEntityB_.tString.equals(''))
839+
..linkMany(TestEntity_.relManyA, RelatedEntityA_.tInt.equals(0)))
840+
.build();
841+
query
842+
..param(TestEntity_.tString).value = 'foo'
843+
..param(RelatedEntityB_.tString).value = 'bar'
844+
..param(RelatedEntityA_.tInt).value = 11;
845+
expect(
846+
query.describeParameters(),
847+
[
848+
'tString == "foo"',
849+
'| Link RelatedEntityB via relBId with conditions: tString == "bar"',
850+
'| Link RelatedEntityA via standalone Relation 1 (from entity 1 to 4) with conditions: tInt == 11',
851+
].join('\n'));
852+
});
835853
}

0 commit comments

Comments
 (0)