Skip to content

Commit 0544970

Browse files
committed
add Store constructor parameter queriesCaseSensitiveDefault in preparation to switch the default to TRUE
1 parent 41da628 commit 0544970

File tree

4 files changed

+87
-32
lines changed

4 files changed

+87
-32
lines changed

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

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -60,44 +60,44 @@ class QueryStringProperty extends QueryProperty {
6060
{required int entityId, required int propertyId, required int obxType})
6161
: super(entityId, propertyId, obxType);
6262

63-
Condition _op(String p, _ConditionOp cop, {required bool caseSensitive}) =>
63+
Condition _op(String p, _ConditionOp cop, {bool? caseSensitive}) =>
6464
_StringCondition(cop, this, p, null, caseSensitive: caseSensitive);
6565

6666
Condition _opList(List<String> list, _ConditionOp cop,
67-
{required bool caseSensitive}) =>
67+
{bool? caseSensitive}) =>
6868
_StringListCondition(cop, this, list, caseSensitive: caseSensitive);
6969

70-
Condition equals(String p, {bool caseSensitive = false}) =>
70+
Condition equals(String p, {bool? caseSensitive}) =>
7171
_op(p, _ConditionOp.eq, caseSensitive: caseSensitive);
7272

73-
Condition notEquals(String p, {bool caseSensitive = false}) =>
73+
Condition notEquals(String p, {bool? caseSensitive}) =>
7474
_op(p, _ConditionOp.notEq, caseSensitive: caseSensitive);
7575

76-
Condition endsWith(String p, {bool caseSensitive = false}) =>
76+
Condition endsWith(String p, {bool? caseSensitive}) =>
7777
_op(p, _ConditionOp.endsWith, caseSensitive: caseSensitive);
7878

79-
Condition startsWith(String p, {bool caseSensitive = false}) =>
79+
Condition startsWith(String p, {bool? caseSensitive}) =>
8080
_op(p, _ConditionOp.startsWith, caseSensitive: caseSensitive);
8181

82-
Condition contains(String p, {bool caseSensitive = false}) =>
82+
Condition contains(String p, {bool? caseSensitive}) =>
8383
_op(p, _ConditionOp.contains, caseSensitive: caseSensitive);
8484

85-
Condition inside(List<String> list, {bool caseSensitive = false}) =>
85+
Condition inside(List<String> list, {bool? caseSensitive}) =>
8686
_opList(list, _ConditionOp.inside, caseSensitive: caseSensitive);
8787

88-
Condition notIn(List<String> list, {bool caseSensitive = false}) =>
88+
Condition notIn(List<String> list, {bool? caseSensitive}) =>
8989
_opList(list, _ConditionOp.notIn, caseSensitive: caseSensitive);
9090

91-
Condition greaterThan(String p, {bool caseSensitive = false}) =>
91+
Condition greaterThan(String p, {bool? caseSensitive}) =>
9292
_op(p, _ConditionOp.gt, caseSensitive: caseSensitive);
9393

94-
Condition greaterOrEqual(String p, {bool caseSensitive = false}) =>
94+
Condition greaterOrEqual(String p, {bool? caseSensitive}) =>
9595
_op(p, _ConditionOp.greaterOrEq, caseSensitive: caseSensitive);
9696

97-
Condition lessThan(String p, {bool caseSensitive = false}) =>
97+
Condition lessThan(String p, {bool? caseSensitive}) =>
9898
_op(p, _ConditionOp.lt, caseSensitive: caseSensitive);
9999

100-
Condition lessOrEqual(String p, {bool caseSensitive = false}) =>
100+
Condition lessOrEqual(String p, {bool? caseSensitive}) =>
101101
_op(p, _ConditionOp.lessOrEq, caseSensitive: caseSensitive);
102102
}
103103

@@ -202,7 +202,7 @@ class QueryStringVectorProperty extends QueryProperty {
202202
{required int entityId, required int propertyId, required int obxType})
203203
: super(entityId, propertyId, obxType);
204204

205-
Condition contains(String p, {bool caseSensitive = false}) =>
205+
Condition contains(String p, {bool? caseSensitive}) =>
206206
_StringCondition(_ConditionOp.contains, this, p, null,
207207
caseSensitive: caseSensitive);
208208
}
@@ -314,20 +314,19 @@ abstract class _PropertyCondition<DartType> extends Condition {
314314
}
315315

316316
class _StringCondition extends _PropertyCondition<String> {
317-
final bool _caseSensitive;
317+
bool? caseSensitive;
318318

319319
_StringCondition(
320320
_ConditionOp op, QueryProperty prop, String value, String? value2,
321-
{required bool caseSensitive})
322-
: _caseSensitive = caseSensitive,
323-
super(op, prop, value, value2);
321+
{this.caseSensitive})
322+
: super(op, prop, value, value2);
324323

325324
int _op1(_QueryBuilder builder,
326325
int Function(Pointer<OBX_query_builder>, int, Pointer<Int8>, bool) func) {
327326
final cStr = _value.toNativeUtf8();
328327
try {
329328
return func(builder._cBuilder, _property._propertyId, cStr.cast(),
330-
_caseSensitive);
329+
caseSensitive ?? InternalStoreAccess.queryCS(builder._store));
331330
} finally {
332331
malloc.free(cStr);
333332
}
@@ -364,12 +363,11 @@ class _StringCondition extends _PropertyCondition<String> {
364363
}
365364

366365
class _StringListCondition extends _PropertyCondition<List<String>> {
367-
final bool _caseSensitive;
366+
bool? caseSensitive;
368367

369368
_StringListCondition(_ConditionOp op, QueryProperty prop, List<String> value,
370-
{required bool caseSensitive})
371-
: _caseSensitive = caseSensitive,
372-
super(op, prop, value);
369+
{this.caseSensitive})
370+
: super(op, prop, value);
373371

374372
int _inside(_QueryBuilder builder) {
375373
final func = C.qb_in_strings;
@@ -379,8 +377,12 @@ class _StringListCondition extends _PropertyCondition<List<String>> {
379377
for (var i = 0; i < _value.length; i++) {
380378
arrayOfCStrings[i] = _value[i].toNativeUtf8().cast<Int8>();
381379
}
382-
return func(builder._cBuilder, _property._propertyId, arrayOfCStrings,
383-
listLength, _caseSensitive);
380+
return func(
381+
builder._cBuilder,
382+
_property._propertyId,
383+
arrayOfCStrings,
384+
listLength,
385+
caseSensitive ?? InternalStoreAccess.queryCS(builder._store));
384386
} finally {
385387
for (var i = 0; i < _value.length; i++) {
386388
malloc.free(arrayOfCStrings.elementAt(i).value);

objectbox/lib/src/native/store.dart

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ class Store {
3232
/// whether this store was created from a pointer (won't close in that case)
3333
final bool _weak;
3434

35+
/// Default value for string query conditions [caseSensitive] argument.
36+
final bool _queriesCaseSensitiveDefault;
37+
3538
/// Creates a BoxStore using the model definition from your
3639
/// `objectbox.g.dart` file.
3740
///
@@ -48,9 +51,15 @@ class Store {
4851
/// ```
4952
///
5053
/// See our examples for more details.
54+
/// TODO have an Options class?
5155
Store(this._defs,
52-
{String? directory, int? maxDBSizeInKB, int? fileMode, int? maxReaders})
53-
: _weak = false {
56+
{String? directory,
57+
int? maxDBSizeInKB,
58+
int? fileMode,
59+
int? maxReaders,
60+
bool queriesCaseSensitiveDefault = false})
61+
: _weak = false,
62+
_queriesCaseSensitiveDefault = queriesCaseSensitiveDefault {
5463
var model = Model(_defs.model);
5564

5665
var opt = C.opt();
@@ -145,9 +154,11 @@ class Store {
145154
/// ...
146155
/// }
147156
/// ```
148-
Store.fromReference(this._defs, this._reference)
149-
: _weak = true // must not close the same native store twice
150-
{
157+
Store.fromReference(this._defs, this._reference,
158+
{bool queriesCaseSensitiveDefault = false})
159+
// must not close the same native store twice so [_weak]=true
160+
: _weak = true,
161+
_queriesCaseSensitiveDefault = queriesCaseSensitiveDefault {
151162
// see [reference] for serialization order
152163
final readPid = _reference.getUint64(0 * _int64Size);
153164
if (readPid != pid) {
@@ -253,6 +264,10 @@ class InternalStoreAccess {
253264
/// The low-level pointer to this store.
254265
@pragma('vm:prefer-inline')
255266
static Pointer<OBX_store> ptr(Store store) => store._ptr;
267+
268+
/// String query case-sensitive default
269+
@pragma('vm:prefer-inline')
270+
static bool queryCS(Store store) => store._queriesCaseSensitiveDefault;
256271
}
257272

258273
const _int64Size = 8;

objectbox/test/query_test.dart

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,39 @@ void main() {
9292
});
9393
});
9494

95+
test('string case-sensitivity', () {
96+
final testCaseSensitivity = (Box<TestEntity> box, bool defaultIsTrue) {
97+
box.put(TestEntity(tString: 'Hello'));
98+
box.put(TestEntity(tString: 'hello'));
99+
100+
final t = TestEntity_.tString;
101+
102+
final q1 = box.query(t.startsWith('hello')).build();
103+
expect(q1.count(), 1 + (defaultIsTrue ? 0 : 1));
104+
105+
final q2 = box.query(t.startsWith('hello', caseSensitive: true)).build();
106+
expect(q2.count(), 1);
107+
108+
final q3 = box.query(t.startsWith('Hello', caseSensitive: true)).build();
109+
expect(q3.count(), 1);
110+
111+
final q4 = box.query(t.endsWith('ello', caseSensitive: true)).build();
112+
expect(q4.count(), 2);
113+
114+
[q1, q2, q3, q4].forEach((q) => q.close());
115+
};
116+
final env1 = TestEnv('query1', queryCaseSensitive: true);
117+
final env2 = TestEnv('query1', queryCaseSensitive: false);
118+
119+
// current default: case insensitive
120+
testCaseSensitivity(env.box, false);
121+
testCaseSensitivity(env1.box, true);
122+
testCaseSensitivity(env2.box, false);
123+
124+
env1.close();
125+
env2.close();
126+
});
127+
95128
test('.count doubles and booleans', () {
96129
box.putMany(<TestEntity>[
97130
TestEntity(tDouble: 0.1, tBool: true),

objectbox/test/test_env.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,15 @@ class TestEnv {
99
final Directory dir;
1010
final Store store;
1111

12-
factory TestEnv(String name) {
12+
factory TestEnv(String name, {bool? queryCaseSensitive}) {
1313
final dir = Directory('testdata-' + name);
1414
if (dir.existsSync()) dir.deleteSync(recursive: true);
15-
return TestEnv._(dir, Store(getObjectBoxModel(), directory: dir.path));
15+
final store = queryCaseSensitive == null
16+
? Store(getObjectBoxModel(), directory: dir.path)
17+
: Store(getObjectBoxModel(),
18+
directory: dir.path,
19+
queriesCaseSensitiveDefault: queryCaseSensitive);
20+
return TestEnv._(dir, store);
1621
}
1722

1823
TestEnv._(this.dir, this.store);

0 commit comments

Comments
 (0)