From fb0b3c519ea6dfe63e6f7d49f3f958317d8761f7 Mon Sep 17 00:00:00 2001 From: Viet Ho Date: Thu, 9 Apr 2026 11:58:48 -0500 Subject: [PATCH 1/2] handle nullable unique fields --- .../lib/src/sqlite_serialize.dart | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/packages/brick_sqlite_generators/lib/src/sqlite_serialize.dart b/packages/brick_sqlite_generators/lib/src/sqlite_serialize.dart index 6904d3f3..b79a3947 100644 --- a/packages/brick_sqlite_generators/lib/src/sqlite_serialize.dart +++ b/packages/brick_sqlite_generators/lib/src/sqlite_serialize.dart @@ -227,28 +227,36 @@ class SqliteSerialize<_Model extends SqliteModel> extends SqliteSerdesGenerator< String generateUniqueSqliteFunction(Map uniqueFields) { final functionDeclaration = '@override\nFuture primaryKeyByUniqueColumns(${element.name} instance, DatabaseExecutor executor) async'; - final whereStatement = []; - final valuesStatement = []; - final selectStatement = []; - - for (final entry in uniqueFields.entries) { - whereStatement.add('${entry.value} = ?'); - valuesStatement.add('instance.${entry.key}'); - selectStatement.add(entry.value); - } - if (selectStatement.isEmpty && whereStatement.isEmpty) { + if (uniqueFields.isEmpty) { return '$functionDeclaration => instance.primaryKey;'; } return """$functionDeclaration { - final results = await executor.rawQuery(''' - SELECT * FROM `$tableName` WHERE ${whereStatement.join(' OR ')} LIMIT 1''', - [${valuesStatement.join(',')}] + final where = []; + final args = []; + + final fields = { + ${uniqueFields.entries.map((e) => "'${e.value}': instance.${e.key}").join(',\n ')} + }; + + for (final entry in fields.entries) { + if (entry.value != null) { + where.add('\${entry.key} = ?'); + args.add(entry.value); + } + } + + if (where.isEmpty) { + return null; + } + + final results = await executor.rawQuery( + 'SELECT * FROM `$tableName` WHERE ' + where.join(' OR ') + ' LIMIT 1', + args, ); - // SQFlite returns [{}] when no results are found - if (results.isEmpty || (results.length == 1 && results.first.isEmpty)) { + if (results.isEmpty || results.first.isEmpty) { return null; } From 964335ba5b8a865d93caea089ad02d494e027990 Mon Sep 17 00:00:00 2001 From: Viet Ho Date: Thu, 9 Apr 2026 12:05:59 -0500 Subject: [PATCH 2/2] added original empty result check back --- packages/brick_sqlite_generators/lib/src/sqlite_serialize.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/brick_sqlite_generators/lib/src/sqlite_serialize.dart b/packages/brick_sqlite_generators/lib/src/sqlite_serialize.dart index b79a3947..ec1a7593 100644 --- a/packages/brick_sqlite_generators/lib/src/sqlite_serialize.dart +++ b/packages/brick_sqlite_generators/lib/src/sqlite_serialize.dart @@ -256,7 +256,8 @@ class SqliteSerialize<_Model extends SqliteModel> extends SqliteSerdesGenerator< args, ); - if (results.isEmpty || results.first.isEmpty) { + // SQFlite returns [{}] when no results are found + if (results.isEmpty || (results.length == 1 && results.first.isEmpty)) { return null; }