From 99fe21f36f3248e08ff9b7a1cec97840596910ab Mon Sep 17 00:00:00 2001 From: Uwe Trottmann <13865709+greenrobot-team@users.noreply.github.com> Date: Mon, 12 Oct 2020 12:08:01 +0200 Subject: [PATCH 1/7] Update objectbox-c [0.8.2 -> 0.10.0]. --- CHANGELOG.md | 3 +++ install.sh | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e738dd59d..a72c9ca75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# In development +* Update to objectbox-c 0.10.0. + 0.7.0 (2020-08-14) ------------------ * Flutter v1.20 support diff --git a/install.sh b/install.sh index 6d7bdadfa..af1282f40 100755 --- a/install.sh +++ b/install.sh @@ -4,7 +4,7 @@ set -eu # https://github.com/objectbox/objectbox-c/releases # Warning: ensure C lib signature changes are reflected in lib/src/bindings/signatures.dart # Dart won't error if they do not match, it may lead to obscure memory bugs. -cLibVersion=0.8.2 +cLibVersion=0.10.0 os=$(uname) # if there's no tty this is probably part of a docker build - therefore we install the c-api explicitly From 94c08362a5fa7729f986b061d0a24892fa375c98 Mon Sep 17 00:00:00 2001 From: Uwe Trottmann <13865709+greenrobot-team@users.noreply.github.com> Date: Mon, 12 Oct 2020 12:11:22 +0200 Subject: [PATCH 2/7] Update objectbox-android [2.5.1 -> 2.7.1]. --- CHANGELOG.md | 1 + flutter_libs/android/build.gradle | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a72c9ca75..b18761e91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # In development * Update to objectbox-c 0.10.0. +* Update to objectbox-android 2.7.1. 0.7.0 (2020-08-14) ------------------ diff --git a/flutter_libs/android/build.gradle b/flutter_libs/android/build.gradle index 3b323c643..6dcc6bbc2 100644 --- a/flutter_libs/android/build.gradle +++ b/flutter_libs/android/build.gradle @@ -12,5 +12,5 @@ android { dependencies { // https://github.com/objectbox/objectbox-java/releases - implementation "io.objectbox:objectbox-android:2.5.1" + implementation "io.objectbox:objectbox-android:2.7.1" } From c3f50f52d177775d186a49cb98eb8f918a991b4d Mon Sep 17 00:00:00 2001 From: Uwe Trottmann <13865709+greenrobot-team@users.noreply.github.com> Date: Mon, 12 Oct 2020 12:57:01 +0200 Subject: [PATCH 3/7] Update objectbox-swift [1.3.0 -> 1.4.0]. --- CHANGELOG.md | 1 + flutter_libs/ios/download-framework.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b18761e91..5e7328d04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # In development * Update to objectbox-c 0.10.0. * Update to objectbox-android 2.7.1. +* Update to objectbox-swift 1.4.0. 0.7.0 (2020-08-14) ------------------ diff --git a/flutter_libs/ios/download-framework.sh b/flutter_libs/ios/download-framework.sh index 45e516c74..302fcfcca 100755 --- a/flutter_libs/ios/download-framework.sh +++ b/flutter_libs/ios/download-framework.sh @@ -4,7 +4,7 @@ set -euo pipefail # NOTE: run this script before publishing # https://github.com/objectbox/objectbox-swift/releases/ -obxSwiftVersion="1.3.0" +obxSwiftVersion="1.4.0" dir=$(dirname "$0") From 79352b6616649220eb5fa4200f3b1f6e69863b1f Mon Sep 17 00:00:00 2001 From: Uwe Trottmann <13865709+greenrobot-team@users.noreply.github.com> Date: Mon, 12 Oct 2020 13:14:01 +0200 Subject: [PATCH 4/7] C API: adapt for signature changes to store options, put. --- lib/src/bindings/bindings.dart | 4 ++-- lib/src/bindings/signatures.dart | 4 ++-- lib/src/box.dart | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/bindings/bindings.dart b/lib/src/bindings/bindings.dart index 31101d773..6df543535 100644 --- a/lib/src/bindings/bindings.dart +++ b/lib/src/bindings/bindings.dart @@ -93,7 +93,7 @@ class _ObjectBoxBindings { obx_box_ids_for_put; int Function( Pointer box, int id, Pointer data, int size, int mode) - obx_box_put; + obx_box_put5; int Function(Pointer box, Pointer objects, Pointer ids, int mode) obx_box_put_many; int Function(Pointer box, int id) obx_box_remove; @@ -340,7 +340,7 @@ class _ObjectBoxBindings { _fn('obx_box_id_for_put').asFunction(); obx_box_ids_for_put = _fn('obx_box_ids_for_put').asFunction(); - obx_box_put = _fn('obx_box_put').asFunction(); + obx_box_put5 = _fn('obx_box_put5').asFunction(); obx_box_put_many = _fn('obx_box_put_many').asFunction(); obx_box_remove = diff --git a/lib/src/bindings/signatures.dart b/lib/src/bindings/signatures.dart index c7261d2f8..e8cb7329e 100644 --- a/lib/src/bindings/signatures.dart +++ b/lib/src/bindings/signatures.dart @@ -47,9 +47,9 @@ typedef obx_opt_directory_native_t = Int32 Function( typedef obx_opt_max_db_size_in_kb_native_t = Void Function( Pointer opt, Int32 size_in_kb); typedef obx_opt_file_mode_native_t = Void Function( - Pointer opt, Int32 file_mode); + Pointer opt, Uint32 file_mode); typedef obx_opt_max_readers_native_t = Void Function( - Pointer opt, Int32 max_readers); + Pointer opt, Uint32 max_readers); typedef obx_opt_model_native_t = Int32 Function( Pointer opt, Pointer model); typedef obx_store_open_native_t = Pointer Function(Pointer opt); diff --git a/lib/src/box.dart b/lib/src/box.dart index 48591f7db..12eacb291 100644 --- a/lib/src/box.dart +++ b/lib/src/box.dart @@ -69,7 +69,7 @@ class Box { final Pointer bytesPtr = _fbManager.marshal(propVals); try { final bytes = bytesPtr.ref; - checkObx(bindings.obx_box_put( + checkObx(bindings.obx_box_put5( _cBox, id, bytes.ptr, bytes.length, _getOBXPutMode(mode))); } finally { // because fbManager.marshal() allocates the inner bytes, we need to clean those as well From 6ccea781a169abf1b08e09554ef6797a975ff213 Mon Sep 17 00:00:00 2001 From: Uwe Trottmann <13865709+greenrobot-team@users.noreply.github.com> Date: Mon, 12 Oct 2020 14:36:08 +0200 Subject: [PATCH 5/7] C API: rename query conditions, add greater/lessOrEqual for String. Also drop unused descending param for String startsWith/endsWith, replace with caseSensitive. --- CHANGELOG.md | 2 + lib/src/bindings/bindings.dart | 158 ++++++++++++++++++------------- lib/src/bindings/signatures.dart | 18 +--- lib/src/query/query.dart | 113 +++++++++++----------- 4 files changed, 153 insertions(+), 138 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e7328d04..4d96c8e47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ * Update to objectbox-c 0.10.0. * Update to objectbox-android 2.7.1. * Update to objectbox-swift 1.4.0. +* String startsWith and endsWith condition: removed unused `descending` parameter, add `caseSensitive` parameter. +* String greaterThan/lessThan condition: `withEqual` is deprecated, use the greaterOrEqual/lessOrEqual condition instead. 0.7.0 (2020-08-14) ------------------ diff --git a/lib/src/bindings/bindings.dart b/lib/src/bindings/bindings.dart index 6df543535..7cd88834b 100644 --- a/lib/src/bindings/bindings.dart +++ b/lib/src/bindings/bindings.dart @@ -1,6 +1,8 @@ import 'dart:ffi'; import 'dart:io' show Platform; + import 'package:ffi/ffi.dart'; + import 'signatures.dart'; import 'structs.dart'; @@ -115,31 +117,37 @@ class _ObjectBoxBindings { obx_qb_cond_operator_0_dart_t obx_qb_null, obx_qb_not_null; - obx_qb_cond_operator_1_dart_t obx_qb_int_equal, - obx_qb_int_not_equal, - obx_qb_int_greater, - obx_qb_int_less; + obx_qb_cond_operator_1_dart_t obx_qb_equals_int, + obx_qb_not_equals_int, + obx_qb_greater_than_int, + obx_qb_less_than_int; - obx_qb_cond_operator_2_dart_t obx_qb_int_between; + obx_qb_cond_operator_2_dart_t obx_qb_between_2ints; - obx_qb_cond_operator_in_dart_t obx_qb_int64_in, obx_qb_int64_not_in; - obx_qb_cond_operator_in_dart_t obx_qb_int32_in, obx_qb_int32_not_in; + obx_qb_cond_operator_in_dart_t obx_qb_in_int64s, obx_qb_not_in_int64s; + obx_qb_cond_operator_in_dart_t obx_qb_in_int32s, obx_qb_not_in_int32s; - obx_qb_cond_string_op_1_dart_t obx_qb_string_equal, - obx_qb_string_not_equal, - obx_qb_string_contains, - obx_qb_string_starts_with, - obx_qb_string_ends_with; + obx_qb_cond_string_op_1_dart_t obx_qb_equals_string, + obx_qb_not_equals_string, + obx_qb_contains_string, + obx_qb_starts_with_string, + obx_qb_ends_with_string, + obx_qb_greater_than_string, + obx_qb_greater_or_equal_string, + obx_qb_less_than_string, + obx_qb_less_or_equal_string; - obx_qb_cond_operator_1_dart_t obx_qb_double_greater, - obx_qb_double_less; - obx_qb_cond_operator_2_dart_t obx_qb_double_between; + obx_qb_cond_operator_1_dart_t obx_qb_greater_than_double, + obx_qb_less_than_double; + obx_qb_cond_operator_2_dart_t obx_qb_between_2doubles; - obx_qb_string_lt_gt_op_dart_t obx_qb_string_greater, obx_qb_string_less; - obx_qb_string_in_dart_t obx_qb_string_in; + obx_qb_string_in_dart_t obx_qb_in_strings; - obx_qb_bytes_eq_dart_t obx_qb_bytes_equal; - obx_qb_bytes_lt_gt_dart_t obx_qb_bytes_greater, obx_qb_bytes_less; + obx_qb_cond_bytes_dart_t obx_qb_equals_bytes, + obx_qb_greater_than_bytes, + obx_qb_greater_or_equal_bytes, + obx_qb_less_than_bytes, + obx_qb_less_or_equal_bytes; obx_qb_join_op_dart_t obx_qb_all, obx_qb_any; @@ -369,80 +377,98 @@ class _ObjectBoxBindings { obx_qb_not_null = _fn('obx_qb_not_null').asFunction(); - obx_qb_int_equal = - _fn>('obx_qb_int_equal') + // Integer conditions + obx_qb_equals_int = + _fn>('obx_qb_equals_int') .asFunction(); - obx_qb_int_not_equal = - _fn>('obx_qb_int_not_equal') + obx_qb_not_equals_int = + _fn>('obx_qb_not_equals_int') .asFunction(); - obx_qb_int_greater = - _fn>('obx_qb_int_greater') + obx_qb_greater_than_int = + _fn>('obx_qb_greater_than_int') .asFunction(); - obx_qb_int_less = - _fn>('obx_qb_int_less') + obx_qb_less_than_int = + _fn>('obx_qb_less_than_int') .asFunction(); - obx_qb_int_between = - _fn>('obx_qb_int_between') + obx_qb_between_2ints = + _fn>('obx_qb_between_2ints') .asFunction(); - obx_qb_int64_in = - _fn>('obx_qb_int64_in') + obx_qb_in_int64s = + _fn>('obx_qb_in_int64s') .asFunction(); - obx_qb_int64_not_in = - _fn>('obx_qb_int64_not_in') + obx_qb_not_in_int64s = + _fn>('obx_qb_not_in_int64s') .asFunction(); - obx_qb_int32_in = - _fn>('obx_qb_int32_in') + obx_qb_in_int32s = + _fn>('obx_qb_in_int32s') .asFunction(); - obx_qb_int32_not_in = - _fn>('obx_qb_int32_not_in') + obx_qb_not_in_int32s = + _fn>('obx_qb_not_in_int32s') .asFunction(); - obx_qb_string_equal = - _fn('obx_qb_string_equal') + // String conditions + obx_qb_equals_string = + _fn('obx_qb_equals_string') .asFunction(); - obx_qb_string_not_equal = - _fn('obx_qb_string_not_equal') + obx_qb_not_equals_string = + _fn('obx_qb_not_equals_string') .asFunction(); - obx_qb_string_contains = - _fn('obx_qb_string_contains') + obx_qb_contains_string = + _fn('obx_qb_contains_string') .asFunction(); - obx_qb_string_starts_with = - _fn('obx_qb_string_starts_with') + obx_qb_starts_with_string = + _fn('obx_qb_starts_with_string') .asFunction(); - obx_qb_string_ends_with = - _fn('obx_qb_string_ends_with') + obx_qb_ends_with_string = + _fn('obx_qb_ends_with_string') .asFunction(); - obx_qb_string_greater = - _fn('obx_qb_string_greater') + obx_qb_greater_than_string = + _fn('obx_qb_greater_than_string') + .asFunction(); + obx_qb_greater_or_equal_string = + _fn('obx_qb_greater_or_equal_string') + .asFunction(); + obx_qb_less_than_string = + _fn('obx_qb_less_than_string') + .asFunction(); + obx_qb_less_or_equal_string = + _fn('obx_qb_less_or_equal_string') .asFunction(); - obx_qb_string_less = - _fn('obx_qb_string_less').asFunction(); - obx_qb_string_in = - _fn('obx_qb_string_in').asFunction(); + obx_qb_in_strings = + _fn('obx_qb_in_strings').asFunction(); - obx_qb_double_greater = - _fn>('obx_qb_double_greater') - .asFunction(); - obx_qb_double_less = - _fn>('obx_qb_double_less') + // Floating point conditions (double) + obx_qb_greater_than_double = _fn>( + 'obx_qb_greater_than_double') + .asFunction(); + obx_qb_less_than_double = + _fn>('obx_qb_less_than_double') .asFunction(); - obx_qb_double_between = - _fn>('obx_qb_double_between') + obx_qb_between_2doubles = + _fn>('obx_qb_between_2doubles') .asFunction(); - obx_qb_bytes_equal = - _fn('obx_qb_bytes_equal').asFunction(); - obx_qb_bytes_greater = - _fn('obx_qb_bytes_greater').asFunction(); - obx_qb_bytes_less = - _fn('obx_qb_bytes_less').asFunction(); + // Bytes (blob) conditions (currently unused) + obx_qb_equals_bytes = + _fn('obx_qb_equals_bytes').asFunction(); + obx_qb_greater_than_bytes = + _fn('obx_qb_greater_than_bytes') + .asFunction(); + obx_qb_greater_or_equal_bytes = + _fn('obx_qb_greater_or_equal_bytes') + .asFunction(); + obx_qb_less_than_bytes = + _fn('obx_qb_less_than_bytes').asFunction(); + obx_qb_less_or_equal_bytes = + _fn('obx_qb_less_or_equal_bytes') + .asFunction(); obx_qb_all = _fn('obx_qb_all').asFunction(); obx_qb_any = _fn('obx_qb_any').asFunction(); diff --git a/lib/src/bindings/signatures.dart b/lib/src/bindings/signatures.dart index e8cb7329e..2622afa4f 100644 --- a/lib/src/bindings/signatures.dart +++ b/lib/src/bindings/signatures.dart @@ -150,15 +150,6 @@ typedef obx_qb_cond_string_op_1_native_t = Int32 Function(Pointer builder, typedef obx_qb_cond_string_op_1_dart_t = int Function(Pointer builder, int property_id, Pointer value, int case_sensitive); -typedef obx_qb_string_lt_gt_op_native_t = Int32 Function( - Pointer builder, - Uint32 property_id, - Pointer value, - Int8 case_sensitive, - Int8 with_equal); -typedef obx_qb_string_lt_gt_op_dart_t = int Function(Pointer builder, - int property_id, Pointer value, int case_sensitive, int with_equal); - typedef obx_qb_string_in_native_t = Int32 Function( Pointer builder, Uint32 property_id, @@ -172,16 +163,11 @@ typedef obx_qb_string_in_dart_t = int Function( int count, int case_sensitive); -typedef obx_qb_bytes_eq_native_t = Int32 Function(Pointer builder, +typedef obx_qb_cond_bytes_native_t = Int32 Function(Pointer builder, Uint32 property_id, Pointer value, Uint64 size); -typedef obx_qb_bytes_eq_dart_t = int Function( +typedef obx_qb_cond_bytes_dart_t = int Function( Pointer builder, int property_id, Pointer value, int size); -typedef obx_qb_bytes_lt_gt_native_t = Int32 Function(Pointer builder, - Uint32 property_id, Pointer value, Uint64 size, Int8 with_equal); -typedef obx_qb_bytes_lt_gt_dart_t = int Function(Pointer builder, - int property_id, Pointer value, int size, int with_equal); - typedef obx_qb_param_alias_native_t = Int32 Function( Pointer builder, Pointer alias); typedef obx_qb_param_alias_dart_t = int Function( diff --git a/lib/src/query/query.dart b/lib/src/query/query.dart index d9f40ed20..8f0d20e0a 100644 --- a/lib/src/query/query.dart +++ b/lib/src/query/query.dart @@ -59,14 +59,8 @@ class QueryStringProperty extends QueryProperty { QueryStringProperty({int entityId, int propertyId, int obxType}) : super(entityId, propertyId, obxType); - Condition _op(String p, ConditionOp cop, - [bool caseSensitive = false, bool descending = false]) { - return StringCondition(cop, this, p, null, caseSensitive, descending); - } - - Condition _opWithEqual(String p, ConditionOp cop, - [bool caseSensitive = false, bool withEqual = false]) { - return StringCondition._withEqual(cop, this, p, caseSensitive, withEqual); + Condition _op(String p, ConditionOp cop, [bool caseSensitive = false]) { + return StringCondition(cop, this, p, null, caseSensitive); } Condition _opList(List list, ConditionOp cop, @@ -75,23 +69,23 @@ class QueryStringProperty extends QueryProperty { } Condition equals(String p, {bool caseSensitive = false}) { - return _op(p, ConditionOp.eq, caseSensitive, false); + return _op(p, ConditionOp.eq, caseSensitive); } Condition notEquals(String p, {bool caseSensitive = false}) { - return _op(p, ConditionOp.notEq, caseSensitive, false); + return _op(p, ConditionOp.notEq, caseSensitive); } - Condition endsWith(String p, {bool descending = false}) { - return _op(p, ConditionOp.stringEnds, false, descending); + Condition endsWith(String p, {bool caseSensitive = false}) { + return _op(p, ConditionOp.stringEnds, caseSensitive); } - Condition startsWith(String p, {bool descending = false}) { - return _op(p, ConditionOp.stringStarts, false, descending); + Condition startsWith(String p, {bool caseSensitive = false}) { + return _op(p, ConditionOp.stringStarts, caseSensitive); } Condition contains(String p, {bool caseSensitive = false}) { - return _op(p, ConditionOp.stringContains, caseSensitive, false); + return _op(p, ConditionOp.stringContains, caseSensitive); } Condition inside(List list, {bool caseSensitive = false}) { @@ -102,14 +96,32 @@ class QueryStringProperty extends QueryProperty { return _opList(list, ConditionOp.notIn, caseSensitive); } + /// Using [withEqual] is deprecated, use [greaterOrEqual] instead. Condition greaterThan(String p, {bool caseSensitive = false, bool withEqual = false}) { - return _opWithEqual(p, ConditionOp.gt, caseSensitive, withEqual); + if (withEqual) { + return greaterOrEqual(p, caseSensitive: caseSensitive); + } else { + return _op(p, ConditionOp.gt, caseSensitive); + } + } + + Condition greaterOrEqual(String p, {bool caseSensitive = false}) { + return _op(p, ConditionOp.greaterOrEq, caseSensitive); } + /// Using [withEqual] is deprecated, use [lessOrEqual] instead. Condition lessThan(String p, {bool caseSensitive = false, bool withEqual = false}) { - return _opWithEqual(p, ConditionOp.lt, caseSensitive, withEqual); + if (withEqual) { + return lessOrEqual(p, caseSensitive: caseSensitive); + } else { + return _op(p, ConditionOp.lt, caseSensitive); + } + } + + Condition lessOrEqual(String p, {bool caseSensitive = false}) { + return _op(p, ConditionOp.lessOrEq, caseSensitive); } // Condition operator ==(String p) => equals(p); // see issue #43 @@ -222,7 +234,9 @@ enum ConditionOp { stringStarts, stringEnds, gt, + greaterOrEq, lt, + lessOrEq, inside, notIn, between, @@ -289,10 +303,10 @@ abstract class PropertyCondition extends Condition { } class StringCondition extends PropertyCondition { - bool _caseSensitive, _withEqual; + bool _caseSensitive; StringCondition(ConditionOp op, QueryProperty prop, String value, - [String value2, bool caseSensitive, bool descending]) + [String value2, bool caseSensitive]) : super(op, prop, value, value2) { _caseSensitive = caseSensitive; } @@ -303,13 +317,6 @@ class StringCondition extends PropertyCondition { _caseSensitive = caseSensitive; } - StringCondition._withEqual(ConditionOp op, QueryProperty prop, String value, - bool caseSensitive, bool withEqual) - : super(op, prop, value) { - _caseSensitive = caseSensitive; - _withEqual = withEqual; - } - int _op1(QueryBuilder builder, obx_qb_cond_string_op_1_dart_t func) { final cStr = Utf8.toUtf8(_value); try { @@ -321,7 +328,7 @@ class StringCondition extends PropertyCondition { } int _inside(QueryBuilder builder) { - final func = bindings.obx_qb_string_in; + final func = bindings.obx_qb_in_strings; final listLength = _list.length; final arrayOfCStrings = allocate>(count: listLength); try { @@ -338,16 +345,6 @@ class StringCondition extends PropertyCondition { } } - int _opWithEqual(QueryBuilder builder, obx_qb_string_lt_gt_op_dart_t func) { - final cStr = Utf8.toUtf8(_value); - try { - return func(builder._cBuilder, _property._propertyId, cStr, - _caseSensitive ? 1 : 0, _withEqual ? 1 : 0); - } finally { - free(cStr); - } - } - @override int apply(QueryBuilder builder, bool isRoot) { final c = tryApply(builder); @@ -357,19 +354,23 @@ class StringCondition extends PropertyCondition { switch (_op) { case ConditionOp.eq: - return _op1(builder, bindings.obx_qb_string_equal); + return _op1(builder, bindings.obx_qb_equals_string); case ConditionOp.notEq: - return _op1(builder, bindings.obx_qb_string_not_equal); + return _op1(builder, bindings.obx_qb_not_equals_string); case ConditionOp.stringContains: - return _op1(builder, bindings.obx_qb_string_contains); + return _op1(builder, bindings.obx_qb_contains_string); case ConditionOp.stringStarts: - return _op1(builder, bindings.obx_qb_string_starts_with); + return _op1(builder, bindings.obx_qb_starts_with_string); case ConditionOp.stringEnds: - return _op1(builder, bindings.obx_qb_string_ends_with); + return _op1(builder, bindings.obx_qb_ends_with_string); case ConditionOp.lt: - return _opWithEqual(builder, bindings.obx_qb_string_less); + return _op1(builder, bindings.obx_qb_less_than_string); + case ConditionOp.lessOrEq: + return _op1(builder, bindings.obx_qb_less_or_equal_string); case ConditionOp.gt: - return _opWithEqual(builder, bindings.obx_qb_string_greater); + return _op1(builder, bindings.obx_qb_greater_than_string); + case ConditionOp.greaterOrEq: + return _op1(builder, bindings.obx_qb_greater_or_equal_string); case ConditionOp.inside: return _inside(builder); // bindings.obx_qb_string_in default: @@ -445,22 +446,22 @@ class IntegerCondition extends PropertyCondition { switch (_op) { case ConditionOp.eq: - return _op1(builder, bindings.obx_qb_int_equal); + return _op1(builder, bindings.obx_qb_equals_int); case ConditionOp.notEq: - return _op1(builder, bindings.obx_qb_int_not_equal); + return _op1(builder, bindings.obx_qb_not_equals_int); case ConditionOp.gt: - return _op1(builder, bindings.obx_qb_int_greater); + return _op1(builder, bindings.obx_qb_greater_than_int); case ConditionOp.lt: - return _op1(builder, bindings.obx_qb_int_less); + return _op1(builder, bindings.obx_qb_less_than_int); case ConditionOp.between: - return bindings.obx_qb_int_between( + return bindings.obx_qb_between_2ints( builder._cBuilder, _property._propertyId, _value, _value2); case ConditionOp.inside: switch (_property._type) { case OBXPropertyType.Int: - return _opList32(builder, bindings.obx_qb_int32_in); + return _opList32(builder, bindings.obx_qb_in_int32s); case OBXPropertyType.Long: - return _opList64(builder, bindings.obx_qb_int64_in); + return _opList64(builder, bindings.obx_qb_in_int64s); default: throw Exception('Unsupported type for IN: ${_property._type}'); } @@ -468,9 +469,9 @@ class IntegerCondition extends PropertyCondition { case ConditionOp.notIn: switch (_property._type) { case OBXPropertyType.Int: - return _opList32(builder, bindings.obx_qb_int32_not_in); + return _opList32(builder, bindings.obx_qb_not_in_int32s); case OBXPropertyType.Long: - return _opList64(builder, bindings.obx_qb_int64_not_in); + return _opList64(builder, bindings.obx_qb_not_in_int64s); default: throw Exception('Unsupported type for IN: ${_property._type}'); } @@ -502,11 +503,11 @@ class DoubleCondition extends PropertyCondition { switch (_op) { case ConditionOp.gt: - return _op1(builder, bindings.obx_qb_double_greater); + return _op1(builder, bindings.obx_qb_greater_than_double); case ConditionOp.lt: - return _op1(builder, bindings.obx_qb_double_less); + return _op1(builder, bindings.obx_qb_less_than_double); case ConditionOp.between: - return bindings.obx_qb_double_between( + return bindings.obx_qb_between_2doubles( builder._cBuilder, _property._propertyId, _value, _value2); default: throw Exception('Unsupported operation ${_op.toString()}'); From f4017047e3a28b053159729244e86f307f731def Mon Sep 17 00:00:00 2001 From: Uwe Trottmann <13865709+greenrobot-team@users.noreply.github.com> Date: Mon, 12 Oct 2020 15:07:38 +0200 Subject: [PATCH 6/7] C API: move offset/limit to methods on query. --- CHANGELOG.md | 1 + lib/src/bindings/bindings.dart | 9 +++++ lib/src/bindings/signatures.dart | 21 ++++++----- lib/src/query/query.dart | 62 ++++++++++++++++++++++++++++---- test/query_test.dart | 3 +- 5 files changed, 79 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d96c8e47..c30f9978c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * Update to objectbox-swift 1.4.0. * String startsWith and endsWith condition: removed unused `descending` parameter, add `caseSensitive` parameter. * String greaterThan/lessThan condition: `withEqual` is deprecated, use the greaterOrEqual/lessOrEqual condition instead. +* Query find/findIds `offset` and `limit` parameters are deprecated, set them using the equally named methods instead. 0.7.0 (2020-08-14) ------------------ diff --git a/lib/src/bindings/bindings.dart b/lib/src/bindings/bindings.dart index 7cd88834b..fcd7a6db0 100644 --- a/lib/src/bindings/bindings.dart +++ b/lib/src/bindings/bindings.dart @@ -158,6 +158,10 @@ class _ObjectBoxBindings { // query obx_query_t obx_query_create; obx_query_close_dart_t obx_query_close; + + obx_query_offset_dart_t obx_query_offset; + obx_query_limit_dart_t obx_query_limit; + obx_query_find_t obx_query_find; obx_query_find_ids_t obx_query_find_ids; @@ -483,6 +487,11 @@ class _ObjectBoxBindings { obx_query_close = _fn('obx_query_close').asFunction(); + obx_query_offset = + _fn('obx_query_offset').asFunction(); + obx_query_limit = + _fn('obx_query_limit').asFunction(); + obx_query_find_ids = _fn>('obx_query_find_ids').asFunction(); obx_query_find = diff --git a/lib/src/bindings/signatures.dart b/lib/src/bindings/signatures.dart index 2622afa4f..34069c4a4 100644 --- a/lib/src/bindings/signatures.dart +++ b/lib/src/bindings/signatures.dart @@ -104,7 +104,7 @@ typedef obx_box_count_native_t = Int32 Function( typedef obx_box_is_empty_native_t = Int32 Function( Pointer box, Pointer is_empty); -// no typedef for non-functions yet, see https://github.com/dart-lang/sdk/issues/2626 +// no typedef for non-functions yet, see https://github.com/dart-lang/language/issues/65 // typedef obx_err = Int32 // typedef Pointer -> char[] // typedef Pointer -> int (e.g. obx_qb_cond); @@ -185,10 +185,17 @@ typedef obx_query_t = Pointer Function(Pointer builder); typedef obx_query_close_native_t = Int32 Function(Pointer query); typedef obx_query_close_dart_t = int Function(Pointer query); +typedef obx_query_offset_native_t = Int32 Function( + Pointer query, Uint64 offset); // obx_err -> Int32 +typedef obx_query_offset_dart_t = int Function(Pointer query, int offset); +typedef obx_query_limit_native_t = Int32 Function( + Pointer query, Uint64 limit); // obx_err -> Int32 +typedef obx_query_limit_dart_t = int Function(Pointer query, int limit); + typedef obx_query_find_t = Pointer Function( - Pointer query, T offset, T limit); + Pointer query); typedef obx_query_find_ids_t = Pointer Function( - Pointer query, T offset, T limit); + Pointer query); typedef obx_query_count_native_t = Int32 Function( Pointer query, Pointer count); @@ -200,15 +207,11 @@ typedef obx_query_describe_t = Pointer Function(Pointer query); typedef obx_query_visit_native_t = Int32 Function( Pointer query, Pointer> visitor, - Pointer user_data, - Uint64 offset, - Uint64 limit); + Pointer user_data); // obx_err -> Int32 typedef obx_query_visit_dart_t = int Function( Pointer query, Pointer> visitor, - Pointer user_data, - int offset, - int limit); + Pointer user_data); // query property diff --git a/lib/src/query/query.dart b/lib/src/query/query.dart index 8f0d20e0a..cd841f4f6 100644 --- a/lib/src/query/query.dart +++ b/lib/src/query/query.dart @@ -574,6 +574,30 @@ class Query { _cQuery = checkObxPtr(bindings.obx_query_create(cBuilder), 'create query'); } + /// Configure an [offset] for this query. + /// + /// All methods that support offset will return/process Objects starting at + /// this offset. Example use case: use together with limit to get a slice of + /// the whole result, e.g. for "result paging". + /// + /// Call with offset=0 to reset to the default behavior, + /// i.e. starting from the first element. + void offset(int offset) { + checkObx(bindings.obx_query_offset(_cQuery, offset)); + } + + /// Configure a [limit] for this query. + /// + /// All methods that support limit will return/process only the given number + /// of Objects. Example use case: use together with offset to get a slice of + /// the whole result, e.g. for "result paging". + /// + /// Call with limit=0 to reset to the default behavior - + /// zero limit means no limit applied. + void limit(int limit) { + checkObx(bindings.obx_query_limit(_cQuery, limit)); + } + int count() { final ptr = allocate(count: 1); try { @@ -589,14 +613,28 @@ class Query { checkObx(bindings.obx_query_close(_cQuery)); } + /// Finds Objects matching the query and returns the first result or null + /// if there are no results. T findFirst() { - final list = find(offset: 0, limit: 1); + offset(0); + limit(1); + final list = find(); return (list.isEmpty ? null : list[0]); } + /// Finds Objects matching the query and returns their IDs. + /// + /// [offset] and [limit] are deprecated, explicitly call + /// the equally named methods. List findIds({int offset = 0, int limit = 0}) { - final idArrayPtr = checkObxPtr( - bindings.obx_query_find_ids(_cQuery, offset, limit), 'find ids'); + if (offset > 0) { + this.offset(offset); + } + if (limit > 0) { + this.limit(limit); + } + final idArrayPtr = + checkObxPtr(bindings.obx_query_find_ids(_cQuery), 'find ids'); try { final idArray = idArrayPtr.ref; return idArray.length == 0 ? [] : idArray.items(); @@ -605,11 +643,21 @@ class Query { } } + /// Finds Objects matching the query. + /// + /// [offset] and [limit] are deprecated, explicitly call + /// the equally named methods. List find({int offset = 0, int limit = 0}) { + if (offset > 0) { + this.offset(offset); + } + if (limit > 0) { + this.limit(limit); + } return _store.runInTransaction(TxMode.Read, () { if (bindings.obx_supports_bytes_array() == 1) { - final bytesArray = checkObxPtr( - bindings.obx_query_find(_cQuery, offset, limit), 'find'); + final bytesArray = + checkObxPtr(bindings.obx_query_find(_cQuery), 'find'); try { return _fbManager.unmarshalArray(bytesArray); } finally { @@ -623,8 +671,8 @@ class Query { return true; }); - final err = bindings.obx_query_visit( - _cQuery, visitor.fn, visitor.userData, offset, limit); + final err = + bindings.obx_query_visit(_cQuery, visitor.fn, visitor.userData); visitor.close(); checkObx(err); return results; diff --git a/test/query_test.dart b/test/query_test.dart index a39d27325..408f97adc 100644 --- a/test/query_test.dart +++ b/test/query_test.dart @@ -222,7 +222,8 @@ void main() { q.close(); q = box.query(text.isNull()).build(); - expect(q.find(offset: 0, limit: 1).length, 1); + q.limit(1); + expect(q.find().length, 1); q.close(); }); From d31e7832a1812746d1669abd8b27288299841379 Mon Sep 17 00:00:00 2001 From: Uwe Trottmann <13865709+greenrobot-team@users.noreply.github.com> Date: Mon, 12 Oct 2020 15:28:04 +0200 Subject: [PATCH 7/7] C API: rename obx_query_prop_* methods. --- lib/src/bindings/bindings.dart | 42 +++++++++++++++++----------------- lib/src/query/property.dart | 14 ++++++------ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/lib/src/bindings/bindings.dart b/lib/src/bindings/bindings.dart index fcd7a6db0..33b96a4b6 100644 --- a/lib/src/bindings/bindings.dart +++ b/lib/src/bindings/bindings.dart @@ -190,19 +190,19 @@ class _ObjectBoxBindings { obx_query_prop_sum_int; obx_query_prop_find_native_t, Int8> - obx_query_prop_string_find; + obx_query_prop_find_strings; obx_query_prop_find_native_t, Int64> - obx_query_prop_int64_find; + obx_query_prop_find_int64s; obx_query_prop_find_native_t, Int32> - obx_query_prop_int32_find; + obx_query_prop_find_int32s; obx_query_prop_find_native_t, Int16> - obx_query_prop_int16_find; + obx_query_prop_find_int16s; obx_query_prop_find_native_t, Int8> - obx_query_prop_int8_find; + obx_query_prop_find_int8s; obx_query_prop_find_native_t, Double> - obx_query_prop_double_find; + obx_query_prop_find_doubles; obx_query_prop_find_native_t, Float> - obx_query_prop_float_find; + obx_query_prop_find_floats; // Utilities obx_bytes_array_t obx_bytes_array; @@ -548,33 +548,33 @@ class _ObjectBoxBindings { _fn>('obx_query_prop_sum_int') .asFunction(); - obx_query_prop_string_find = + obx_query_prop_find_strings = _fn, Int8>>( - 'obx_query_prop_string_find') + 'obx_query_prop_find_strings') .asFunction(); - obx_query_prop_int64_find = + obx_query_prop_find_int64s = _fn, Int64>>( - 'obx_query_prop_int64_find') + 'obx_query_prop_find_int64s') .asFunction(); - obx_query_prop_int32_find = + obx_query_prop_find_int32s = _fn, Int32>>( - 'obx_query_prop_int32_find') + 'obx_query_prop_find_int32s') .asFunction(); - obx_query_prop_int16_find = + obx_query_prop_find_int16s = _fn, Int16>>( - 'obx_query_prop_int16_find') + 'obx_query_prop_find_int16s') .asFunction(); - obx_query_prop_int8_find = + obx_query_prop_find_int8s = _fn, Int8>>( - 'obx_query_prop_int8_find') + 'obx_query_prop_find_int8s') .asFunction(); - obx_query_prop_double_find = + obx_query_prop_find_doubles = _fn, Double>>( - 'obx_query_prop_double_find') + 'obx_query_prop_find_doubles') .asFunction(); - obx_query_prop_float_find = + obx_query_prop_find_floats = _fn, Float>>( - 'obx_query_prop_float_find') + 'obx_query_prop_find_floats') .asFunction(); // Utilities diff --git a/lib/src/query/property.dart b/lib/src/query/property.dart index 7bc572433..5fbac1234 100644 --- a/lib/src/query/property.dart +++ b/lib/src/query/property.dart @@ -138,20 +138,20 @@ class IntegerPropertyQuery extends PropertyQuery with _CommonNumeric { case OBXPropertyType.Byte: case OBXPropertyType.Char: // Int8 return _unpack8(_curryWithDefault( - bindings.obx_query_prop_int8_find, ptr.cast(), 'find int8')); + bindings.obx_query_prop_find_int8s, ptr.cast(), 'find int8')); case OBXPropertyType.Short: // Int16 return _unpack16(_curryWithDefault( - bindings.obx_query_prop_int16_find, + bindings.obx_query_prop_find_int16s, ptr.cast(), 'find int16')); case OBXPropertyType.Int: // Int32 return _unpack32(_curryWithDefault( - bindings.obx_query_prop_int32_find, + bindings.obx_query_prop_find_int32s, ptr.cast(), 'find int32')); case OBXPropertyType.Long: // Int64 return _unpack64(_curryWithDefault( - bindings.obx_query_prop_int64_find, + bindings.obx_query_prop_find_int64s, ptr.cast(), 'find int64')); default: @@ -211,13 +211,13 @@ class DoublePropertyQuery extends PropertyQuery with _CommonNumeric { ? (allocate()..value = replaceNullWith) : Pointer.fromAddress(0); return _unpack32(_curryWithDefault( - bindings.obx_query_prop_float_find, valueIfNull, 'find float32')); + bindings.obx_query_prop_find_floats, valueIfNull, 'find float32')); case OBXPropertyType.Double: final valueIfNull = replaceNullWith != null ? (allocate()..value = replaceNullWith) : Pointer.fromAddress(0); return _unpack64(_curryWithDefault( - bindings.obx_query_prop_double_find, valueIfNull, 'find float64')); + bindings.obx_query_prop_find_doubles, valueIfNull, 'find float64')); default: throw Exception( 'Property query: unsupported type (OBXPropertyType: ${_type})'); @@ -263,6 +263,6 @@ class StringPropertyQuery extends PropertyQuery { ? Utf8.toUtf8(replaceNullWith).cast() : Pointer.fromAddress(0); return _unpack(_curryWithDefault( - bindings.obx_query_prop_string_find, ptr, 'find utf8')); + bindings.obx_query_prop_find_strings, ptr, 'find utf8')); } }