From 8d3c8b912151f330a804a70476497911b8df0b59 Mon Sep 17 00:00:00 2001 From: "thomashii@dukefirehawk.com" Date: Tue, 4 May 2021 16:15:19 +0800 Subject: [PATCH] Replace null with Optional --- .../orm/angel_orm/lib/src/query_base.dart | 4 +- .../example/car_controller.dart | 2 +- .../lib/src/belongs_to_test.dart | 24 +-- .../lib/src/custom_expr_test.dart | 2 +- .../lib/src/edge_case_test.dart | 13 +- .../lib/src/enum_and_nested_test.dart | 2 +- .../angel_orm_test/lib/src/has_many_test.dart | 6 +- .../angel_orm_test/lib/src/has_map_test.dart | 2 +- .../angel_orm_test/lib/src/has_one_test.dart | 2 +- .../lib/src/many_to_many_test.dart | 8 +- .../angel_orm_test/lib/src/models/book.dart | 2 + .../angel_orm_test/lib/src/models/book.g.dart | 39 ++-- .../angel_orm_test/lib/src/models/car.dart | 1 + .../angel_orm_test/lib/src/models/car.g.dart | 14 +- .../lib/src/models/custom_expr.dart | 2 + .../lib/src/models/custom_expr.g.dart | 30 +-- .../lib/src/models/email_indexed.dart | 2 + .../lib/src/models/email_indexed.g.dart | 110 ++++++----- .../lib/src/models/has_car.dart | 2 + .../lib/src/models/has_car.g.dart | 14 +- .../lib/src/models/has_map.dart | 2 + .../lib/src/models/has_map.g.dart | 14 +- .../angel_orm_test/lib/src/models/leg.dart | 2 + .../angel_orm_test/lib/src/models/leg.g.dart | 30 +-- .../angel_orm_test/lib/src/models/order.dart | 2 + .../lib/src/models/order.g.dart | 30 +-- .../angel_orm_test/lib/src/models/tree.dart | 2 + .../angel_orm_test/lib/src/models/tree.g.dart | 54 +++--- .../lib/src/models/unorthodox.dart | 2 + .../lib/src/models/unorthodox.g.dart | 176 +++++++++--------- .../angel_orm_test/lib/src/models/user.dart | 2 + .../angel_orm_test/lib/src/models/user.g.dart | 100 +++++----- .../lib/src/standalone_test.dart | 38 ++-- packages/orm/angel_orm_test/pubspec.yaml | 1 + 34 files changed, 403 insertions(+), 333 deletions(-) diff --git a/packages/orm/angel_orm/lib/src/query_base.dart b/packages/orm/angel_orm/lib/src/query_base.dart index e186a5e0..919773e4 100644 --- a/packages/orm/angel_orm/lib/src/query_base.dart +++ b/packages/orm/angel_orm/lib/src/query_base.dart @@ -19,7 +19,8 @@ abstract class QueryBase { /// The list of fields returned by this query. /// - /// If it's `null`, then this query will perform a `SELECT *`. + /// @deprecated If it's `null`, then this query will perform a `SELECT *`. + /// If it's empty, then this query will perform a `SELECT *`. List get fields; /// A String of all [fields], joined by a comma (`,`). @@ -42,6 +43,7 @@ abstract class QueryBase { Future> get(QueryExecutor executor) async { var sql = compile({}); + return executor .query(tableName, sql, substitutionValues) .then((it) => it.map(deserialize).toList()); diff --git a/packages/orm/angel_orm_test/example/car_controller.dart b/packages/orm/angel_orm_test/example/car_controller.dart index f88441f4..081ae911 100644 --- a/packages/orm/angel_orm_test/example/car_controller.dart +++ b/packages/orm/angel_orm_test/example/car_controller.dart @@ -6,7 +6,7 @@ import 'package:angel_orm_test/src/models/car.dart'; @Expose('/api/cars') class CarController extends Controller { @Expose('/luxury') - Future> getLuxuryCars(QueryExecutor connection) { + Future> getLuxuryCars(QueryExecutor connection) { var query = CarQuery(); query.where ?..familyFriendly.equals(false) diff --git a/packages/orm/angel_orm_test/lib/src/belongs_to_test.dart b/packages/orm/angel_orm_test/lib/src/belongs_to_test.dart index 78866493..7093f21d 100644 --- a/packages/orm/angel_orm_test/lib/src/belongs_to_test.dart +++ b/packages/orm/angel_orm_test/lib/src/belongs_to_test.dart @@ -2,6 +2,8 @@ import 'dart:async'; import 'package:angel_orm/angel_orm.dart'; import 'package:test/test.dart'; import 'models/book.dart'; +import 'package:optional/optional.dart'; + import 'util.dart'; belongsToTests(FutureOr Function() createExecutor, @@ -17,10 +19,10 @@ belongsToTests(FutureOr Function() createExecutor, // Insert an author var query = AuthorQuery()..values.name = 'J.K. Rowling'; - jkRowling = await query.insert(executor); + jkRowling = (await query.insert(executor)).value; query.values.name = 'J.K. Jameson'; - jameson = await query.insert(executor); + jameson = (await query.insert(executor)).value; // And a book var bookQuery = BookQuery(); @@ -29,7 +31,7 @@ belongsToTests(FutureOr Function() createExecutor, ..partnerAuthorId = int.parse(jameson!.id!) ..name = 'Deathly Hallows'; - deathlyHallows = await bookQuery.insert(executor); + deathlyHallows = (await bookQuery.insert(executor)).value; }); tearDown(() => close!(executor)); @@ -37,10 +39,10 @@ belongsToTests(FutureOr Function() createExecutor, group('selects', () { test('select all', () async { var query = BookQuery(); - List books = await query.get(executor); + List books = await query.get(executor); expect(books, hasLength(1)); - var book = books.first!; + var book = books.first; print(book.toJson()); expect(book.id, deathlyHallows!.id); expect(book.name, deathlyHallows!.name); @@ -70,10 +72,10 @@ belongsToTests(FutureOr Function() createExecutor, test('where clause', () async { var query = BookQuery() ..where!.name.equals('Goblet of Fire') - ..orWhere((w) => w!.authorId.equals(int.parse(jkRowling!.id!))); + ..orWhere((w) => w.authorId.equals(int.parse(jkRowling!.id!))); print(query.compile(Set())); - List books = await query.get(executor) as List; + List books = await query.get(executor); expect(books, hasLength(1)); var book = books.first; @@ -97,10 +99,10 @@ belongsToTests(FutureOr Function() createExecutor, ..unionAll(query3); print(query1.compile(Set())); - List books = await query1.get(executor); + List books = await query1.get(executor); expect(books, hasLength(1)); - var book = books.first!; + var book = books.first; print(book.toJson()); expect(book.id, deathlyHallows!.id); expect(book.name, deathlyHallows!.name); @@ -113,7 +115,7 @@ belongsToTests(FutureOr Function() createExecutor, test('order by', () async { var query = AuthorQuery()..orderBy(AuthorFields.name, descending: true); - List authors = await query.get(executor); + List authors = await query.get(executor); expect(authors, [jkRowling, jameson]); }); }); @@ -128,7 +130,7 @@ belongsToTests(FutureOr Function() createExecutor, printSeparator('Delete stream test'); var query = BookQuery()..where!.name.equals(deathlyHallows!.name!); print(query.compile(Set(), preamble: 'DELETE', withFields: false)); - List? books = await query.delete(executor) as List; + List? books = await query.delete(executor); expect(books, hasLength(1)); var book = books.first; diff --git a/packages/orm/angel_orm_test/lib/src/custom_expr_test.dart b/packages/orm/angel_orm_test/lib/src/custom_expr_test.dart index fd7049da..fd392b33 100644 --- a/packages/orm/angel_orm_test/lib/src/custom_expr_test.dart +++ b/packages/orm/angel_orm_test/lib/src/custom_expr_test.dart @@ -18,7 +18,7 @@ customExprTests(FutureOr Function() createExecutor, nQuery.values ..createdAt = now ..updatedAt = now; - numbersModel = await nQuery.insert(executor); + numbersModel = (await nQuery.insert(executor)).value; }); tearDown(() => close!(executor)); diff --git a/packages/orm/angel_orm_test/lib/src/edge_case_test.dart b/packages/orm/angel_orm_test/lib/src/edge_case_test.dart index 260a46b1..c4bf49bb 100644 --- a/packages/orm/angel_orm_test/lib/src/edge_case_test.dart +++ b/packages/orm/angel_orm_test/lib/src/edge_case_test.dart @@ -25,7 +25,7 @@ edgeCaseTests(FutureOr Function() createExecutor, setUp(() async { var query = UnorthodoxQuery()..values.name = 'Hey'; - unorthodox = await query.insert(executor); + unorthodox = (await query.insert(executor)).value; }); test('belongs to', () async { @@ -42,12 +42,12 @@ edgeCaseTests(FutureOr Function() createExecutor, setUp(() async { var wjQuery = WeirdJoinQuery()..values.joinName = unorthodox!.name; - weirdJoin = await wjQuery.insert(executor); + weirdJoin = (await wjQuery.insert(executor)).value; var gbQuery = SongQuery() ..values.weirdJoinId = weirdJoin!.id ..values.title = 'Girl Blue'; - girlBlue = await gbQuery.insert(executor); + girlBlue = (await gbQuery.insert(executor)).value; }); test('has one', () async { @@ -65,7 +65,7 @@ edgeCaseTests(FutureOr Function() createExecutor, ..values.parent = weirdJoin!.id ..values.i = i; var model = await query.insert(executor); - numbas.add(model); + numbas.add(model.value); } var query = WeirdJoinQuery()..where!.id.equals(weirdJoin!.id!); @@ -76,7 +76,8 @@ edgeCaseTests(FutureOr Function() createExecutor, test('many to many', () async { var fooQuery = FooQuery()..values.bar = 'baz'; - var fooBar = await fooQuery.insert(executor).then((foo) => foo!.bar!); + var fooBar = + await fooQuery.insert(executor).then((foo) => foo.value.bar); var pivotQuery = FooPivotQuery() ..values.weirdJoinId = weirdJoin!.id ..values.fooBar = fooBar; @@ -86,7 +87,7 @@ edgeCaseTests(FutureOr Function() createExecutor, var foo = await (fooQuery.getOne(executor) as FutureOr); print(foo.toJson()); print(weirdJoin!.toJson()); - expect(foo.weirdJoins![0]!.id, weirdJoin!.id); + expect(foo.weirdJoins![0].id, weirdJoin!.id); }); }); }); diff --git a/packages/orm/angel_orm_test/lib/src/enum_and_nested_test.dart b/packages/orm/angel_orm_test/lib/src/enum_and_nested_test.dart index e79b3f28..c441bca2 100644 --- a/packages/orm/angel_orm_test/lib/src/enum_and_nested_test.dart +++ b/packages/orm/angel_orm_test/lib/src/enum_and_nested_test.dart @@ -24,7 +24,7 @@ enumAndNestedTests(FutureOr Function() createExecutor, setUp(() async { var query = HasCarQuery(); query.values.type = CarType.sedan; - initialValue = await query.insert(executor); + initialValue = (await query.insert(executor)).value; }); test('query by enum', () async { diff --git a/packages/orm/angel_orm_test/lib/src/has_many_test.dart b/packages/orm/angel_orm_test/lib/src/has_many_test.dart index 3eaba995..1dd47b2f 100644 --- a/packages/orm/angel_orm_test/lib/src/has_many_test.dart +++ b/packages/orm/angel_orm_test/lib/src/has_many_test.dart @@ -14,7 +14,7 @@ hasManyTests(FutureOr Function() createExecutor, var query = TreeQuery()..values.rings = 10; executor = await createExecutor(); - appleTree = await query.insert(executor); + appleTree = (await query.insert(executor)).value; treeId = int.parse(appleTree!.id!); }); @@ -44,8 +44,8 @@ hasManyTests(FutureOr Function() createExecutor, ..values.treeId = treeId ..values.commonName = 'Banana'; - apple = await appleQuery.insert(executor); - banana = await bananaQuery.insert(executor); + apple = (await appleQuery.insert(executor)).value; + banana = (await bananaQuery.insert(executor)).value; }); test('can fetch any children', () async { diff --git a/packages/orm/angel_orm_test/lib/src/has_map_test.dart b/packages/orm/angel_orm_test/lib/src/has_map_test.dart index 9772d1ad..223e891c 100644 --- a/packages/orm/angel_orm_test/lib/src/has_map_test.dart +++ b/packages/orm/angel_orm_test/lib/src/has_map_test.dart @@ -44,7 +44,7 @@ hasMapTests(FutureOr Function() createExecutor, query.values ..value = {'foo': 'bar'} ..list = ['1', 2, 3.0]; - initialValue = await query.insert(executor); + initialValue = (await query.insert(executor)).value; }); test('get all', () async { diff --git a/packages/orm/angel_orm_test/lib/src/has_one_test.dart b/packages/orm/angel_orm_test/lib/src/has_one_test.dart index d4cb624b..fcd9cedc 100644 --- a/packages/orm/angel_orm_test/lib/src/has_one_test.dart +++ b/packages/orm/angel_orm_test/lib/src/has_one_test.dart @@ -12,7 +12,7 @@ hasOneTests(FutureOr Function() createExecutor, setUp(() async { executor = await createExecutor(); var query = LegQuery()..values.name = 'Left'; - originalLeg = await query.insert(executor); + originalLeg = (await query.insert(executor)).value; }); tearDown(() => close!(executor)); diff --git a/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart b/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart index ab8e4431..5b291f7b 100644 --- a/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart +++ b/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart @@ -48,10 +48,10 @@ manyToManyTests(FutureOr Function() createExecutor, var canPubQuery = RoleQuery()..values.name = 'can_pub'; var canSubQuery = RoleQuery()..values.name = 'can_sub'; - canPub = await canPubQuery.insert(executor); + canPub = (await canPubQuery.insert(executor)).value; print('=== CANPUB: ${canPub?.toJson()}'); // await dumpQuery(canPubQuery.compile(Set())); - canSub = await canSubQuery.insert(executor); + canSub = (await canSubQuery.insert(executor)).value; print('=== CANSUB: ${canSub?.toJson()}'); var thosakweQuery = UserQuery(); @@ -59,7 +59,7 @@ manyToManyTests(FutureOr Function() createExecutor, ..username = 'thosakwe' ..password = 'Hahahahayoureallythoughtiwasstupidenoughtotypethishere' ..email = 'thosakwe AT gmail.com'; - thosakwe = await thosakweQuery.insert(executor); + thosakwe = (await thosakweQuery.insert(executor)).value; print('=== THOSAKWE: ${thosakwe?.toJson()}'); // Allow thosakwe to publish... @@ -95,7 +95,7 @@ manyToManyTests(FutureOr Function() createExecutor, Future fetchThosakwe() async { var query = UserQuery()..where!.id.equals(int.parse(thosakwe!.id!)); - return await query.getOne(executor); + return (await query.getOne(executor)).value; } test('fetch roles for user', () async { diff --git a/packages/orm/angel_orm_test/lib/src/models/book.dart b/packages/orm/angel_orm_test/lib/src/models/book.dart index c7ed686f..20b8eef1 100644 --- a/packages/orm/angel_orm_test/lib/src/models/book.dart +++ b/packages/orm/angel_orm_test/lib/src/models/book.dart @@ -4,6 +4,8 @@ import 'package:angel_migration/angel_migration.dart'; import 'package:angel_model/angel_model.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; +import 'package:optional/optional.dart'; + part 'book.g.dart'; @serializable diff --git a/packages/orm/angel_orm_test/lib/src/models/book.g.dart b/packages/orm/angel_orm_test/lib/src/models/book.g.dart index 4bfd7f4f..27c85492 100644 --- a/packages/orm/angel_orm_test/lib/src/models/book.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/book.g.dart @@ -50,7 +50,7 @@ class AuthorMigration extends Migration { // OrmGenerator // ************************************************************************** -class BookQuery extends Query { +class BookQuery extends Query { BookQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -106,8 +106,10 @@ class BookQuery extends Query { return BookQueryWhere(this); } - static Book? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Book( id: row[0].toString(), createdAt: (row[1] as DateTime?), @@ -115,18 +117,19 @@ class BookQuery extends Query { name: (row[5] as String?)); if (row.length > 6) { model = model.copyWith( - author: AuthorQuery.parseRow(row.skip(6).take(4).toList())); + author: AuthorQuery.parseRow(row.skip(6).take(4).toList()).value); } if (row.length > 10) { model = model.copyWith( - partnerAuthor: AuthorQuery.parseRow(row.skip(10).take(4).toList())); + partnerAuthor: + AuthorQuery.parseRow(row.skip(10).take(4).toList()).value); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Book deserialize(List row) { + return parseRow(row).value; } AuthorQuery? get author { @@ -215,7 +218,7 @@ class BookQueryValues extends MapQueryValues { } } -class AuthorQuery extends Query { +class AuthorQuery extends Query { AuthorQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -253,19 +256,21 @@ class AuthorQuery extends Query { return AuthorQueryWhere(this); } - static Author? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Author( id: row[0].toString(), - createdAt: (row[1] as DateTime?), - updatedAt: (row[2] as DateTime?), - name: (row[3] as String?)); - return model; + createdAt: (row[1]), + updatedAt: (row[2]), + name: (row[3])); + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Author deserialize(List row) { + return parseRow(row).value; } } diff --git a/packages/orm/angel_orm_test/lib/src/models/car.dart b/packages/orm/angel_orm_test/lib/src/models/car.dart index 6e225f30..02c0e524 100644 --- a/packages/orm/angel_orm_test/lib/src/models/car.dart +++ b/packages/orm/angel_orm_test/lib/src/models/car.dart @@ -4,6 +4,7 @@ import 'package:angel_migration/angel_migration.dart'; import 'package:angel_model/angel_model.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; +import 'package:optional/optional.dart'; part 'car.g.dart'; @serializable diff --git a/packages/orm/angel_orm_test/lib/src/models/car.g.dart b/packages/orm/angel_orm_test/lib/src/models/car.g.dart index a56ccf0a..dbc92598 100644 --- a/packages/orm/angel_orm_test/lib/src/models/car.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/car.g.dart @@ -30,7 +30,7 @@ class CarMigration extends Migration { // OrmGenerator // ************************************************************************** -class CarQuery extends Query { +class CarQuery extends Query { CarQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -75,8 +75,10 @@ class CarQuery extends Query { return CarQueryWhere(this); } - static Car? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Car( id: row[0].toString(), createdAt: (row[1] as DateTime?), @@ -85,12 +87,12 @@ class CarQuery extends Query { description: (row[4] as String?), familyFriendly: (row[5] as bool?), recalledAt: (row[6] as DateTime?)); - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Car deserialize(List row) { + return parseRow(row).value; } } diff --git a/packages/orm/angel_orm_test/lib/src/models/custom_expr.dart b/packages/orm/angel_orm_test/lib/src/models/custom_expr.dart index 622c9201..1ac74811 100644 --- a/packages/orm/angel_orm_test/lib/src/models/custom_expr.dart +++ b/packages/orm/angel_orm_test/lib/src/models/custom_expr.dart @@ -2,6 +2,8 @@ import 'package:angel_migration/angel_migration.dart'; import 'package:angel_model/angel_model.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; +import 'package:optional/optional.dart'; + part 'custom_expr.g.dart'; @serializable diff --git a/packages/orm/angel_orm_test/lib/src/models/custom_expr.g.dart b/packages/orm/angel_orm_test/lib/src/models/custom_expr.g.dart index 4aad11b5..d1667384 100644 --- a/packages/orm/angel_orm_test/lib/src/models/custom_expr.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/custom_expr.g.dart @@ -46,7 +46,7 @@ class AlphabetMigration extends Migration { // OrmGenerator // ************************************************************************** -class NumbersQuery extends Query { +class NumbersQuery extends Query { NumbersQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -85,19 +85,21 @@ class NumbersQuery extends Query { return NumbersQueryWhere(this); } - static Numbers? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Numbers( id: row[0].toString(), createdAt: (row[1] as DateTime?), updatedAt: (row[2] as DateTime?), two: (row[3] as int?)); - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Numbers deserialize(List row) { + return parseRow(row).value; } } @@ -146,7 +148,7 @@ class NumbersQueryValues extends MapQueryValues { } } -class AlphabetQuery extends Query { +class AlphabetQuery extends Query { AlphabetQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -190,8 +192,10 @@ class AlphabetQuery extends Query { return AlphabetQueryWhere(this); } - static Alphabet? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Alphabet( id: row[0].toString(), createdAt: (row[1] as DateTime?), @@ -199,14 +203,14 @@ class AlphabetQuery extends Query { value: (row[3] as String?)); if (row.length > 5) { model = model.copyWith( - numbers: NumbersQuery.parseRow(row.skip(5).take(4).toList())); + numbers: NumbersQuery.parseRow(row.skip(5).take(4).toList()).value); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Alphabet deserialize(List row) { + return parseRow(row).value; } NumbersQuery? get numbers { diff --git a/packages/orm/angel_orm_test/lib/src/models/email_indexed.dart b/packages/orm/angel_orm_test/lib/src/models/email_indexed.dart index 4ca4d3e0..67a863b9 100644 --- a/packages/orm/angel_orm_test/lib/src/models/email_indexed.dart +++ b/packages/orm/angel_orm_test/lib/src/models/email_indexed.dart @@ -1,6 +1,8 @@ import 'package:angel_migration/angel_migration.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; +import 'package:optional/optional.dart'; + part 'email_indexed.g.dart'; // * https://github.com/angel-dart/angel/issues/116 diff --git a/packages/orm/angel_orm_test/lib/src/models/email_indexed.g.dart b/packages/orm/angel_orm_test/lib/src/models/email_indexed.g.dart index 741e4d5c..8b349367 100644 --- a/packages/orm/angel_orm_test/lib/src/models/email_indexed.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/email_indexed.g.dart @@ -75,7 +75,7 @@ class RoleQuery extends Query { @override final RoleQueryValues values = RoleQueryValues(); - RoleQueryWhere? _where; + late RoleQueryWhere _where; @override get casts { @@ -102,42 +102,44 @@ class RoleQuery extends Query { return RoleQueryWhere(this); } - static Role? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Role(role: (row[0] as String?)); if (row.length > 1) { - model = model.copyWith( - users: [UserQuery.parseRow(row.skip(1).take(3).toList())] - .where((x) => x != null) - .toList()); + var rowData = UserQuery.parseRow(row.skip(1).take(3).toList()); + if (rowData.isPresent) { + model = model.copyWith(users: [rowData.value]); + } } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Role deserialize(List row) { + return parseRow(row).value; } @override bool canCompile(trampoline) { - return (!(trampoline?.contains('roles') == true && - trampoline?.contains('role_users') == true)); + return (!(trampoline.contains('roles') == true && + trampoline.contains('role_users') == true)); } @override get(QueryExecutor executor) { return super.get(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.role == model!.role); + var idx = out.indexWhere((m) => m.role == model.role); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( - users: List<_User>.from(l.users)..addAll(model!.users)); + users: List<_User>.from(l.users)..addAll(model.users)); } }); }); @@ -146,16 +148,16 @@ class RoleQuery extends Query { @override update(QueryExecutor executor) { return super.update(executor).then((result) { - return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m!.role == model!.role); + return result.fold>([], (out, model) { + var idx = out.indexWhere((m) => m.role == model.role); if (idx == -1) { return out..add(model); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( - users: List<_User>.from(l.users)..addAll(model!.users)); + users: List<_User>.from(l.users)..addAll(model.users)); } }); }); @@ -165,15 +167,15 @@ class RoleQuery extends Query { delete(QueryExecutor executor) { return super.delete(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.role == model!.role); + var idx = out.indexWhere((m) => m.role == model.role); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( - users: List<_User>.from(l.users)..addAll(model!.users)); + users: List<_User>.from(l.users)..addAll(model.users)); } }); }); @@ -208,7 +210,7 @@ class RoleQueryValues extends MapQueryValues { } } -class RoleUserQuery extends Query { +class RoleUserQuery extends Query { RoleUserQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -257,23 +259,30 @@ class RoleUserQuery extends Query { return RoleUserQueryWhere(this); } - static RoleUser? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = RoleUser(); if (row.length > 2) { - model = model.copyWith( - role: RoleQuery.parseRow(row.skip(2).take(1).toList())); + var r = RoleQuery.parseRow(row.skip(2).take(1).toList()); + if (r.isPresent) { + model = model.copyWith(role: r.value); + } } if (row.length > 3) { - model = model.copyWith( - user: UserQuery.parseRow(row.skip(3).take(3).toList())); + var u = UserQuery.parseRow(row.skip(3).take(3).toList()); + if (u.isPresent) { + model = model.copyWith( + user: UserQuery.parseRow(row.skip(3).take(3).toList()).value); + } } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + RoleUser deserialize(List row) { + return parseRow(row).value; } RoleQuery? get role { @@ -342,7 +351,7 @@ class UserQuery extends Query { @override final UserQueryValues values = UserQueryValues(); - UserQueryWhere _where; + UserQueryWhere? _where; @override get casts { @@ -360,7 +369,7 @@ class UserQuery extends Query { } @override - UserQueryWhere get where { + UserQueryWhere? get where { return _where; } @@ -369,30 +378,34 @@ class UserQuery extends Query { return UserQueryWhere(this); } - static User? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = User( email: (row[0] as String?), name: (row[1] as String?), password: (row[2] as String?)); if (row.length > 3) { - model = model.copyWith( - roles: [RoleQuery.parseRow(row.skip(3).take(1).toList())] - .where((x) => x != null) - .toList()); + var d = RoleQuery.parseRow(row.skip(3).take(1).toList()); + + model = model.copyWith(roles: [d.value]); +// roles: [RoleQuery.parseRow(row.skip(3).take(1).toList())] +// .where((x) => x != null) +// .toList()); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + User deserialize(List row) { + return parseRow(row).value; } @override bool canCompile(trampoline) { - return (!(trampoline?.contains('users') == true && - trampoline?.contains('role_users') == true)); + return (!(trampoline.contains('users') == true && + trampoline.contains('role_users') == true)); } @override @@ -586,15 +599,12 @@ class User implements _User { final List<_Role> roles; User copyWith( - {String? email, - String? name, - String? password, - List<_Role> roles = const []}) { + {String? email, String? name, String? password, List<_Role>? roles}) { return User( email: email ?? this.email, name: name ?? this.name, password: password ?? this.password, - roles: roles); + roles: roles ?? []); } bool operator ==(other) { diff --git a/packages/orm/angel_orm_test/lib/src/models/has_car.dart b/packages/orm/angel_orm_test/lib/src/models/has_car.dart index 0e70f87a..b9f0b078 100644 --- a/packages/orm/angel_orm_test/lib/src/models/has_car.dart +++ b/packages/orm/angel_orm_test/lib/src/models/has_car.dart @@ -2,6 +2,8 @@ import 'package:angel_migration/angel_migration.dart'; import 'package:angel_model/angel_model.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; +import 'package:optional/optional.dart'; + // import 'car.dart'; part 'has_car.g.dart'; diff --git a/packages/orm/angel_orm_test/lib/src/models/has_car.g.dart b/packages/orm/angel_orm_test/lib/src/models/has_car.g.dart index d8e7de73..e29c4bb5 100644 --- a/packages/orm/angel_orm_test/lib/src/models/has_car.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/has_car.g.dart @@ -27,7 +27,7 @@ class HasCarMigration extends Migration { // OrmGenerator // ************************************************************************** -class HasCarQuery extends Query { +class HasCarQuery extends Query { HasCarQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -65,19 +65,21 @@ class HasCarQuery extends Query { return HasCarQueryWhere(this); } - static HasCar? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = HasCar( id: row[0].toString(), createdAt: (row[1] as DateTime?), updatedAt: (row[2] as DateTime?), type: row[3] == null ? null : CarType.values[(row[3] as int)]); - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + HasCar deserialize(List row) { + return parseRow(row).value; } } diff --git a/packages/orm/angel_orm_test/lib/src/models/has_map.dart b/packages/orm/angel_orm_test/lib/src/models/has_map.dart index c4452371..0d0fd9ab 100644 --- a/packages/orm/angel_orm_test/lib/src/models/has_map.dart +++ b/packages/orm/angel_orm_test/lib/src/models/has_map.dart @@ -3,6 +3,8 @@ import 'package:angel_migration/angel_migration.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; import 'package:collection/collection.dart'; +import 'package:optional/optional.dart'; + part 'has_map.g.dart'; // String _boolToCustom(bool v) => v ? 'yes' : 'no'; diff --git a/packages/orm/angel_orm_test/lib/src/models/has_map.g.dart b/packages/orm/angel_orm_test/lib/src/models/has_map.g.dart index 6d6cd544..f6746de3 100644 --- a/packages/orm/angel_orm_test/lib/src/models/has_map.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/has_map.g.dart @@ -25,7 +25,7 @@ class HasMapMigration extends Migration { // OrmGenerator // ************************************************************************** -class HasMapQuery extends Query { +class HasMapQuery extends Query { HasMapQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -63,17 +63,19 @@ class HasMapQuery extends Query { return HasMapQueryWhere(this); } - static HasMap? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = HasMap( value: (row[0] as Map?), list: (row[1] as List?)); - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + HasMap deserialize(List row) { + return parseRow(row).value; } } diff --git a/packages/orm/angel_orm_test/lib/src/models/leg.dart b/packages/orm/angel_orm_test/lib/src/models/leg.dart index 068584a0..67239ca0 100644 --- a/packages/orm/angel_orm_test/lib/src/models/leg.dart +++ b/packages/orm/angel_orm_test/lib/src/models/leg.dart @@ -4,6 +4,8 @@ import 'package:angel_migration/angel_migration.dart'; import 'package:angel_model/angel_model.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; +import 'package:optional/optional.dart'; + part 'leg.g.dart'; @serializable diff --git a/packages/orm/angel_orm_test/lib/src/models/leg.g.dart b/packages/orm/angel_orm_test/lib/src/models/leg.g.dart index 73f30efe..633313ae 100644 --- a/packages/orm/angel_orm_test/lib/src/models/leg.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/leg.g.dart @@ -45,7 +45,7 @@ class FootMigration extends Migration { // OrmGenerator // ************************************************************************** -class LegQuery extends Query { +class LegQuery extends Query { LegQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -94,8 +94,10 @@ class LegQuery extends Query { return LegQueryWhere(this); } - static Leg? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Leg( id: row[0].toString(), createdAt: (row[1] as DateTime?), @@ -103,14 +105,14 @@ class LegQuery extends Query { name: (row[3] as String?)); if (row.length > 4) { model = model.copyWith( - foot: FootQuery.parseRow(row.skip(4).take(5).toList())); + foot: FootQuery.parseRow(row.skip(4).take(5).toList()).value); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Leg deserialize(List row) { + return parseRow(row).value; } FootQuery? get foot { @@ -172,7 +174,7 @@ class LegQueryValues extends MapQueryValues { } } -class FootQuery extends Query { +class FootQuery extends Query { FootQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -209,20 +211,22 @@ class FootQuery extends Query { return FootQueryWhere(this); } - static Foot? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Foot( id: row[0].toString(), createdAt: (row[1] as DateTime?), updatedAt: (row[2] as DateTime?), legId: (row[3] as int?), nToes: double.tryParse(row[4].toString())); - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Foot deserialize(List row) { + return parseRow(row).value; } } diff --git a/packages/orm/angel_orm_test/lib/src/models/order.dart b/packages/orm/angel_orm_test/lib/src/models/order.dart index fb3c5cca..c203b6fc 100644 --- a/packages/orm/angel_orm_test/lib/src/models/order.dart +++ b/packages/orm/angel_orm_test/lib/src/models/order.dart @@ -4,6 +4,8 @@ import 'package:angel_migration/angel_migration.dart'; import 'package:angel_model/angel_model.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; +import 'package:optional/optional.dart'; + part 'order.g.dart'; @orm diff --git a/packages/orm/angel_orm_test/lib/src/models/order.g.dart b/packages/orm/angel_orm_test/lib/src/models/order.g.dart index 305fea87..ed161c22 100644 --- a/packages/orm/angel_orm_test/lib/src/models/order.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/order.g.dart @@ -48,7 +48,7 @@ class CustomerMigration extends Migration { // OrmGenerator // ************************************************************************** -class OrderQuery extends Query { +class OrderQuery extends Query { OrderQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -99,8 +99,10 @@ class OrderQuery extends Query { return OrderQueryWhere(this); } - static Order? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Order( id: row[0].toString(), createdAt: (row[1] as DateTime?), @@ -110,14 +112,14 @@ class OrderQuery extends Query { shipperId: (row[6] as int?)); if (row.length > 7) { model = model.copyWith( - customer: CustomerQuery.parseRow(row.skip(7).take(3).toList())); + customer: CustomerQuery.parseRow(row.skip(7).take(3).toList()).value); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Order deserialize(List row) { + return parseRow(row).value; } CustomerQuery? get customer { @@ -216,7 +218,7 @@ class OrderQueryValues extends MapQueryValues { } } -class CustomerQuery extends Query { +class CustomerQuery extends Query { CustomerQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -254,18 +256,20 @@ class CustomerQuery extends Query { return CustomerQueryWhere(this); } - static Customer? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Customer( id: row[0].toString(), createdAt: (row[1] as DateTime?), updatedAt: (row[2] as DateTime?)); - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Customer deserialize(List row) { + return parseRow(row).value; } } diff --git a/packages/orm/angel_orm_test/lib/src/models/tree.dart b/packages/orm/angel_orm_test/lib/src/models/tree.dart index 82bee315..02ebe827 100644 --- a/packages/orm/angel_orm_test/lib/src/models/tree.dart +++ b/packages/orm/angel_orm_test/lib/src/models/tree.dart @@ -5,6 +5,8 @@ import 'package:angel_model/angel_model.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; import 'package:collection/collection.dart'; +import 'package:optional/optional.dart'; + part 'tree.g.dart'; @serializable diff --git a/packages/orm/angel_orm_test/lib/src/models/tree.g.dart b/packages/orm/angel_orm_test/lib/src/models/tree.g.dart index 90e16c58..5783bd6c 100644 --- a/packages/orm/angel_orm_test/lib/src/models/tree.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/tree.g.dart @@ -45,7 +45,7 @@ class FruitMigration extends Migration { // OrmGenerator // ************************************************************************** -class TreeQuery extends Query { +class TreeQuery extends Query { TreeQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -94,8 +94,10 @@ class TreeQuery extends Query { return TreeQueryWhere(this); } - static Tree? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Tree( id: row[0].toString(), createdAt: (row[1] as DateTime?), @@ -103,16 +105,14 @@ class TreeQuery extends Query { rings: (row[3] as int?)); if (row.length > 4) { model = model.copyWith( - fruits: [FruitQuery.parseRow(row.skip(4).take(5).toList())] - .where((x) => x != null) - .toList()); + fruits: [FruitQuery.parseRow(row.skip(4).take(5).toList()).value]); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Tree deserialize(List row) { + return parseRow(row).value; } FruitQuery? get fruits { @@ -122,17 +122,17 @@ class TreeQuery extends Query { @override get(QueryExecutor executor) { return super.get(executor).then((result) { - return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m!.id == model!.id); + return result.fold>([], (out, model) { + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { return out..add(model); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( fruits: List<_Fruit>.from(l.fruits ?? []) - ..addAll(model!.fruits ?? [])); + ..addAll(model.fruits ?? [])); } }); }); @@ -141,17 +141,17 @@ class TreeQuery extends Query { @override update(QueryExecutor executor) { return super.update(executor).then((result) { - return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m!.id == model!.id); + return result.fold>([], (out, model) { + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { return out..add(model); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( fruits: List<_Fruit>.from(l.fruits ?? []) - ..addAll(model!.fruits ?? [])); + ..addAll(model.fruits ?? [])); } }); }); @@ -161,16 +161,16 @@ class TreeQuery extends Query { delete(QueryExecutor executor) { return super.delete(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.id == model!.id); + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( fruits: List<_Fruit>.from(l.fruits ?? []) - ..addAll(model!.fruits ?? [])); + ..addAll(model.fruits ?? [])); } }); }); @@ -231,7 +231,7 @@ class TreeQueryValues extends MapQueryValues { } } -class FruitQuery extends Query { +class FruitQuery extends Query { FruitQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -268,20 +268,22 @@ class FruitQuery extends Query { return FruitQueryWhere(this); } - static Fruit? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Fruit( id: row[0].toString(), createdAt: (row[1] as DateTime?), updatedAt: (row[2] as DateTime?), treeId: (row[3] as int?), commonName: (row[4] as String?)); - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Fruit deserialize(List row) { + return parseRow(row).value; } } diff --git a/packages/orm/angel_orm_test/lib/src/models/unorthodox.dart b/packages/orm/angel_orm_test/lib/src/models/unorthodox.dart index 99c33dbb..102ff42c 100644 --- a/packages/orm/angel_orm_test/lib/src/models/unorthodox.dart +++ b/packages/orm/angel_orm_test/lib/src/models/unorthodox.dart @@ -2,6 +2,8 @@ import 'package:angel_migration/angel_migration.dart'; import 'package:angel_model/angel_model.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; +import 'package:optional/optional.dart'; + part 'unorthodox.g.dart'; @serializable diff --git a/packages/orm/angel_orm_test/lib/src/models/unorthodox.g.dart b/packages/orm/angel_orm_test/lib/src/models/unorthodox.g.dart index ad789ac1..f8149809 100644 --- a/packages/orm/angel_orm_test/lib/src/models/unorthodox.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/unorthodox.g.dart @@ -105,7 +105,7 @@ class FooPivotMigration extends Migration { // OrmGenerator // ************************************************************************** -class UnorthodoxQuery extends Query { +class UnorthodoxQuery extends Query { UnorthodoxQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -143,15 +143,17 @@ class UnorthodoxQuery extends Query { return UnorthodoxQueryWhere(this); } - static Unorthodox? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Unorthodox(name: (row[0] as String?)); - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Unorthodox deserialize(List row) { + return parseRow(row).value; } } @@ -183,7 +185,7 @@ class UnorthodoxQueryValues extends MapQueryValues { } } -class WeirdJoinQuery extends Query { +class WeirdJoinQuery extends Query { WeirdJoinQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -252,35 +254,34 @@ class WeirdJoinQuery extends Query { return WeirdJoinQueryWhere(this); } - static WeirdJoin? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = WeirdJoin(id: (row[0] as int?)); if (row.length > 2) { model = model.copyWith( - unorthodox: UnorthodoxQuery.parseRow(row.skip(2).take(1).toList())); + unorthodox: + UnorthodoxQuery.parseRow(row.skip(2).take(1).toList()).value); } if (row.length > 3) { model = model.copyWith( - song: SongQuery.parseRow(row.skip(3).take(5).toList())); + song: SongQuery.parseRow(row.skip(3).take(5).toList()).value); } if (row.length > 8) { model = model.copyWith( - numbas: [NumbaQuery.parseRow(row.skip(8).take(2).toList())] - .where((x) => x != null) - .toList()); + numbas: [NumbaQuery.parseRow(row.skip(8).take(2).toList()).value]); } if (row.length > 10) { model = model.copyWith( - foos: [FooQuery.parseRow(row.skip(10).take(1).toList())] - .where((x) => x != null) - .toList()); + foos: [FooQuery.parseRow(row.skip(10).take(1).toList()).value]); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + WeirdJoin deserialize(List row) { + return parseRow(row).value; } UnorthodoxQuery? get unorthodox { @@ -297,28 +298,25 @@ class WeirdJoinQuery extends Query { @override bool canCompile(trampoline) { - return (!(trampoline?.contains('weird_joins') == true && - trampoline?.contains('foo_pivots') == true)); + return (!(trampoline.contains('weird_joins') == true && + trampoline.contains('foo_pivots') == true)); } @override get(QueryExecutor executor) { return super.get(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.id == model!.id); + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( numbas: List<_Numba>.from(l.numbas ?? []) - ..addAll(model == null - ? [] - : List<_Numba>.from(model.numbas ?? [])), - foos: List<_Foo?>.from(l.foos ?? []) - ..addAll(model?.foos ?? [])); + ..addAll(List<_Numba>.from(model.numbas ?? [])), + foos: List<_Foo?>.from(l.foos ?? [])..addAll(model.foos ?? [])); } }); }); @@ -328,16 +326,16 @@ class WeirdJoinQuery extends Query { update(QueryExecutor executor) { return super.update(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.id == model!.id); + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( numbas: List<_Numba?>.from(l.numbas ?? []) - ..addAll(model!.numbas ?? []), + ..addAll(model.numbas ?? []), foos: List<_Foo?>.from(l.foos ?? [])..addAll(model.foos ?? [])); } }); @@ -348,16 +346,16 @@ class WeirdJoinQuery extends Query { delete(QueryExecutor executor) { return super.delete(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.id == model!.id); + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( numbas: List<_Numba?>.from(l.numbas ?? []) - ..addAll(model!.numbas ?? []), + ..addAll(model.numbas ?? []), foos: List<_Foo?>.from(l.foos ?? [])..addAll(model.foos ?? [])); } }); @@ -404,7 +402,7 @@ class WeirdJoinQueryValues extends MapQueryValues { } } -class SongQuery extends Query { +class SongQuery extends Query { SongQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -441,20 +439,22 @@ class SongQuery extends Query { return SongQueryWhere(this); } - static Song? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Song( id: row[0].toString(), createdAt: (row[1] as DateTime?), updatedAt: (row[2] as DateTime?), weirdJoinId: (row[3] as int?), title: (row[4] as String?)); - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Song deserialize(List row) { + return parseRow(row).value; } } @@ -521,7 +521,7 @@ class SongQueryValues extends MapQueryValues { } } -class NumbaQuery extends Query { +class NumbaQuery extends Query { NumbaQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -558,15 +558,17 @@ class NumbaQuery extends Query { return NumbaQueryWhere(this); } - static Numba? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Numba(i: (row[0] as int?), parent: (row[1] as int?)); - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Numba deserialize(List row) { + return parseRow(row).value; } } @@ -607,7 +609,7 @@ class NumbaQueryValues extends MapQueryValues { } } -class FooQuery extends Query { +class FooQuery extends Query { FooQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -650,43 +652,44 @@ class FooQuery extends Query { return FooQueryWhere(this); } - static Foo? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Foo(bar: (row[0] as String?)); if (row.length > 1) { - model = model.copyWith( - weirdJoins: [WeirdJoinQuery.parseRow(row.skip(1).take(2).toList())] - .where((x) => x != null) - .toList()); + model = model.copyWith(weirdJoins: [ + WeirdJoinQuery.parseRow(row.skip(1).take(2).toList()).value + ]); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Foo deserialize(List row) { + return parseRow(row).value; } @override bool canCompile(trampoline) { - return (!(trampoline?.contains('foos') == true && - trampoline?.contains('foo_pivots') == true)); + return (!(trampoline.contains('foos') == true && + trampoline.contains('foo_pivots') == true)); } @override get(QueryExecutor executor) { return super.get(executor).then((result) { - return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m!.bar == model!.bar); + return result.fold>([], (out, model) { + var idx = out.indexWhere((m) => m.bar == model.bar); if (idx == -1) { return out..add(model); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( - weirdJoins: List<_WeirdJoin?>.from(l.weirdJoins ?? []) - ..addAll(model!.weirdJoins ?? [])); + weirdJoins: List<_WeirdJoin>.from(l.weirdJoins ?? []) + ..addAll(model.weirdJoins ?? [])); } }); }); @@ -695,17 +698,17 @@ class FooQuery extends Query { @override update(QueryExecutor executor) { return super.update(executor).then((result) { - return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m!.bar == model!.bar); + return result.fold>([], (out, model) { + var idx = out.indexWhere((m) => m.bar == model.bar); if (idx == -1) { return out..add(model); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( - weirdJoins: List<_WeirdJoin?>.from(l.weirdJoins ?? []) - ..addAll(model!.weirdJoins ?? [])); + weirdJoins: List<_WeirdJoin>.from(l.weirdJoins ?? []) + ..addAll(model.weirdJoins ?? [])); } }); }); @@ -714,17 +717,17 @@ class FooQuery extends Query { @override delete(QueryExecutor executor) { return super.delete(executor).then((result) { - return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m!.bar == model!.bar); + return result.fold>([], (out, model) { + var idx = out.indexWhere((m) => m.bar == model.bar); if (idx == -1) { return out..add(model); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( - weirdJoins: List<_WeirdJoin?>.from(l.weirdJoins ?? []) - ..addAll(model!.weirdJoins ?? [])); + weirdJoins: List<_WeirdJoin>.from(l.weirdJoins ?? []) + ..addAll(model.weirdJoins ?? [])); } }); }); @@ -759,7 +762,7 @@ class FooQueryValues extends MapQueryValues { } } -class FooPivotQuery extends Query { +class FooPivotQuery extends Query { FooPivotQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -807,23 +810,26 @@ class FooPivotQuery extends Query { return FooPivotQueryWhere(this); } - static FooPivot? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = FooPivot(); if (row.length > 2) { model = model.copyWith( - weirdJoin: WeirdJoinQuery.parseRow(row.skip(2).take(2).toList())); + weirdJoin: + WeirdJoinQuery.parseRow(row.skip(2).take(2).toList()).value); } if (row.length > 4) { - model = - model.copyWith(foo: FooQuery.parseRow(row.skip(4).take(1).toList())); + model = model.copyWith( + foo: FooQuery.parseRow(row.skip(4).take(1).toList()).value); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + FooPivot deserialize(List row) { + return parseRow(row).value; } WeirdJoinQuery? get weirdJoin { @@ -1070,9 +1076,9 @@ class Foo implements _Foo { final String? bar; @override - final List<_WeirdJoin?>? weirdJoins; + final List<_WeirdJoin>? weirdJoins; - Foo copyWith({String? bar, List<_WeirdJoin?>? weirdJoins}) { + Foo copyWith({String? bar, List<_WeirdJoin>? weirdJoins}) { return Foo(bar: bar ?? this.bar, weirdJoins: weirdJoins ?? this.weirdJoins); } diff --git a/packages/orm/angel_orm_test/lib/src/models/user.dart b/packages/orm/angel_orm_test/lib/src/models/user.dart index 16da257f..711537ab 100644 --- a/packages/orm/angel_orm_test/lib/src/models/user.dart +++ b/packages/orm/angel_orm_test/lib/src/models/user.dart @@ -5,6 +5,8 @@ import 'package:angel_model/angel_model.dart'; import 'package:angel_orm/angel_orm.dart'; import 'package:angel_serialize/angel_serialize.dart'; import 'package:collection/collection.dart'; +import 'package:optional/optional.dart'; + part 'user.g.dart'; @serializable diff --git a/packages/orm/angel_orm_test/lib/src/models/user.g.dart b/packages/orm/angel_orm_test/lib/src/models/user.g.dart index 14461a40..959024c7 100644 --- a/packages/orm/angel_orm_test/lib/src/models/user.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/user.g.dart @@ -61,7 +61,7 @@ class RoleMigration extends Migration { // OrmGenerator // ************************************************************************** -class UserQuery extends Query { +class UserQuery extends Query { UserQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -111,8 +111,10 @@ class UserQuery extends Query { return UserQueryWhere(this); } - static User? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = User( id: row[0].toString(), createdAt: (row[1] as DateTime?), @@ -122,37 +124,35 @@ class UserQuery extends Query { email: (row[5] as String?)); if (row.length > 6) { model = model.copyWith( - roles: [RoleQuery.parseRow(row.skip(6).take(4).toList())] - .where((x) => x != null) - .toList()); + roles: [RoleQuery.parseRow(row.skip(6).take(4).toList()).value]); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + User deserialize(List row) { + return parseRow(row).value; } @override bool canCompile(trampoline) { - return (!(trampoline?.contains('users') == true && - trampoline?.contains('role_users') == true)); + return (!(trampoline.contains('users') == true && + trampoline.contains('role_users') == true)); } @override get(QueryExecutor executor) { return super.get(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.id == model!.id); + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( - roles: List<_Role>.from(l.roles)..addAll(model!.roles)); + roles: List<_Role>.from(l.roles)..addAll(model.roles)); } }); }); @@ -162,15 +162,15 @@ class UserQuery extends Query { update(QueryExecutor executor) { return super.update(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.id == model!.id); + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( - roles: List<_Role>.from(l.roles)..addAll(model!.roles)); + roles: List<_Role>.from(l.roles)..addAll(model.roles)); } }); }); @@ -180,15 +180,15 @@ class UserQuery extends Query { delete(QueryExecutor executor) { return super.delete(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.id == model!.id); + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( - roles: List<_Role>.from(l.roles)..addAll(model!.roles)); + roles: List<_Role>.from(l.roles)..addAll(model.roles)); } }); }); @@ -267,7 +267,7 @@ class UserQueryValues extends MapQueryValues { } } -class RoleUserQuery extends Query { +class RoleUserQuery extends Query { RoleUserQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); @@ -324,23 +324,25 @@ class RoleUserQuery extends Query { return RoleUserQueryWhere(this); } - static RoleUser? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = RoleUser(); if (row.length > 2) { model = model.copyWith( - role: RoleQuery.parseRow(row.skip(2).take(4).toList())); + role: RoleQuery.parseRow(row.skip(2).take(4).toList()).value); } if (row.length > 6) { model = model.copyWith( - user: UserQuery.parseRow(row.skip(6).take(6).toList())); + user: UserQuery.parseRow(row.skip(6).take(6).toList()).value); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + RoleUser deserialize(List row) { + return parseRow(row).value; } RoleQuery? get role { @@ -393,7 +395,7 @@ class RoleUserQueryValues extends MapQueryValues { } } -class RoleQuery extends Query { +class RoleQuery extends Query { RoleQuery({Query? parent, Set? trampoline}) : super(parent: parent) { trampoline ??= Set(); trampoline.add(tableName); @@ -443,8 +445,10 @@ class RoleQuery extends Query { return RoleQueryWhere(this); } - static Role? parseRow(List row) { - if (row.every((x) => x == null)) return null; + static Optional parseRow(List row) { + if (row.every((x) => x == null)) { + return Optional.empty(); + } var model = Role( id: row[0].toString(), createdAt: (row[1] as DateTime?), @@ -452,37 +456,35 @@ class RoleQuery extends Query { name: (row[3] as String?)); if (row.length > 4) { model = model.copyWith( - users: [UserQuery.parseRow(row.skip(4).take(6).toList())] - .where((x) => x != null) - .toList()); + users: [UserQuery.parseRow(row.skip(4).take(6).toList()).value]); } - return model; + return Optional.ofNullable(model); } @override - deserialize(List row) { - return parseRow(row); + Role deserialize(List row) { + return parseRow(row).value; } @override bool canCompile(trampoline) { - return (!(trampoline?.contains('roles') == true && - trampoline?.contains('role_users') == true)); + return (!(trampoline.contains('roles') == true && + trampoline.contains('role_users') == true)); } @override get(QueryExecutor executor) { return super.get(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.id == model!.id); + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( - users: List<_User>.from(l.users)..addAll(model!.users)); + users: List<_User>.from(l.users)..addAll(model.users)); } }); }); @@ -491,16 +493,16 @@ class RoleQuery extends Query { @override update(QueryExecutor executor) { return super.update(executor).then((result) { - return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m!.id == model!.id); + return result.fold>([], (out, model) { + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { return out..add(model); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( - users: List<_User>.from(l.users)..addAll(model!.users)); + users: List<_User>.from(l.users)..addAll(model.users)); } }); }); @@ -510,15 +512,15 @@ class RoleQuery extends Query { delete(QueryExecutor executor) { return super.delete(executor).then((result) { return result.fold>([], (out, model) { - var idx = out.indexWhere((m) => m.id == model!.id); + var idx = out.indexWhere((m) => m.id == model.id); if (idx == -1) { - return out..add(model!); + return out..add(model); } else { var l = out[idx]; return out ..[idx] = l.copyWith( - users: List<_User>.from(l.users)..addAll(model!.users)); + users: List<_User>.from(l.users)..addAll(model.users)); } }); }); diff --git a/packages/orm/angel_orm_test/lib/src/standalone_test.dart b/packages/orm/angel_orm_test/lib/src/standalone_test.dart index 77666702..35fa59c2 100644 --- a/packages/orm/angel_orm_test/lib/src/standalone_test.dart +++ b/packages/orm/angel_orm_test/lib/src/standalone_test.dart @@ -24,7 +24,7 @@ standaloneTests(FutureOr Function() createExecutor, // var row = [0, 'Mazda', 'CX9', true, y2k, y2k, y2k]; var row = [0, y2k, y2k, 'Mazda', 'CX9', true, y2k]; print(row); - var car = CarQuery().deserialize(row)!; + var car = CarQuery().deserialize(row); print(car.toJson()); expect(car.id, '0'); expect(car.make, 'Mazda'); @@ -47,7 +47,7 @@ standaloneTests(FutureOr Function() createExecutor, group('selects', () { test('select all', () async { - List cars = await CarQuery().get(executor); + List cars = await CarQuery().get(executor); expect(cars, []); }); @@ -60,19 +60,19 @@ standaloneTests(FutureOr Function() createExecutor, ..make = 'Ferrarię±' ..description = 'Vroom vroom!' ..familyFriendly = false; - ferrari = await query.insert(executor); + ferrari = (await query.insert(executor)).value; }); test('where clause is applied', () async { var query = CarQuery()..where!.familyFriendly.isTrue; - List cars = await query.get(executor); + List cars = await query.get(executor); expect(cars, isEmpty); var sportsCars = CarQuery()..where!.familyFriendly.isFalse; cars = await sportsCars.get(executor); - print(cars.map((c) => c!.toJson())); + print(cars.map((c) => c.toJson())); - var car = cars.first!; + var car = cars.first; expect(car.make, ferrari!.make); expect(car.description, ferrari!.description); expect(car.familyFriendly, ferrari!.familyFriendly); @@ -80,10 +80,10 @@ standaloneTests(FutureOr Function() createExecutor, }); test('union', () async { - var query1 = CarQuery()..where!.make.like('%Fer%'); - var query2 = CarQuery()..where!.familyFriendly.isTrue; - var query3 = CarQuery()..where!.description.equals('Submarine'); - Union union = query1.union(query2).unionAll(query3); + var query1 = CarQuery()..where?.make.like('%Fer%'); + var query2 = CarQuery()..where?.familyFriendly.isTrue; + var query3 = CarQuery()..where?.description.equals('Submarine'); + Union union = query1.union(query2).unionAll(query3); print(union.compile(Set())); var cars = await union.get(executor); expect(cars, hasLength(1)); @@ -93,17 +93,17 @@ standaloneTests(FutureOr Function() createExecutor, var query = CarQuery() ..where!.make.like('Fer%') ..orWhere((where) => where - ?..familyFriendly.isTrue + ..familyFriendly.isTrue ..make.equals('Honda')); print(query.compile(Set())); - List cars = await query.get(executor); + List cars = await query.get(executor); expect(cars, hasLength(1)); }); test('limit obeyed', () async { var query = CarQuery()..limit(0); print(query.compile(Set())); - List cars = await query.get(executor); + List cars = await query.get(executor); expect(cars, isEmpty); }); @@ -120,28 +120,28 @@ standaloneTests(FutureOr Function() createExecutor, var car = await (query.deleteOne(executor) as FutureOr); expect(car.toJson(), ferrari!.toJson()); - List cars = await CarQuery().get(executor); + List cars = await CarQuery().get(executor); expect(cars, isEmpty); }); test('delete stream', () async { var query = CarQuery() ..where!.make.equals('Ferrarię±') - ..orWhere((w) => w!.familyFriendly.isTrue); + ..orWhere((w) => w.familyFriendly.isTrue); print(query.compile(Set(), preamble: 'DELETE FROM "cars"')); - List? cars = await query.delete(executor); + List cars = await query.delete(executor); expect(cars, hasLength(1)); - expect(cars.first!.toJson(), ferrari!.toJson()); + expect(cars.first.toJson(), ferrari!.toJson()); }); test('update', () async { var query = CarQuery() ..where!.id.equals(int.parse(ferrari!.id!)) ..values.make = 'Hyundai'; - List cars = await query.update(executor); + List cars = await query.update(executor); expect(cars, hasLength(1)); - expect(cars.first!.make, 'Hyundai'); + expect(cars.first.make, 'Hyundai'); }); test('update car', () async { diff --git a/packages/orm/angel_orm_test/pubspec.yaml b/packages/orm/angel_orm_test/pubspec.yaml index 9946531a..76599356 100644 --- a/packages/orm/angel_orm_test/pubspec.yaml +++ b/packages/orm/angel_orm_test/pubspec.yaml @@ -38,6 +38,7 @@ dev_dependencies: ref: sdk-2.12.x_nnbd path: packages/framework build_runner: ^2.0.1 + optional: ^6.0.0-nullsafety.2 #dependency_overrides: # angel_orm: