Replace null with Optional

This commit is contained in:
thomashii@dukefirehawk.com 2021-05-04 16:15:19 +08:00
parent 0204977281
commit 8d3c8b9121
34 changed files with 403 additions and 333 deletions

View file

@ -19,7 +19,8 @@ abstract class QueryBase<T> {
/// The list of fields returned by this query. /// 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<String> get fields; List<String> get fields;
/// A String of all [fields], joined by a comma (`,`). /// A String of all [fields], joined by a comma (`,`).
@ -42,6 +43,7 @@ abstract class QueryBase<T> {
Future<List<T>> get(QueryExecutor executor) async { Future<List<T>> get(QueryExecutor executor) async {
var sql = compile({}); var sql = compile({});
return executor return executor
.query(tableName, sql, substitutionValues) .query(tableName, sql, substitutionValues)
.then((it) => it.map(deserialize).toList()); .then((it) => it.map(deserialize).toList());

View file

@ -6,7 +6,7 @@ import 'package:angel_orm_test/src/models/car.dart';
@Expose('/api/cars') @Expose('/api/cars')
class CarController extends Controller { class CarController extends Controller {
@Expose('/luxury') @Expose('/luxury')
Future<List<Car?>> getLuxuryCars(QueryExecutor connection) { Future<List<Car>> getLuxuryCars(QueryExecutor connection) {
var query = CarQuery(); var query = CarQuery();
query.where query.where
?..familyFriendly.equals(false) ?..familyFriendly.equals(false)

View file

@ -2,6 +2,8 @@ import 'dart:async';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
import 'models/book.dart'; import 'models/book.dart';
import 'package:optional/optional.dart';
import 'util.dart'; import 'util.dart';
belongsToTests(FutureOr<QueryExecutor> Function() createExecutor, belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
@ -17,10 +19,10 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
// Insert an author // Insert an author
var query = AuthorQuery()..values.name = 'J.K. Rowling'; 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'; query.values.name = 'J.K. Jameson';
jameson = await query.insert(executor); jameson = (await query.insert(executor)).value;
// And a book // And a book
var bookQuery = BookQuery(); var bookQuery = BookQuery();
@ -29,7 +31,7 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
..partnerAuthorId = int.parse(jameson!.id!) ..partnerAuthorId = int.parse(jameson!.id!)
..name = 'Deathly Hallows'; ..name = 'Deathly Hallows';
deathlyHallows = await bookQuery.insert(executor); deathlyHallows = (await bookQuery.insert(executor)).value;
}); });
tearDown(() => close!(executor)); tearDown(() => close!(executor));
@ -37,10 +39,10 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
group('selects', () { group('selects', () {
test('select all', () async { test('select all', () async {
var query = BookQuery(); var query = BookQuery();
List<Book?> books = await query.get(executor); List<Book> books = await query.get(executor);
expect(books, hasLength(1)); expect(books, hasLength(1));
var book = books.first!; var book = books.first;
print(book.toJson()); print(book.toJson());
expect(book.id, deathlyHallows!.id); expect(book.id, deathlyHallows!.id);
expect(book.name, deathlyHallows!.name); expect(book.name, deathlyHallows!.name);
@ -70,10 +72,10 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
test('where clause', () async { test('where clause', () async {
var query = BookQuery() var query = BookQuery()
..where!.name.equals('Goblet of Fire') ..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())); print(query.compile(Set()));
List<Book> books = await query.get(executor) as List<Book>; List<Book> books = await query.get(executor);
expect(books, hasLength(1)); expect(books, hasLength(1));
var book = books.first; var book = books.first;
@ -97,10 +99,10 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
..unionAll(query3); ..unionAll(query3);
print(query1.compile(Set())); print(query1.compile(Set()));
List<Book?> books = await query1.get(executor); List<Book> books = await query1.get(executor);
expect(books, hasLength(1)); expect(books, hasLength(1));
var book = books.first!; var book = books.first;
print(book.toJson()); print(book.toJson());
expect(book.id, deathlyHallows!.id); expect(book.id, deathlyHallows!.id);
expect(book.name, deathlyHallows!.name); expect(book.name, deathlyHallows!.name);
@ -113,7 +115,7 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
test('order by', () async { test('order by', () async {
var query = AuthorQuery()..orderBy(AuthorFields.name, descending: true); var query = AuthorQuery()..orderBy(AuthorFields.name, descending: true);
List<Author?> authors = await query.get(executor); List<Author> authors = await query.get(executor);
expect(authors, [jkRowling, jameson]); expect(authors, [jkRowling, jameson]);
}); });
}); });
@ -128,7 +130,7 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
printSeparator('Delete stream test'); printSeparator('Delete stream test');
var query = BookQuery()..where!.name.equals(deathlyHallows!.name!); var query = BookQuery()..where!.name.equals(deathlyHallows!.name!);
print(query.compile(Set(), preamble: 'DELETE', withFields: false)); print(query.compile(Set(), preamble: 'DELETE', withFields: false));
List<Book>? books = await query.delete(executor) as List<Book>; List<Book>? books = await query.delete(executor);
expect(books, hasLength(1)); expect(books, hasLength(1));
var book = books.first; var book = books.first;

View file

@ -18,7 +18,7 @@ customExprTests(FutureOr<QueryExecutor> Function() createExecutor,
nQuery.values nQuery.values
..createdAt = now ..createdAt = now
..updatedAt = now; ..updatedAt = now;
numbersModel = await nQuery.insert(executor); numbersModel = (await nQuery.insert(executor)).value;
}); });
tearDown(() => close!(executor)); tearDown(() => close!(executor));

View file

@ -25,7 +25,7 @@ edgeCaseTests(FutureOr<QueryExecutor> Function() createExecutor,
setUp(() async { setUp(() async {
var query = UnorthodoxQuery()..values.name = 'Hey'; var query = UnorthodoxQuery()..values.name = 'Hey';
unorthodox = await query.insert(executor); unorthodox = (await query.insert(executor)).value;
}); });
test('belongs to', () async { test('belongs to', () async {
@ -42,12 +42,12 @@ edgeCaseTests(FutureOr<QueryExecutor> Function() createExecutor,
setUp(() async { setUp(() async {
var wjQuery = WeirdJoinQuery()..values.joinName = unorthodox!.name; var wjQuery = WeirdJoinQuery()..values.joinName = unorthodox!.name;
weirdJoin = await wjQuery.insert(executor); weirdJoin = (await wjQuery.insert(executor)).value;
var gbQuery = SongQuery() var gbQuery = SongQuery()
..values.weirdJoinId = weirdJoin!.id ..values.weirdJoinId = weirdJoin!.id
..values.title = 'Girl Blue'; ..values.title = 'Girl Blue';
girlBlue = await gbQuery.insert(executor); girlBlue = (await gbQuery.insert(executor)).value;
}); });
test('has one', () async { test('has one', () async {
@ -65,7 +65,7 @@ edgeCaseTests(FutureOr<QueryExecutor> Function() createExecutor,
..values.parent = weirdJoin!.id ..values.parent = weirdJoin!.id
..values.i = i; ..values.i = i;
var model = await query.insert(executor); var model = await query.insert(executor);
numbas.add(model); numbas.add(model.value);
} }
var query = WeirdJoinQuery()..where!.id.equals(weirdJoin!.id!); var query = WeirdJoinQuery()..where!.id.equals(weirdJoin!.id!);
@ -76,7 +76,8 @@ edgeCaseTests(FutureOr<QueryExecutor> Function() createExecutor,
test('many to many', () async { test('many to many', () async {
var fooQuery = FooQuery()..values.bar = 'baz'; 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() var pivotQuery = FooPivotQuery()
..values.weirdJoinId = weirdJoin!.id ..values.weirdJoinId = weirdJoin!.id
..values.fooBar = fooBar; ..values.fooBar = fooBar;
@ -86,7 +87,7 @@ edgeCaseTests(FutureOr<QueryExecutor> Function() createExecutor,
var foo = await (fooQuery.getOne(executor) as FutureOr<Foo>); var foo = await (fooQuery.getOne(executor) as FutureOr<Foo>);
print(foo.toJson()); print(foo.toJson());
print(weirdJoin!.toJson()); print(weirdJoin!.toJson());
expect(foo.weirdJoins![0]!.id, weirdJoin!.id); expect(foo.weirdJoins![0].id, weirdJoin!.id);
}); });
}); });
}); });

View file

@ -24,7 +24,7 @@ enumAndNestedTests(FutureOr<QueryExecutor> Function() createExecutor,
setUp(() async { setUp(() async {
var query = HasCarQuery(); var query = HasCarQuery();
query.values.type = CarType.sedan; query.values.type = CarType.sedan;
initialValue = await query.insert(executor); initialValue = (await query.insert(executor)).value;
}); });
test('query by enum', () async { test('query by enum', () async {

View file

@ -14,7 +14,7 @@ hasManyTests(FutureOr<QueryExecutor> Function() createExecutor,
var query = TreeQuery()..values.rings = 10; var query = TreeQuery()..values.rings = 10;
executor = await createExecutor(); executor = await createExecutor();
appleTree = await query.insert(executor); appleTree = (await query.insert(executor)).value;
treeId = int.parse(appleTree!.id!); treeId = int.parse(appleTree!.id!);
}); });
@ -44,8 +44,8 @@ hasManyTests(FutureOr<QueryExecutor> Function() createExecutor,
..values.treeId = treeId ..values.treeId = treeId
..values.commonName = 'Banana'; ..values.commonName = 'Banana';
apple = await appleQuery.insert(executor); apple = (await appleQuery.insert(executor)).value;
banana = await bananaQuery.insert(executor); banana = (await bananaQuery.insert(executor)).value;
}); });
test('can fetch any children', () async { test('can fetch any children', () async {

View file

@ -44,7 +44,7 @@ hasMapTests(FutureOr<QueryExecutor> Function() createExecutor,
query.values query.values
..value = {'foo': 'bar'} ..value = {'foo': 'bar'}
..list = ['1', 2, 3.0]; ..list = ['1', 2, 3.0];
initialValue = await query.insert(executor); initialValue = (await query.insert(executor)).value;
}); });
test('get all', () async { test('get all', () async {

View file

@ -12,7 +12,7 @@ hasOneTests(FutureOr<QueryExecutor> Function() createExecutor,
setUp(() async { setUp(() async {
executor = await createExecutor(); executor = await createExecutor();
var query = LegQuery()..values.name = 'Left'; var query = LegQuery()..values.name = 'Left';
originalLeg = await query.insert(executor); originalLeg = (await query.insert(executor)).value;
}); });
tearDown(() => close!(executor)); tearDown(() => close!(executor));

View file

@ -48,10 +48,10 @@ manyToManyTests(FutureOr<QueryExecutor> Function() createExecutor,
var canPubQuery = RoleQuery()..values.name = 'can_pub'; var canPubQuery = RoleQuery()..values.name = 'can_pub';
var canSubQuery = RoleQuery()..values.name = 'can_sub'; var canSubQuery = RoleQuery()..values.name = 'can_sub';
canPub = await canPubQuery.insert(executor); canPub = (await canPubQuery.insert(executor)).value;
print('=== CANPUB: ${canPub?.toJson()}'); print('=== CANPUB: ${canPub?.toJson()}');
// await dumpQuery(canPubQuery.compile(Set())); // await dumpQuery(canPubQuery.compile(Set()));
canSub = await canSubQuery.insert(executor); canSub = (await canSubQuery.insert(executor)).value;
print('=== CANSUB: ${canSub?.toJson()}'); print('=== CANSUB: ${canSub?.toJson()}');
var thosakweQuery = UserQuery(); var thosakweQuery = UserQuery();
@ -59,7 +59,7 @@ manyToManyTests(FutureOr<QueryExecutor> Function() createExecutor,
..username = 'thosakwe' ..username = 'thosakwe'
..password = 'Hahahahayoureallythoughtiwasstupidenoughtotypethishere' ..password = 'Hahahahayoureallythoughtiwasstupidenoughtotypethishere'
..email = 'thosakwe AT gmail.com'; ..email = 'thosakwe AT gmail.com';
thosakwe = await thosakweQuery.insert(executor); thosakwe = (await thosakweQuery.insert(executor)).value;
print('=== THOSAKWE: ${thosakwe?.toJson()}'); print('=== THOSAKWE: ${thosakwe?.toJson()}');
// Allow thosakwe to publish... // Allow thosakwe to publish...
@ -95,7 +95,7 @@ manyToManyTests(FutureOr<QueryExecutor> Function() createExecutor,
Future<User?> fetchThosakwe() async { Future<User?> fetchThosakwe() async {
var query = UserQuery()..where!.id.equals(int.parse(thosakwe!.id!)); 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 { test('fetch roles for user', () async {

View file

@ -4,6 +4,8 @@ import 'package:angel_migration/angel_migration.dart';
import 'package:angel_model/angel_model.dart'; import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:optional/optional.dart';
part 'book.g.dart'; part 'book.g.dart';
@serializable @serializable

View file

@ -50,7 +50,7 @@ class AuthorMigration extends Migration {
// OrmGenerator // OrmGenerator
// ************************************************************************** // **************************************************************************
class BookQuery extends Query<Book?, BookQueryWhere?> { class BookQuery extends Query<Book, BookQueryWhere> {
BookQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { BookQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -106,8 +106,10 @@ class BookQuery extends Query<Book?, BookQueryWhere?> {
return BookQueryWhere(this); return BookQueryWhere(this);
} }
static Book? parseRow(List row) { static Optional<Book> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Book( var model = Book(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
@ -115,18 +117,19 @@ class BookQuery extends Query<Book?, BookQueryWhere?> {
name: (row[5] as String?)); name: (row[5] as String?));
if (row.length > 6) { if (row.length > 6) {
model = model.copyWith( 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) { if (row.length > 10) {
model = model.copyWith( 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 @override
deserialize(List row) { Book deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
AuthorQuery? get author { AuthorQuery? get author {
@ -215,7 +218,7 @@ class BookQueryValues extends MapQueryValues {
} }
} }
class AuthorQuery extends Query<Author?, AuthorQueryWhere?> { class AuthorQuery extends Query<Author, AuthorQueryWhere> {
AuthorQuery({Query? parent, Set<String>? trampoline}) AuthorQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -253,19 +256,21 @@ class AuthorQuery extends Query<Author?, AuthorQueryWhere?> {
return AuthorQueryWhere(this); return AuthorQueryWhere(this);
} }
static Author? parseRow(List row) { static Optional<Author> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Author( var model = Author(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1]),
updatedAt: (row[2] as DateTime?), updatedAt: (row[2]),
name: (row[3] as String?)); name: (row[3]));
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Author deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }

View file

@ -4,6 +4,7 @@ import 'package:angel_migration/angel_migration.dart';
import 'package:angel_model/angel_model.dart'; import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:optional/optional.dart';
part 'car.g.dart'; part 'car.g.dart';
@serializable @serializable

View file

@ -30,7 +30,7 @@ class CarMigration extends Migration {
// OrmGenerator // OrmGenerator
// ************************************************************************** // **************************************************************************
class CarQuery extends Query<Car?, CarQueryWhere?> { class CarQuery extends Query<Car, CarQueryWhere> {
CarQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { CarQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -75,8 +75,10 @@ class CarQuery extends Query<Car?, CarQueryWhere?> {
return CarQueryWhere(this); return CarQueryWhere(this);
} }
static Car? parseRow(List row) { static Optional<Car> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Car( var model = Car(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
@ -85,12 +87,12 @@ class CarQuery extends Query<Car?, CarQueryWhere?> {
description: (row[4] as String?), description: (row[4] as String?),
familyFriendly: (row[5] as bool?), familyFriendly: (row[5] as bool?),
recalledAt: (row[6] as DateTime?)); recalledAt: (row[6] as DateTime?));
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Car deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }

View file

@ -2,6 +2,8 @@ import 'package:angel_migration/angel_migration.dart';
import 'package:angel_model/angel_model.dart'; import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:optional/optional.dart';
part 'custom_expr.g.dart'; part 'custom_expr.g.dart';
@serializable @serializable

View file

@ -46,7 +46,7 @@ class AlphabetMigration extends Migration {
// OrmGenerator // OrmGenerator
// ************************************************************************** // **************************************************************************
class NumbersQuery extends Query<Numbers?, NumbersQueryWhere?> { class NumbersQuery extends Query<Numbers, NumbersQueryWhere> {
NumbersQuery({Query? parent, Set<String>? trampoline}) NumbersQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -85,19 +85,21 @@ class NumbersQuery extends Query<Numbers?, NumbersQueryWhere?> {
return NumbersQueryWhere(this); return NumbersQueryWhere(this);
} }
static Numbers? parseRow(List row) { static Optional<Numbers> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Numbers( var model = Numbers(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
updatedAt: (row[2] as DateTime?), updatedAt: (row[2] as DateTime?),
two: (row[3] as int?)); two: (row[3] as int?));
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Numbers deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }
@ -146,7 +148,7 @@ class NumbersQueryValues extends MapQueryValues {
} }
} }
class AlphabetQuery extends Query<Alphabet?, AlphabetQueryWhere?> { class AlphabetQuery extends Query<Alphabet, AlphabetQueryWhere> {
AlphabetQuery({Query? parent, Set<String>? trampoline}) AlphabetQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -190,8 +192,10 @@ class AlphabetQuery extends Query<Alphabet?, AlphabetQueryWhere?> {
return AlphabetQueryWhere(this); return AlphabetQueryWhere(this);
} }
static Alphabet? parseRow(List row) { static Optional<Alphabet> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Alphabet( var model = Alphabet(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
@ -199,14 +203,14 @@ class AlphabetQuery extends Query<Alphabet?, AlphabetQueryWhere?> {
value: (row[3] as String?)); value: (row[3] as String?));
if (row.length > 5) { if (row.length > 5) {
model = model.copyWith( 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 @override
deserialize(List row) { Alphabet deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
NumbersQuery? get numbers { NumbersQuery? get numbers {

View file

@ -1,6 +1,8 @@
import 'package:angel_migration/angel_migration.dart'; import 'package:angel_migration/angel_migration.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:optional/optional.dart';
part 'email_indexed.g.dart'; part 'email_indexed.g.dart';
// * https://github.com/angel-dart/angel/issues/116 // * https://github.com/angel-dart/angel/issues/116

View file

@ -75,7 +75,7 @@ class RoleQuery extends Query<Role, RoleQueryWhere> {
@override @override
final RoleQueryValues values = RoleQueryValues(); final RoleQueryValues values = RoleQueryValues();
RoleQueryWhere? _where; late RoleQueryWhere _where;
@override @override
get casts { get casts {
@ -102,42 +102,44 @@ class RoleQuery extends Query<Role, RoleQueryWhere> {
return RoleQueryWhere(this); return RoleQueryWhere(this);
} }
static Role? parseRow(List row) { static Optional<Role> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Role(role: (row[0] as String?)); var model = Role(role: (row[0] as String?));
if (row.length > 1) { if (row.length > 1) {
model = model.copyWith( var rowData = UserQuery.parseRow(row.skip(1).take(3).toList());
users: [UserQuery.parseRow(row.skip(1).take(3).toList())] if (rowData.isPresent) {
.where((x) => x != null) model = model.copyWith(users: [rowData.value]);
.toList()); }
} }
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Role deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
@override @override
bool canCompile(trampoline) { bool canCompile(trampoline) {
return (!(trampoline?.contains('roles') == true && return (!(trampoline.contains('roles') == true &&
trampoline?.contains('role_users') == true)); trampoline.contains('role_users') == true));
} }
@override @override
get(QueryExecutor executor) { get(QueryExecutor executor) {
return super.get(executor).then((result) { return super.get(executor).then((result) {
return result.fold<List<Role>>([], (out, model) { return result.fold<List<Role>>([], (out, model) {
var idx = out.indexWhere((m) => m.role == model!.role); var idx = out.indexWhere((m) => m.role == model.role);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[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<Role, RoleQueryWhere> {
@override @override
update(QueryExecutor executor) { update(QueryExecutor executor) {
return super.update(executor).then((result) { return super.update(executor).then((result) {
return result.fold<List<Role?>>([], (out, model) { return result.fold<List<Role>>([], (out, model) {
var idx = out.indexWhere((m) => m!.role == model!.role); var idx = out.indexWhere((m) => m.role == model.role);
if (idx == -1) { if (idx == -1) {
return out..add(model); return out..add(model);
} else { } else {
var l = out[idx]!; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[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<Role, RoleQueryWhere> {
delete(QueryExecutor executor) { delete(QueryExecutor executor) {
return super.delete(executor).then((result) { return super.delete(executor).then((result) {
return result.fold<List<Role>>([], (out, model) { return result.fold<List<Role>>([], (out, model) {
var idx = out.indexWhere((m) => m.role == model!.role); var idx = out.indexWhere((m) => m.role == model.role);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[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<RoleUser?, RoleUserQueryWhere?> { class RoleUserQuery extends Query<RoleUser, RoleUserQueryWhere> {
RoleUserQuery({Query? parent, Set<String>? trampoline}) RoleUserQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -257,23 +259,30 @@ class RoleUserQuery extends Query<RoleUser?, RoleUserQueryWhere?> {
return RoleUserQueryWhere(this); return RoleUserQueryWhere(this);
} }
static RoleUser? parseRow(List row) { static Optional<RoleUser> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = RoleUser(); var model = RoleUser();
if (row.length > 2) { if (row.length > 2) {
model = model.copyWith( var r = RoleQuery.parseRow(row.skip(2).take(1).toList());
role: RoleQuery.parseRow(row.skip(2).take(1).toList())); if (r.isPresent) {
model = model.copyWith(role: r.value);
}
} }
if (row.length > 3) { if (row.length > 3) {
model = model.copyWith( var u = UserQuery.parseRow(row.skip(3).take(3).toList());
user: 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 @override
deserialize(List row) { RoleUser deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
RoleQuery? get role { RoleQuery? get role {
@ -342,7 +351,7 @@ class UserQuery extends Query<User, UserQueryWhere> {
@override @override
final UserQueryValues values = UserQueryValues(); final UserQueryValues values = UserQueryValues();
UserQueryWhere _where; UserQueryWhere? _where;
@override @override
get casts { get casts {
@ -360,7 +369,7 @@ class UserQuery extends Query<User, UserQueryWhere> {
} }
@override @override
UserQueryWhere get where { UserQueryWhere? get where {
return _where; return _where;
} }
@ -369,30 +378,34 @@ class UserQuery extends Query<User, UserQueryWhere> {
return UserQueryWhere(this); return UserQueryWhere(this);
} }
static User? parseRow(List row) { static Optional<User> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = User( var model = User(
email: (row[0] as String?), email: (row[0] as String?),
name: (row[1] as String?), name: (row[1] as String?),
password: (row[2] as String?)); password: (row[2] as String?));
if (row.length > 3) { if (row.length > 3) {
model = model.copyWith( var d = RoleQuery.parseRow(row.skip(3).take(1).toList());
roles: [RoleQuery.parseRow(row.skip(3).take(1).toList())]
.where((x) => x != null) model = model.copyWith(roles: [d.value]);
.toList()); // roles: [RoleQuery.parseRow(row.skip(3).take(1).toList())]
// .where((x) => x != null)
// .toList());
} }
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { User deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
@override @override
bool canCompile(trampoline) { bool canCompile(trampoline) {
return (!(trampoline?.contains('users') == true && return (!(trampoline.contains('users') == true &&
trampoline?.contains('role_users') == true)); trampoline.contains('role_users') == true));
} }
@override @override
@ -586,15 +599,12 @@ class User implements _User {
final List<_Role> roles; final List<_Role> roles;
User copyWith( User copyWith(
{String? email, {String? email, String? name, String? password, List<_Role>? roles}) {
String? name,
String? password,
List<_Role> roles = const []}) {
return User( return User(
email: email ?? this.email, email: email ?? this.email,
name: name ?? this.name, name: name ?? this.name,
password: password ?? this.password, password: password ?? this.password,
roles: roles); roles: roles ?? []);
} }
bool operator ==(other) { bool operator ==(other) {

View file

@ -2,6 +2,8 @@ import 'package:angel_migration/angel_migration.dart';
import 'package:angel_model/angel_model.dart'; import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:optional/optional.dart';
// import 'car.dart'; // import 'car.dart';
part 'has_car.g.dart'; part 'has_car.g.dart';

View file

@ -27,7 +27,7 @@ class HasCarMigration extends Migration {
// OrmGenerator // OrmGenerator
// ************************************************************************** // **************************************************************************
class HasCarQuery extends Query<HasCar?, HasCarQueryWhere?> { class HasCarQuery extends Query<HasCar, HasCarQueryWhere> {
HasCarQuery({Query? parent, Set<String>? trampoline}) HasCarQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -65,19 +65,21 @@ class HasCarQuery extends Query<HasCar?, HasCarQueryWhere?> {
return HasCarQueryWhere(this); return HasCarQueryWhere(this);
} }
static HasCar? parseRow(List row) { static Optional<HasCar> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = HasCar( var model = HasCar(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
updatedAt: (row[2] as DateTime?), updatedAt: (row[2] as DateTime?),
type: row[3] == null ? null : CarType.values[(row[3] as int)]); type: row[3] == null ? null : CarType.values[(row[3] as int)]);
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { HasCar deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }

View file

@ -3,6 +3,8 @@ import 'package:angel_migration/angel_migration.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:optional/optional.dart';
part 'has_map.g.dart'; part 'has_map.g.dart';
// String _boolToCustom(bool v) => v ? 'yes' : 'no'; // String _boolToCustom(bool v) => v ? 'yes' : 'no';

View file

@ -25,7 +25,7 @@ class HasMapMigration extends Migration {
// OrmGenerator // OrmGenerator
// ************************************************************************** // **************************************************************************
class HasMapQuery extends Query<HasMap?, HasMapQueryWhere?> { class HasMapQuery extends Query<HasMap, HasMapQueryWhere> {
HasMapQuery({Query? parent, Set<String>? trampoline}) HasMapQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -63,17 +63,19 @@ class HasMapQuery extends Query<HasMap?, HasMapQueryWhere?> {
return HasMapQueryWhere(this); return HasMapQueryWhere(this);
} }
static HasMap? parseRow(List row) { static Optional<HasMap> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = HasMap( var model = HasMap(
value: (row[0] as Map<dynamic, dynamic>?), value: (row[0] as Map<dynamic, dynamic>?),
list: (row[1] as List<dynamic>?)); list: (row[1] as List<dynamic>?));
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { HasMap deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }

View file

@ -4,6 +4,8 @@ import 'package:angel_migration/angel_migration.dart';
import 'package:angel_model/angel_model.dart'; import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:optional/optional.dart';
part 'leg.g.dart'; part 'leg.g.dart';
@serializable @serializable

View file

@ -45,7 +45,7 @@ class FootMigration extends Migration {
// OrmGenerator // OrmGenerator
// ************************************************************************** // **************************************************************************
class LegQuery extends Query<Leg?, LegQueryWhere?> { class LegQuery extends Query<Leg, LegQueryWhere> {
LegQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { LegQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -94,8 +94,10 @@ class LegQuery extends Query<Leg?, LegQueryWhere?> {
return LegQueryWhere(this); return LegQueryWhere(this);
} }
static Leg? parseRow(List row) { static Optional<Leg> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Leg( var model = Leg(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
@ -103,14 +105,14 @@ class LegQuery extends Query<Leg?, LegQueryWhere?> {
name: (row[3] as String?)); name: (row[3] as String?));
if (row.length > 4) { if (row.length > 4) {
model = model.copyWith( 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 @override
deserialize(List row) { Leg deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
FootQuery? get foot { FootQuery? get foot {
@ -172,7 +174,7 @@ class LegQueryValues extends MapQueryValues {
} }
} }
class FootQuery extends Query<Foot?, FootQueryWhere?> { class FootQuery extends Query<Foot, FootQueryWhere> {
FootQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { FootQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -209,20 +211,22 @@ class FootQuery extends Query<Foot?, FootQueryWhere?> {
return FootQueryWhere(this); return FootQueryWhere(this);
} }
static Foot? parseRow(List row) { static Optional<Foot> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Foot( var model = Foot(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
updatedAt: (row[2] as DateTime?), updatedAt: (row[2] as DateTime?),
legId: (row[3] as int?), legId: (row[3] as int?),
nToes: double.tryParse(row[4].toString())); nToes: double.tryParse(row[4].toString()));
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Foot deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }

View file

@ -4,6 +4,8 @@ import 'package:angel_migration/angel_migration.dart';
import 'package:angel_model/angel_model.dart'; import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:optional/optional.dart';
part 'order.g.dart'; part 'order.g.dart';
@orm @orm

View file

@ -48,7 +48,7 @@ class CustomerMigration extends Migration {
// OrmGenerator // OrmGenerator
// ************************************************************************** // **************************************************************************
class OrderQuery extends Query<Order?, OrderQueryWhere?> { class OrderQuery extends Query<Order, OrderQueryWhere> {
OrderQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { OrderQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -99,8 +99,10 @@ class OrderQuery extends Query<Order?, OrderQueryWhere?> {
return OrderQueryWhere(this); return OrderQueryWhere(this);
} }
static Order? parseRow(List row) { static Optional<Order> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Order( var model = Order(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
@ -110,14 +112,14 @@ class OrderQuery extends Query<Order?, OrderQueryWhere?> {
shipperId: (row[6] as int?)); shipperId: (row[6] as int?));
if (row.length > 7) { if (row.length > 7) {
model = model.copyWith( 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 @override
deserialize(List row) { Order deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
CustomerQuery? get customer { CustomerQuery? get customer {
@ -216,7 +218,7 @@ class OrderQueryValues extends MapQueryValues {
} }
} }
class CustomerQuery extends Query<Customer?, CustomerQueryWhere?> { class CustomerQuery extends Query<Customer, CustomerQueryWhere> {
CustomerQuery({Query? parent, Set<String>? trampoline}) CustomerQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -254,18 +256,20 @@ class CustomerQuery extends Query<Customer?, CustomerQueryWhere?> {
return CustomerQueryWhere(this); return CustomerQueryWhere(this);
} }
static Customer? parseRow(List row) { static Optional<Customer> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Customer( var model = Customer(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
updatedAt: (row[2] as DateTime?)); updatedAt: (row[2] as DateTime?));
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Customer deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }

View file

@ -5,6 +5,8 @@ import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:optional/optional.dart';
part 'tree.g.dart'; part 'tree.g.dart';
@serializable @serializable

View file

@ -45,7 +45,7 @@ class FruitMigration extends Migration {
// OrmGenerator // OrmGenerator
// ************************************************************************** // **************************************************************************
class TreeQuery extends Query<Tree?, TreeQueryWhere?> { class TreeQuery extends Query<Tree, TreeQueryWhere> {
TreeQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { TreeQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -94,8 +94,10 @@ class TreeQuery extends Query<Tree?, TreeQueryWhere?> {
return TreeQueryWhere(this); return TreeQueryWhere(this);
} }
static Tree? parseRow(List row) { static Optional<Tree> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Tree( var model = Tree(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
@ -103,16 +105,14 @@ class TreeQuery extends Query<Tree?, TreeQueryWhere?> {
rings: (row[3] as int?)); rings: (row[3] as int?));
if (row.length > 4) { if (row.length > 4) {
model = model.copyWith( model = model.copyWith(
fruits: [FruitQuery.parseRow(row.skip(4).take(5).toList())] fruits: [FruitQuery.parseRow(row.skip(4).take(5).toList()).value]);
.where((x) => x != null)
.toList());
} }
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Tree deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
FruitQuery? get fruits { FruitQuery? get fruits {
@ -122,17 +122,17 @@ class TreeQuery extends Query<Tree?, TreeQueryWhere?> {
@override @override
get(QueryExecutor executor) { get(QueryExecutor executor) {
return super.get(executor).then((result) { return super.get(executor).then((result) {
return result.fold<List<Tree?>>([], (out, model) { return result.fold<List<Tree>>([], (out, model) {
var idx = out.indexWhere((m) => m!.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model); return out..add(model);
} else { } else {
var l = out[idx]!; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[idx] = l.copyWith(
fruits: List<_Fruit>.from(l.fruits ?? []) fruits: List<_Fruit>.from(l.fruits ?? [])
..addAll(model!.fruits ?? [])); ..addAll(model.fruits ?? []));
} }
}); });
}); });
@ -141,17 +141,17 @@ class TreeQuery extends Query<Tree?, TreeQueryWhere?> {
@override @override
update(QueryExecutor executor) { update(QueryExecutor executor) {
return super.update(executor).then((result) { return super.update(executor).then((result) {
return result.fold<List<Tree?>>([], (out, model) { return result.fold<List<Tree>>([], (out, model) {
var idx = out.indexWhere((m) => m!.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model); return out..add(model);
} else { } else {
var l = out[idx]!; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[idx] = l.copyWith(
fruits: List<_Fruit>.from(l.fruits ?? []) fruits: List<_Fruit>.from(l.fruits ?? [])
..addAll(model!.fruits ?? [])); ..addAll(model.fruits ?? []));
} }
}); });
}); });
@ -161,16 +161,16 @@ class TreeQuery extends Query<Tree?, TreeQueryWhere?> {
delete(QueryExecutor executor) { delete(QueryExecutor executor) {
return super.delete(executor).then((result) { return super.delete(executor).then((result) {
return result.fold<List<Tree>>([], (out, model) { return result.fold<List<Tree>>([], (out, model) {
var idx = out.indexWhere((m) => m.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[idx] = l.copyWith(
fruits: List<_Fruit>.from(l.fruits ?? []) fruits: List<_Fruit>.from(l.fruits ?? [])
..addAll(model!.fruits ?? [])); ..addAll(model.fruits ?? []));
} }
}); });
}); });
@ -231,7 +231,7 @@ class TreeQueryValues extends MapQueryValues {
} }
} }
class FruitQuery extends Query<Fruit?, FruitQueryWhere?> { class FruitQuery extends Query<Fruit, FruitQueryWhere> {
FruitQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { FruitQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -268,20 +268,22 @@ class FruitQuery extends Query<Fruit?, FruitQueryWhere?> {
return FruitQueryWhere(this); return FruitQueryWhere(this);
} }
static Fruit? parseRow(List row) { static Optional<Fruit> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Fruit( var model = Fruit(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
updatedAt: (row[2] as DateTime?), updatedAt: (row[2] as DateTime?),
treeId: (row[3] as int?), treeId: (row[3] as int?),
commonName: (row[4] as String?)); commonName: (row[4] as String?));
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Fruit deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }

View file

@ -2,6 +2,8 @@ import 'package:angel_migration/angel_migration.dart';
import 'package:angel_model/angel_model.dart'; import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:optional/optional.dart';
part 'unorthodox.g.dart'; part 'unorthodox.g.dart';
@serializable @serializable

View file

@ -105,7 +105,7 @@ class FooPivotMigration extends Migration {
// OrmGenerator // OrmGenerator
// ************************************************************************** // **************************************************************************
class UnorthodoxQuery extends Query<Unorthodox?, UnorthodoxQueryWhere?> { class UnorthodoxQuery extends Query<Unorthodox, UnorthodoxQueryWhere> {
UnorthodoxQuery({Query? parent, Set<String>? trampoline}) UnorthodoxQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -143,15 +143,17 @@ class UnorthodoxQuery extends Query<Unorthodox?, UnorthodoxQueryWhere?> {
return UnorthodoxQueryWhere(this); return UnorthodoxQueryWhere(this);
} }
static Unorthodox? parseRow(List row) { static Optional<Unorthodox> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Unorthodox(name: (row[0] as String?)); var model = Unorthodox(name: (row[0] as String?));
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Unorthodox deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }
@ -183,7 +185,7 @@ class UnorthodoxQueryValues extends MapQueryValues {
} }
} }
class WeirdJoinQuery extends Query<WeirdJoin?, WeirdJoinQueryWhere?> { class WeirdJoinQuery extends Query<WeirdJoin, WeirdJoinQueryWhere> {
WeirdJoinQuery({Query? parent, Set<String>? trampoline}) WeirdJoinQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -252,35 +254,34 @@ class WeirdJoinQuery extends Query<WeirdJoin?, WeirdJoinQueryWhere?> {
return WeirdJoinQueryWhere(this); return WeirdJoinQueryWhere(this);
} }
static WeirdJoin? parseRow(List row) { static Optional<WeirdJoin> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = WeirdJoin(id: (row[0] as int?)); var model = WeirdJoin(id: (row[0] as int?));
if (row.length > 2) { if (row.length > 2) {
model = model.copyWith( 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) { if (row.length > 3) {
model = model.copyWith( 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) { if (row.length > 8) {
model = model.copyWith( model = model.copyWith(
numbas: [NumbaQuery.parseRow(row.skip(8).take(2).toList())] numbas: [NumbaQuery.parseRow(row.skip(8).take(2).toList()).value]);
.where((x) => x != null)
.toList());
} }
if (row.length > 10) { if (row.length > 10) {
model = model.copyWith( model = model.copyWith(
foos: [FooQuery.parseRow(row.skip(10).take(1).toList())] foos: [FooQuery.parseRow(row.skip(10).take(1).toList()).value]);
.where((x) => x != null)
.toList());
} }
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { WeirdJoin deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
UnorthodoxQuery? get unorthodox { UnorthodoxQuery? get unorthodox {
@ -297,28 +298,25 @@ class WeirdJoinQuery extends Query<WeirdJoin?, WeirdJoinQueryWhere?> {
@override @override
bool canCompile(trampoline) { bool canCompile(trampoline) {
return (!(trampoline?.contains('weird_joins') == true && return (!(trampoline.contains('weird_joins') == true &&
trampoline?.contains('foo_pivots') == true)); trampoline.contains('foo_pivots') == true));
} }
@override @override
get(QueryExecutor executor) { get(QueryExecutor executor) {
return super.get(executor).then((result) { return super.get(executor).then((result) {
return result.fold<List<WeirdJoin>>([], (out, model) { return result.fold<List<WeirdJoin>>([], (out, model) {
var idx = out.indexWhere((m) => m.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[idx] = l.copyWith(
numbas: List<_Numba>.from(l.numbas ?? []) numbas: List<_Numba>.from(l.numbas ?? [])
..addAll(model == null ..addAll(List<_Numba>.from(model.numbas ?? [])),
? [] foos: List<_Foo?>.from(l.foos ?? [])..addAll(model.foos ?? []));
: List<_Numba>.from(model.numbas ?? [])),
foos: List<_Foo?>.from(l.foos ?? [])
..addAll(model?.foos ?? []));
} }
}); });
}); });
@ -328,16 +326,16 @@ class WeirdJoinQuery extends Query<WeirdJoin?, WeirdJoinQueryWhere?> {
update(QueryExecutor executor) { update(QueryExecutor executor) {
return super.update(executor).then((result) { return super.update(executor).then((result) {
return result.fold<List<WeirdJoin>>([], (out, model) { return result.fold<List<WeirdJoin>>([], (out, model) {
var idx = out.indexWhere((m) => m.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[idx] = l.copyWith(
numbas: List<_Numba?>.from(l.numbas ?? []) numbas: List<_Numba?>.from(l.numbas ?? [])
..addAll(model!.numbas ?? []), ..addAll(model.numbas ?? []),
foos: List<_Foo?>.from(l.foos ?? [])..addAll(model.foos ?? [])); foos: List<_Foo?>.from(l.foos ?? [])..addAll(model.foos ?? []));
} }
}); });
@ -348,16 +346,16 @@ class WeirdJoinQuery extends Query<WeirdJoin?, WeirdJoinQueryWhere?> {
delete(QueryExecutor executor) { delete(QueryExecutor executor) {
return super.delete(executor).then((result) { return super.delete(executor).then((result) {
return result.fold<List<WeirdJoin>>([], (out, model) { return result.fold<List<WeirdJoin>>([], (out, model) {
var idx = out.indexWhere((m) => m.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[idx] = l.copyWith(
numbas: List<_Numba?>.from(l.numbas ?? []) numbas: List<_Numba?>.from(l.numbas ?? [])
..addAll(model!.numbas ?? []), ..addAll(model.numbas ?? []),
foos: List<_Foo?>.from(l.foos ?? [])..addAll(model.foos ?? [])); foos: List<_Foo?>.from(l.foos ?? [])..addAll(model.foos ?? []));
} }
}); });
@ -404,7 +402,7 @@ class WeirdJoinQueryValues extends MapQueryValues {
} }
} }
class SongQuery extends Query<Song?, SongQueryWhere?> { class SongQuery extends Query<Song, SongQueryWhere> {
SongQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { SongQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -441,20 +439,22 @@ class SongQuery extends Query<Song?, SongQueryWhere?> {
return SongQueryWhere(this); return SongQueryWhere(this);
} }
static Song? parseRow(List row) { static Optional<Song> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Song( var model = Song(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
updatedAt: (row[2] as DateTime?), updatedAt: (row[2] as DateTime?),
weirdJoinId: (row[3] as int?), weirdJoinId: (row[3] as int?),
title: (row[4] as String?)); title: (row[4] as String?));
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Song deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }
@ -521,7 +521,7 @@ class SongQueryValues extends MapQueryValues {
} }
} }
class NumbaQuery extends Query<Numba?, NumbaQueryWhere?> { class NumbaQuery extends Query<Numba, NumbaQueryWhere> {
NumbaQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { NumbaQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -558,15 +558,17 @@ class NumbaQuery extends Query<Numba?, NumbaQueryWhere?> {
return NumbaQueryWhere(this); return NumbaQueryWhere(this);
} }
static Numba? parseRow(List row) { static Optional<Numba> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Numba(i: (row[0] as int?), parent: (row[1] as int?)); var model = Numba(i: (row[0] as int?), parent: (row[1] as int?));
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Numba deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
} }
@ -607,7 +609,7 @@ class NumbaQueryValues extends MapQueryValues {
} }
} }
class FooQuery extends Query<Foo?, FooQueryWhere?> { class FooQuery extends Query<Foo, FooQueryWhere> {
FooQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { FooQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -650,43 +652,44 @@ class FooQuery extends Query<Foo?, FooQueryWhere?> {
return FooQueryWhere(this); return FooQueryWhere(this);
} }
static Foo? parseRow(List row) { static Optional<Foo> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Foo(bar: (row[0] as String?)); var model = Foo(bar: (row[0] as String?));
if (row.length > 1) { if (row.length > 1) {
model = model.copyWith( model = model.copyWith(weirdJoins: [
weirdJoins: [WeirdJoinQuery.parseRow(row.skip(1).take(2).toList())] WeirdJoinQuery.parseRow(row.skip(1).take(2).toList()).value
.where((x) => x != null) ]);
.toList());
} }
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Foo deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
@override @override
bool canCompile(trampoline) { bool canCompile(trampoline) {
return (!(trampoline?.contains('foos') == true && return (!(trampoline.contains('foos') == true &&
trampoline?.contains('foo_pivots') == true)); trampoline.contains('foo_pivots') == true));
} }
@override @override
get(QueryExecutor executor) { get(QueryExecutor executor) {
return super.get(executor).then((result) { return super.get(executor).then((result) {
return result.fold<List<Foo?>>([], (out, model) { return result.fold<List<Foo>>([], (out, model) {
var idx = out.indexWhere((m) => m!.bar == model!.bar); var idx = out.indexWhere((m) => m.bar == model.bar);
if (idx == -1) { if (idx == -1) {
return out..add(model); return out..add(model);
} else { } else {
var l = out[idx]!; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[idx] = l.copyWith(
weirdJoins: List<_WeirdJoin?>.from(l.weirdJoins ?? []) weirdJoins: List<_WeirdJoin>.from(l.weirdJoins ?? [])
..addAll(model!.weirdJoins ?? [])); ..addAll(model.weirdJoins ?? []));
} }
}); });
}); });
@ -695,17 +698,17 @@ class FooQuery extends Query<Foo?, FooQueryWhere?> {
@override @override
update(QueryExecutor executor) { update(QueryExecutor executor) {
return super.update(executor).then((result) { return super.update(executor).then((result) {
return result.fold<List<Foo?>>([], (out, model) { return result.fold<List<Foo>>([], (out, model) {
var idx = out.indexWhere((m) => m!.bar == model!.bar); var idx = out.indexWhere((m) => m.bar == model.bar);
if (idx == -1) { if (idx == -1) {
return out..add(model); return out..add(model);
} else { } else {
var l = out[idx]!; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[idx] = l.copyWith(
weirdJoins: List<_WeirdJoin?>.from(l.weirdJoins ?? []) weirdJoins: List<_WeirdJoin>.from(l.weirdJoins ?? [])
..addAll(model!.weirdJoins ?? [])); ..addAll(model.weirdJoins ?? []));
} }
}); });
}); });
@ -714,17 +717,17 @@ class FooQuery extends Query<Foo?, FooQueryWhere?> {
@override @override
delete(QueryExecutor executor) { delete(QueryExecutor executor) {
return super.delete(executor).then((result) { return super.delete(executor).then((result) {
return result.fold<List<Foo?>>([], (out, model) { return result.fold<List<Foo>>([], (out, model) {
var idx = out.indexWhere((m) => m!.bar == model!.bar); var idx = out.indexWhere((m) => m.bar == model.bar);
if (idx == -1) { if (idx == -1) {
return out..add(model); return out..add(model);
} else { } else {
var l = out[idx]!; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[idx] = l.copyWith(
weirdJoins: List<_WeirdJoin?>.from(l.weirdJoins ?? []) weirdJoins: List<_WeirdJoin>.from(l.weirdJoins ?? [])
..addAll(model!.weirdJoins ?? [])); ..addAll(model.weirdJoins ?? []));
} }
}); });
}); });
@ -759,7 +762,7 @@ class FooQueryValues extends MapQueryValues {
} }
} }
class FooPivotQuery extends Query<FooPivot?, FooPivotQueryWhere?> { class FooPivotQuery extends Query<FooPivot, FooPivotQueryWhere> {
FooPivotQuery({Query? parent, Set<String>? trampoline}) FooPivotQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -807,23 +810,26 @@ class FooPivotQuery extends Query<FooPivot?, FooPivotQueryWhere?> {
return FooPivotQueryWhere(this); return FooPivotQueryWhere(this);
} }
static FooPivot? parseRow(List row) { static Optional<FooPivot> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = FooPivot(); var model = FooPivot();
if (row.length > 2) { if (row.length > 2) {
model = model.copyWith( 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) { if (row.length > 4) {
model = model = model.copyWith(
model.copyWith(foo: FooQuery.parseRow(row.skip(4).take(1).toList())); foo: FooQuery.parseRow(row.skip(4).take(1).toList()).value);
} }
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { FooPivot deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
WeirdJoinQuery? get weirdJoin { WeirdJoinQuery? get weirdJoin {
@ -1070,9 +1076,9 @@ class Foo implements _Foo {
final String? bar; final String? bar;
@override @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); return Foo(bar: bar ?? this.bar, weirdJoins: weirdJoins ?? this.weirdJoins);
} }

View file

@ -5,6 +5,8 @@ import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart'; import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:optional/optional.dart';
part 'user.g.dart'; part 'user.g.dart';
@serializable @serializable

View file

@ -61,7 +61,7 @@ class RoleMigration extends Migration {
// OrmGenerator // OrmGenerator
// ************************************************************************** // **************************************************************************
class UserQuery extends Query<User?, UserQueryWhere?> { class UserQuery extends Query<User, UserQueryWhere> {
UserQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { UserQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -111,8 +111,10 @@ class UserQuery extends Query<User?, UserQueryWhere?> {
return UserQueryWhere(this); return UserQueryWhere(this);
} }
static User? parseRow(List row) { static Optional<User> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = User( var model = User(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
@ -122,37 +124,35 @@ class UserQuery extends Query<User?, UserQueryWhere?> {
email: (row[5] as String?)); email: (row[5] as String?));
if (row.length > 6) { if (row.length > 6) {
model = model.copyWith( model = model.copyWith(
roles: [RoleQuery.parseRow(row.skip(6).take(4).toList())] roles: [RoleQuery.parseRow(row.skip(6).take(4).toList()).value]);
.where((x) => x != null)
.toList());
} }
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { User deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
@override @override
bool canCompile(trampoline) { bool canCompile(trampoline) {
return (!(trampoline?.contains('users') == true && return (!(trampoline.contains('users') == true &&
trampoline?.contains('role_users') == true)); trampoline.contains('role_users') == true));
} }
@override @override
get(QueryExecutor executor) { get(QueryExecutor executor) {
return super.get(executor).then((result) { return super.get(executor).then((result) {
return result.fold<List<User>>([], (out, model) { return result.fold<List<User>>([], (out, model) {
var idx = out.indexWhere((m) => m.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[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<User?, UserQueryWhere?> {
update(QueryExecutor executor) { update(QueryExecutor executor) {
return super.update(executor).then((result) { return super.update(executor).then((result) {
return result.fold<List<User>>([], (out, model) { return result.fold<List<User>>([], (out, model) {
var idx = out.indexWhere((m) => m.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[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<User?, UserQueryWhere?> {
delete(QueryExecutor executor) { delete(QueryExecutor executor) {
return super.delete(executor).then((result) { return super.delete(executor).then((result) {
return result.fold<List<User>>([], (out, model) { return result.fold<List<User>>([], (out, model) {
var idx = out.indexWhere((m) => m.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[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<RoleUser?, RoleUserQueryWhere?> { class RoleUserQuery extends Query<RoleUser, RoleUserQueryWhere> {
RoleUserQuery({Query? parent, Set<String>? trampoline}) RoleUserQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) { : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
@ -324,23 +324,25 @@ class RoleUserQuery extends Query<RoleUser?, RoleUserQueryWhere?> {
return RoleUserQueryWhere(this); return RoleUserQueryWhere(this);
} }
static RoleUser? parseRow(List row) { static Optional<RoleUser> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = RoleUser(); var model = RoleUser();
if (row.length > 2) { if (row.length > 2) {
model = model.copyWith( 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) { if (row.length > 6) {
model = model.copyWith( 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 @override
deserialize(List row) { RoleUser deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
RoleQuery? get role { RoleQuery? get role {
@ -393,7 +395,7 @@ class RoleUserQueryValues extends MapQueryValues {
} }
} }
class RoleQuery extends Query<Role?, RoleQueryWhere?> { class RoleQuery extends Query<Role, RoleQueryWhere> {
RoleQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) { RoleQuery({Query? parent, Set<String>? trampoline}) : super(parent: parent) {
trampoline ??= Set(); trampoline ??= Set();
trampoline.add(tableName); trampoline.add(tableName);
@ -443,8 +445,10 @@ class RoleQuery extends Query<Role?, RoleQueryWhere?> {
return RoleQueryWhere(this); return RoleQueryWhere(this);
} }
static Role? parseRow(List row) { static Optional<Role> parseRow(List row) {
if (row.every((x) => x == null)) return null; if (row.every((x) => x == null)) {
return Optional.empty();
}
var model = Role( var model = Role(
id: row[0].toString(), id: row[0].toString(),
createdAt: (row[1] as DateTime?), createdAt: (row[1] as DateTime?),
@ -452,37 +456,35 @@ class RoleQuery extends Query<Role?, RoleQueryWhere?> {
name: (row[3] as String?)); name: (row[3] as String?));
if (row.length > 4) { if (row.length > 4) {
model = model.copyWith( model = model.copyWith(
users: [UserQuery.parseRow(row.skip(4).take(6).toList())] users: [UserQuery.parseRow(row.skip(4).take(6).toList()).value]);
.where((x) => x != null)
.toList());
} }
return model; return Optional.ofNullable(model);
} }
@override @override
deserialize(List row) { Role deserialize(List row) {
return parseRow(row); return parseRow(row).value;
} }
@override @override
bool canCompile(trampoline) { bool canCompile(trampoline) {
return (!(trampoline?.contains('roles') == true && return (!(trampoline.contains('roles') == true &&
trampoline?.contains('role_users') == true)); trampoline.contains('role_users') == true));
} }
@override @override
get(QueryExecutor executor) { get(QueryExecutor executor) {
return super.get(executor).then((result) { return super.get(executor).then((result) {
return result.fold<List<Role>>([], (out, model) { return result.fold<List<Role>>([], (out, model) {
var idx = out.indexWhere((m) => m.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[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<Role?, RoleQueryWhere?> {
@override @override
update(QueryExecutor executor) { update(QueryExecutor executor) {
return super.update(executor).then((result) { return super.update(executor).then((result) {
return result.fold<List<Role?>>([], (out, model) { return result.fold<List<Role>>([], (out, model) {
var idx = out.indexWhere((m) => m!.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model); return out..add(model);
} else { } else {
var l = out[idx]!; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[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<Role?, RoleQueryWhere?> {
delete(QueryExecutor executor) { delete(QueryExecutor executor) {
return super.delete(executor).then((result) { return super.delete(executor).then((result) {
return result.fold<List<Role>>([], (out, model) { return result.fold<List<Role>>([], (out, model) {
var idx = out.indexWhere((m) => m.id == model!.id); var idx = out.indexWhere((m) => m.id == model.id);
if (idx == -1) { if (idx == -1) {
return out..add(model!); return out..add(model);
} else { } else {
var l = out[idx]; var l = out[idx];
return out return out
..[idx] = l.copyWith( ..[idx] = l.copyWith(
users: List<_User>.from(l.users)..addAll(model!.users)); users: List<_User>.from(l.users)..addAll(model.users));
} }
}); });
}); });

View file

@ -24,7 +24,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
// var row = [0, 'Mazda', 'CX9', true, y2k, y2k, y2k]; // var row = [0, 'Mazda', 'CX9', true, y2k, y2k, y2k];
var row = [0, y2k, y2k, 'Mazda', 'CX9', true, y2k]; var row = [0, y2k, y2k, 'Mazda', 'CX9', true, y2k];
print(row); print(row);
var car = CarQuery().deserialize(row)!; var car = CarQuery().deserialize(row);
print(car.toJson()); print(car.toJson());
expect(car.id, '0'); expect(car.id, '0');
expect(car.make, 'Mazda'); expect(car.make, 'Mazda');
@ -47,7 +47,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
group('selects', () { group('selects', () {
test('select all', () async { test('select all', () async {
List<Car?> cars = await CarQuery().get(executor); List<Car> cars = await CarQuery().get(executor);
expect(cars, []); expect(cars, []);
}); });
@ -60,19 +60,19 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
..make = 'Ferrari東' ..make = 'Ferrari東'
..description = 'Vroom vroom!' ..description = 'Vroom vroom!'
..familyFriendly = false; ..familyFriendly = false;
ferrari = await query.insert(executor); ferrari = (await query.insert(executor)).value;
}); });
test('where clause is applied', () async { test('where clause is applied', () async {
var query = CarQuery()..where!.familyFriendly.isTrue; var query = CarQuery()..where!.familyFriendly.isTrue;
List<Car?> cars = await query.get(executor); List<Car> cars = await query.get(executor);
expect(cars, isEmpty); expect(cars, isEmpty);
var sportsCars = CarQuery()..where!.familyFriendly.isFalse; var sportsCars = CarQuery()..where!.familyFriendly.isFalse;
cars = await sportsCars.get(executor); 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.make, ferrari!.make);
expect(car.description, ferrari!.description); expect(car.description, ferrari!.description);
expect(car.familyFriendly, ferrari!.familyFriendly); expect(car.familyFriendly, ferrari!.familyFriendly);
@ -80,10 +80,10 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
}); });
test('union', () async { test('union', () async {
var query1 = CarQuery()..where!.make.like('%Fer%'); var query1 = CarQuery()..where?.make.like('%Fer%');
var query2 = CarQuery()..where!.familyFriendly.isTrue; var query2 = CarQuery()..where?.familyFriendly.isTrue;
var query3 = CarQuery()..where!.description.equals('Submarine'); var query3 = CarQuery()..where?.description.equals('Submarine');
Union<Car?> union = query1.union(query2).unionAll(query3); Union<Car> union = query1.union(query2).unionAll(query3);
print(union.compile(Set())); print(union.compile(Set()));
var cars = await union.get(executor); var cars = await union.get(executor);
expect(cars, hasLength(1)); expect(cars, hasLength(1));
@ -93,17 +93,17 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
var query = CarQuery() var query = CarQuery()
..where!.make.like('Fer%') ..where!.make.like('Fer%')
..orWhere((where) => where ..orWhere((where) => where
?..familyFriendly.isTrue ..familyFriendly.isTrue
..make.equals('Honda')); ..make.equals('Honda'));
print(query.compile(Set())); print(query.compile(Set()));
List<Car?> cars = await query.get(executor); List<Car> cars = await query.get(executor);
expect(cars, hasLength(1)); expect(cars, hasLength(1));
}); });
test('limit obeyed', () async { test('limit obeyed', () async {
var query = CarQuery()..limit(0); var query = CarQuery()..limit(0);
print(query.compile(Set())); print(query.compile(Set()));
List<Car?> cars = await query.get(executor); List<Car> cars = await query.get(executor);
expect(cars, isEmpty); expect(cars, isEmpty);
}); });
@ -120,28 +120,28 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
var car = await (query.deleteOne(executor) as FutureOr<Car>); var car = await (query.deleteOne(executor) as FutureOr<Car>);
expect(car.toJson(), ferrari!.toJson()); expect(car.toJson(), ferrari!.toJson());
List<Car?> cars = await CarQuery().get(executor); List<Car> cars = await CarQuery().get(executor);
expect(cars, isEmpty); expect(cars, isEmpty);
}); });
test('delete stream', () async { test('delete stream', () async {
var query = CarQuery() var query = CarQuery()
..where!.make.equals('Ferrari東') ..where!.make.equals('Ferrari東')
..orWhere((w) => w!.familyFriendly.isTrue); ..orWhere((w) => w.familyFriendly.isTrue);
print(query.compile(Set(), preamble: 'DELETE FROM "cars"')); print(query.compile(Set(), preamble: 'DELETE FROM "cars"'));
List<Car?>? cars = await query.delete(executor); List<Car> cars = await query.delete(executor);
expect(cars, hasLength(1)); expect(cars, hasLength(1));
expect(cars.first!.toJson(), ferrari!.toJson()); expect(cars.first.toJson(), ferrari!.toJson());
}); });
test('update', () async { test('update', () async {
var query = CarQuery() var query = CarQuery()
..where!.id.equals(int.parse(ferrari!.id!)) ..where!.id.equals(int.parse(ferrari!.id!))
..values.make = 'Hyundai'; ..values.make = 'Hyundai';
List<Car?> cars = await query.update(executor); List<Car> cars = await query.update(executor);
expect(cars, hasLength(1)); expect(cars, hasLength(1));
expect(cars.first!.make, 'Hyundai'); expect(cars.first.make, 'Hyundai');
}); });
test('update car', () async { test('update car', () async {

View file

@ -38,6 +38,7 @@ dev_dependencies:
ref: sdk-2.12.x_nnbd ref: sdk-2.12.x_nnbd
path: packages/framework path: packages/framework
build_runner: ^2.0.1 build_runner: ^2.0.1
optional: ^6.0.0-nullsafety.2
#dependency_overrides: #dependency_overrides:
# angel_orm: # angel_orm: