Skip to content

Commit 6f248d1

Browse files
committed
respect store-default query CaseSensitive value on property queries
1 parent ebe8cc6 commit 6f248d1

File tree

3 files changed

+50
-32
lines changed

3 files changed

+50
-32
lines changed

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,14 @@ class DoublePropertyQuery extends PropertyQuery<double> with _CommonNumeric {
209209

210210
/// "Property query" for a string field. Created by [Query.property()].
211211
class StringPropertyQuery extends PropertyQuery<String> {
212-
bool _caseSensitive = false;
212+
bool _caseSensitive;
213213

214-
StringPropertyQuery._(Pointer<OBX_query> query, int propertyId, int obxType)
215-
: super._(query, propertyId, obxType);
214+
StringPropertyQuery._(
215+
Store store, Pointer<OBX_query> query, int propertyId, int obxType)
216+
: _caseSensitive = InternalStoreAccess.queryCS(store),
217+
super._(query, propertyId, obxType);
216218

217-
/// Set to return case sensitive distinct values.
218-
///
219+
/// Use case-sensitive comparison when querying [distinct] values.
219220
/// E.g. returning "foo","Foo","FOO" instead of just "foo".
220221
set caseSensitive(bool caseSensitive) {
221222
_caseSensitive = caseSensitive;
@@ -231,6 +232,15 @@ class StringPropertyQuery extends PropertyQuery<String> {
231232
checkObx(C.query_prop_distinct_case(_cProp, d, _caseSensitive));
232233
}
233234

235+
/// Returns the count of non-null values.
236+
@override
237+
int count() {
238+
// native c-api currently doesn't respect case-sensitive with distinct
239+
// TODO Remove once this is fixed in all platforms (c-api ^0.13.1)
240+
if (_distinct && !_caseSensitive) return find().length;
241+
return super.count();
242+
}
243+
234244
@override
235245
List<String> find({String? replaceNullWith}) {
236246
final cDefault = replaceNullWith == null

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,8 @@ class Query<T> {
763763
qp._type == OBXPropertyType.Double) {
764764
return DoublePropertyQuery._(_cQuery, qp._propertyId, qp._type) as PQ;
765765
} else if (OBXPropertyType.String == qp._type) {
766-
return StringPropertyQuery._(_cQuery, qp._propertyId, qp._type) as PQ;
766+
return StringPropertyQuery._(_store, _cQuery, qp._propertyId, qp._type)
767+
as PQ;
767768
} else {
768769
throw Exception(
769770
'Property query: unsupported type (OBXPropertyType: ${qp._type})');

objectbox/test/query_property_test.dart

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ void main() {
3232
final strings = [
3333
'string',
3434
'another',
35-
'string',
35+
'String',
3636
'1withSuffix',
3737
'2withSuffix',
3838
'1withSuffix',
@@ -432,32 +432,39 @@ void main() {
432432
final query =
433433
box.query(tString.contains('t', caseSensitive: false)).build();
434434
final queryString = query.property(tString) as StringPropertyQuery;
435+
436+
final allStrings = queryString.find()..sort();
437+
print('All items: $allStrings');
438+
439+
final testStringPQ =
440+
({required bool distinct, required bool caseSensitive}) {
441+
queryString
442+
..distinct = distinct
443+
..caseSensitive = caseSensitive;
444+
final items = queryString.find()..sort();
445+
446+
final itemsDartMap =
447+
allStrings.map((s) => caseSensitive ? s : s.toLowerCase());
448+
final itemsDart =
449+
(distinct ? itemsDartMap.toSet() : itemsDartMap).toList()..sort();
450+
451+
expect(items.map((s) => caseSensitive ? s : s.toLowerCase()).toList(),
452+
sameAsList(itemsDart));
453+
if (queryString.count()!= itemsDart.length) {
454+
printOnFailure('$itemsDart');
455+
expect(queryString.count(), itemsDart.length);
456+
}
457+
};
458+
435459
expect(queryString.count(), 8);
436-
expect((queryString..distinct = true).count(), 5);
437-
expect(
438-
(queryString
439-
..distinct = false
440-
..caseSensitive = false)
441-
.count(),
442-
8);
443-
expect(
444-
(queryString
445-
..distinct = false
446-
..caseSensitive = true)
447-
.count(),
448-
8);
449-
expect(
450-
(queryString
451-
..distinct = true
452-
..caseSensitive = false)
453-
.count(),
454-
5);
455-
expect(
456-
(queryString
457-
..distinct = true
458-
..caseSensitive = true)
459-
.count(),
460-
5);
460+
461+
// test without setting "caseSensitive" (implies the default TRUE)
462+
expect((queryString..distinct = true).count(), 6);
463+
464+
testStringPQ(distinct: false, caseSensitive: false);
465+
testStringPQ(distinct: false, caseSensitive: true);
466+
testStringPQ(distinct: true, caseSensitive: false);
467+
testStringPQ(distinct: true, caseSensitive: true);
461468
queryString.close();
462469
query.close();
463470
});

0 commit comments

Comments
 (0)