From d241d7ca7701187b61b0b96bcd7c28d16bd65574 Mon Sep 17 00:00:00 2001 From: "thomashii@dukefirehawk.com" Date: Mon, 3 May 2021 21:27:12 +0800 Subject: [PATCH] Added Optional package --- packages/orm/angel_orm/example/main.dart | 6 ++- packages/orm/angel_orm/lib/src/query.dart | 40 +++++++++---------- .../orm/angel_orm/lib/src/query_base.dart | 11 +++-- .../orm/angel_orm/lib/src/query_executor.dart | 4 +- packages/orm/angel_orm/pubspec.yaml | 1 + packages/orm/angel_orm_postgres/pubspec.yaml | 5 +++ .../angel_orm_test/lib/src/models/tree.g.dart | 8 ++-- .../lib/src/models/unorthodox.g.dart | 33 ++++++++------- .../angel_orm_test/lib/src/models/user.g.dart | 16 ++++---- .../lib/src/standalone_test.dart | 2 +- packages/orm/angel_orm_test/pubspec.yaml | 4 ++ 11 files changed, 74 insertions(+), 56 deletions(-) diff --git a/packages/orm/angel_orm/example/main.dart b/packages/orm/angel_orm/example/main.dart index c13ff6bf..fd394f68 100644 --- a/packages/orm/angel_orm/example/main.dart +++ b/packages/orm/angel_orm/example/main.dart @@ -15,7 +15,9 @@ void main() async { ..join('companies', 'company_id', 'id'); var richPerson = await query.getOne(_FakeExecutor()); - print(richPerson?.toJson()); + if (richPerson.isPresent) { + print(richPerson.first.toJson()); + } } class _FakeExecutor extends QueryExecutor { @@ -24,7 +26,7 @@ class _FakeExecutor extends QueryExecutor { @override Future> query( String tableName, String? query, Map substitutionValues, - [returningFields]) async { + [returningFields = const []]) async { var now = DateTime.now(); print( '_FakeExecutor received query: $query and values: $substitutionValues'); diff --git a/packages/orm/angel_orm/lib/src/query.dart b/packages/orm/angel_orm/lib/src/query.dart index 39faf5fb..fc7ee027 100644 --- a/packages/orm/angel_orm/lib/src/query.dart +++ b/packages/orm/angel_orm/lib/src/query.dart @@ -6,6 +6,7 @@ import 'query_base.dart'; import 'query_executor.dart'; import 'query_values.dart'; import 'query_where.dart'; +import 'package:optional/optional.dart'; /// A SQL `SELECT` query builder. abstract class Query extends QueryBase { @@ -125,7 +126,7 @@ abstract class Query extends QueryBase { } String _joinAlias(Set? trampoline) { - int i = _joins.length; + var i = _joins.length; while (true) { var a = 'a$i'; @@ -137,13 +138,13 @@ abstract class Query extends QueryBase { } } - String? Function() _compileJoin(tableName, Set? trampoline) { + String? Function() _compileJoin(tableName, Set trampoline) { if (tableName is String) { return () => tableName; } else if (tableName is Query) { return () { var c = tableName.compile(trampoline); - if (c == null) return c; + //if (c == null) return c; return '($c)'; }; } else { @@ -160,7 +161,7 @@ abstract class Query extends QueryBase { String foreignKey, String op, List additionalFields) { - trampoline ??= Set(); + trampoline ??= {}; // Pivot tables guard against ambiguous fields by excluding tables // that have already been queried in this scope. @@ -170,19 +171,17 @@ abstract class Query extends QueryBase { } var to = _compileJoin(tableName, trampoline); - if (to != null) { - var alias = _joinAlias(trampoline); - if (tableName is Query) { - for (var field in tableName.fields) { - tableName.aliases[field] = '${alias}_$field'; - } + var alias = _joinAlias(trampoline); + if (tableName is Query) { + for (var field in tableName.fields) { + tableName.aliases[field] = '${alias}_$field'; } - _joins.add(JoinBuilder(type, this, to, localKey, foreignKey, - op: op, - alias: alias, - additionalFields: additionalFields, - aliasAllFields: tableName is Query)); } + _joins.add(JoinBuilder(type, this, to, localKey, foreignKey, + op: op, + alias: alias, + additionalFields: additionalFields, + aliasAllFields: tableName is Query)); } /// Execute an `INNER JOIN` against another table. @@ -231,14 +230,15 @@ abstract class Query extends QueryBase { } @override - String? compile(Set? trampoline, + String compile(Set trampoline, {bool includeTableName = false, String? preamble, bool withFields = true, String? fromQuery}) { // One table MAY appear multiple times in a query. if (!canCompile(trampoline)) { - return null; + //return null; + throw Exception('One table appear multiple times in a query'); } includeTableName = includeTableName || _joins.isNotEmpty; @@ -320,7 +320,7 @@ abstract class Query extends QueryBase { } @override - Future getOne(QueryExecutor executor) { + Future> getOne(QueryExecutor executor) { //limit(1); return super.getOne(executor); } @@ -358,7 +358,7 @@ abstract class Query extends QueryBase { } else { // TODO: How to do this in a non-Postgres DB? var returning = fields.map(adornWithTableName).join(', '); - var sql = compile({})!; + var sql = compile({}); sql = 'WITH $tableName as ($insertion RETURNING $returning) ' + sql; return executor .query(tableName, sql, substitutionValues) @@ -381,7 +381,7 @@ abstract class Query extends QueryBase { if (_limit != null) updateSql.write(' LIMIT $_limit'); var returning = fields.map(adornWithTableName).join(', '); - var sql = compile({})!; + var sql = compile({}); sql = 'WITH $tableName as ($updateSql RETURNING $returning) ' + sql; return executor diff --git a/packages/orm/angel_orm/lib/src/query_base.dart b/packages/orm/angel_orm/lib/src/query_base.dart index c8a7da85..e186a5e0 100644 --- a/packages/orm/angel_orm/lib/src/query_base.dart +++ b/packages/orm/angel_orm/lib/src/query_base.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'query_executor.dart'; import 'union.dart'; +import 'package:optional/optional.dart'; /// A base class for objects that compile to SQL queries, typically within an ORM. abstract class QueryBase { @@ -32,9 +33,9 @@ abstract class QueryBase { } }).join(', '); - String? compile(Set trampoline, + String compile(Set trampoline, {bool includeTableName = false, - String? preamble, + String preamble = '', bool withFields = true}); T deserialize(List row); @@ -46,8 +47,10 @@ abstract class QueryBase { .then((it) => it.map(deserialize).toList()); } - Future getOne(QueryExecutor executor) { - return get(executor).then((it) => it.isEmpty ? null : it.first); + Future> getOne(QueryExecutor executor) { + //return get(executor).then((it) => it.isEmpty ? : it.first); + return get(executor).then( + (it) => it.isEmpty ? Optional.empty() : Optional.ofNullable(it.first)); } Union union(QueryBase other) { diff --git a/packages/orm/angel_orm/lib/src/query_executor.dart b/packages/orm/angel_orm/lib/src/query_executor.dart index 5848bbd0..0443be00 100644 --- a/packages/orm/angel_orm/lib/src/query_executor.dart +++ b/packages/orm/angel_orm/lib/src/query_executor.dart @@ -8,8 +8,8 @@ abstract class QueryExecutor { /// Executes a single query. Future> query( - String tableName, String? query, Map substitutionValues, - [List? returningFields]); + String tableName, String query, Map substitutionValues, + [List returningFields = const []]); /// Enters a database transaction, performing the actions within, /// and returning the results of [f]. diff --git a/packages/orm/angel_orm/pubspec.yaml b/packages/orm/angel_orm/pubspec.yaml index 50fb3ea4..94a6b91a 100644 --- a/packages/orm/angel_orm/pubspec.yaml +++ b/packages/orm/angel_orm/pubspec.yaml @@ -28,3 +28,4 @@ dev_dependencies: build_runner: ^2.0.1 pedantic: ^1.11.0 test: ^1.17.3 + optional: ^6.0.0-nullsafety.2 diff --git a/packages/orm/angel_orm_postgres/pubspec.yaml b/packages/orm/angel_orm_postgres/pubspec.yaml index b550f29a..6d8942d8 100644 --- a/packages/orm/angel_orm_postgres/pubspec.yaml +++ b/packages/orm/angel_orm_postgres/pubspec.yaml @@ -27,3 +27,8 @@ dev_dependencies: ref: sdk-2.12.x_nnbd path: packages/pretty_logging test: ^1.17.3 +#dependency_overrides: +# angel_orm_test: +# path: ../angel_orm_test +# angel_orm: +# path: ../angel_orm 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 7b5f5ec3..90e16c58 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 @@ -160,13 +160,13 @@ class TreeQuery extends Query { @override delete(QueryExecutor executor) { return super.delete(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); + return out..add(model!); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( fruits: List<_Fruit>.from(l.fruits ?? []) 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 6e69099e..ad789ac1 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 @@ -304,18 +304,21 @@ class WeirdJoinQuery 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); + return out..add(model!); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( - numbas: List<_Numba?>.from(l.numbas ?? []) - ..addAll(model!.numbas ?? []), - foos: List<_Foo?>.from(l.foos ?? [])..addAll(model.foos ?? [])); + numbas: List<_Numba>.from(l.numbas ?? []) + ..addAll(model == null + ? [] + : List<_Numba>.from(model.numbas ?? [])), + foos: List<_Foo?>.from(l.foos ?? []) + ..addAll(model?.foos ?? [])); } }); }); @@ -324,13 +327,13 @@ class WeirdJoinQuery 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); + return out..add(model!); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( numbas: List<_Numba?>.from(l.numbas ?? []) @@ -344,13 +347,13 @@ class WeirdJoinQuery extends Query { @override delete(QueryExecutor executor) { return super.delete(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); + return out..add(model!); } else { - var l = out[idx]!; + var l = out[idx]; return out ..[idx] = l.copyWith( numbas: List<_Numba?>.from(l.numbas ?? []) 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 6913702e..14461a40 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 @@ -473,13 +473,13 @@ class RoleQuery 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); + 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)); @@ -509,13 +509,13 @@ class RoleQuery extends Query { @override delete(QueryExecutor executor) { return super.delete(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); + 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)); 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 62a0458b..77666702 100644 --- a/packages/orm/angel_orm_test/lib/src/standalone_test.dart +++ b/packages/orm/angel_orm_test/lib/src/standalone_test.dart @@ -130,7 +130,7 @@ standaloneTests(FutureOr Function() createExecutor, ..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()); }); diff --git a/packages/orm/angel_orm_test/pubspec.yaml b/packages/orm/angel_orm_test/pubspec.yaml index e5e430e7..9946531a 100644 --- a/packages/orm/angel_orm_test/pubspec.yaml +++ b/packages/orm/angel_orm_test/pubspec.yaml @@ -38,3 +38,7 @@ dev_dependencies: ref: sdk-2.12.x_nnbd path: packages/framework build_runner: ^2.0.1 + +#dependency_overrides: +# angel_orm: +# path: ../angel_orm