Updated deserialize

This commit is contained in:
thomashii@dukefirehawk.com 2021-05-04 23:03:15 +08:00
parent 922eaa102b
commit b952d10d4b
6 changed files with 34 additions and 19 deletions

View file

@ -4,6 +4,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_orm/src/query.dart'; import 'package:angel_orm/src/query.dart';
import 'package:angel_serialize/angel_serialize.dart'; import 'package:angel_serialize/angel_serialize.dart';
import 'package:optional/optional.dart';
part 'main.g.dart'; part 'main.g.dart';
part 'main.serializer.g.dart'; part 'main.serializer.g.dart';
@ -75,14 +77,14 @@ class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
EmployeeQueryWhere newWhereClause() => EmployeeQueryWhere(this); EmployeeQueryWhere newWhereClause() => EmployeeQueryWhere(this);
@override @override
Employee deserialize(List row) { Optional<Employee> deserialize(List row) {
return Employee( return Optional.ofNullable(Employee(
id: row[0].toString(), id: row[0].toString(),
firstName: row[1] as String, firstName: row[1] as String,
lastName: row[2] as String, lastName: row[2] as String,
salary: row[3] as double, salary: row[3] as double,
createdAt: row[4] as DateTime, createdAt: row[4] as DateTime,
updatedAt: row[5] as DateTime); updatedAt: row[5] as DateTime));
} }
} }

View file

@ -336,7 +336,7 @@ abstract class Query<T, Where extends QueryWhere> extends QueryBase<T> {
return executor return executor
.query(tableName, sql, substitutionValues, .query(tableName, sql, substitutionValues,
fields.map(adornWithTableName).toList()) fields.map(adornWithTableName).toList())
.then((it) => it.map(deserialize).toList()); .then((it) => deserializeList(it));
} else { } else {
return executor.transaction((tx) async { return executor.transaction((tx) async {
// TODO: Can this be done with just *one* query? // TODO: Can this be done with just *one* query?
@ -367,7 +367,7 @@ abstract class Query<T, Where extends QueryWhere> extends QueryBase<T> {
return executor.query(tableName, sql, substitutionValues).then((it) => return executor.query(tableName, sql, substitutionValues).then((it) =>
it.isEmpty it.isEmpty
? Optional.empty() ? Optional.empty()
: Optional.ofNullable(deserialize(it.first))); : Optional.ofNullable(deserialize(it.first).value));
} }
} }
@ -391,7 +391,7 @@ abstract class Query<T, Where extends QueryWhere> extends QueryBase<T> {
return executor return executor
.query(tableName, sql, substitutionValues) .query(tableName, sql, substitutionValues)
.then((it) => it.map(deserialize).toList()); .then((it) => deserializeList(it));
} }
} }

View file

@ -39,14 +39,26 @@ abstract class QueryBase<T> {
String preamble = '', String preamble = '',
bool withFields = true}); bool withFields = true});
T deserialize(List row); Optional<T> deserialize(List row);
List<T> deserializeList(List<List<dynamic>> it) {
var optResult = it.map(deserialize).toList();
var result = <T>[];
optResult.forEach((element) {
element.ifPresent((item) {
result.add(item);
});
});
return result;
}
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) => deserializeList(it));
} }
Future<Optional<T>> getOne(QueryExecutor executor) { Future<Optional<T>> getOne(QueryExecutor executor) {

View file

@ -1,4 +1,5 @@
import 'query_base.dart'; import 'query_base.dart';
import 'package:optional/optional.dart';
/// Represents the `UNION` of two subqueries. /// Represents the `UNION` of two subqueries.
class Union<T> extends QueryBase<T> { class Union<T> extends QueryBase<T> {
@ -22,7 +23,7 @@ class Union<T> extends QueryBase<T> {
List<String> get fields => left.fields; List<String> get fields => left.fields;
@override @override
T deserialize(List row) => left.deserialize(row); Optional<T> deserialize(List row) => left.deserialize(row);
@override @override
String compile(Set<String> trampoline, String compile(Set<String> trampoline,

View file

@ -455,8 +455,10 @@ class RoleQuery extends Query<Role, RoleQueryWhere> {
updatedAt: (row[2] as DateTime?), updatedAt: (row[2] as DateTime?),
name: (row[3] as String?)); name: (row[3] as String?));
if (row.length > 4) { if (row.length > 4) {
model = model.copyWith( var userOpt = UserQuery.parseRow(row.skip(4).take(6).toList());
users: [UserQuery.parseRow(row.skip(4).take(6).toList()).value]); userOpt.ifPresent((user) {
model = model.copyWith(users: [user]);
});
} }
return Optional.ofNullable(model); return Optional.ofNullable(model);
} }

View file

@ -118,10 +118,10 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
var id = int.parse(ferrari!.id!); var id = int.parse(ferrari!.id!);
var query = CarQuery()..where!.id.equals(id); var query = CarQuery()..where!.id.equals(id);
var carOpt = await (query.deleteOne(executor)); var carOpt = await (query.deleteOne(executor));
if (carOpt.isPresent) { carOpt.ifPresent((car) {
var car = carOpt.value; var car = carOpt.value;
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);
@ -151,11 +151,11 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
var cloned = ferrari!.copyWith(make: 'Angel'); var cloned = ferrari!.copyWith(make: 'Angel');
var query = CarQuery()..values.copyFrom(cloned); var query = CarQuery()..values.copyFrom(cloned);
var carOpt = await (query.updateOne(executor)); var carOpt = await (query.updateOne(executor));
if (carOpt.isPresent) { carOpt.ifPresent((car) {
var car = carOpt.value; var car = carOpt.value;
print(car.toJson()); print(car.toJson());
expect(car.toJson(), cloned.toJson()); expect(car.toJson(), cloned.toJson());
} });
}); });
}); });
}); });
@ -172,7 +172,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
..createdAt = now ..createdAt = now
..updatedAt = now; ..updatedAt = now;
var carOpt = await (query.insert(executor)); var carOpt = await (query.insert(executor));
if (carOpt.isPresent) { carOpt.ifPresent((car) {
var car = carOpt.value; var car = carOpt.value;
expect(car.id, isNotNull); expect(car.id, isNotNull);
expect(car.make, 'Honda'); expect(car.make, 'Honda');
@ -181,9 +181,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
expect( expect(
dateYmdHms.format(car.recalledAt!), dateYmdHms.format(recalledAt)); dateYmdHms.format(car.recalledAt!), dateYmdHms.format(recalledAt));
expect(car.createdAt, allOf(isNotNull, equals(car.updatedAt))); expect(car.createdAt, allOf(isNotNull, equals(car.updatedAt)));
} else { });
print("Car is null");
}
}); });
test('insert car', () async { test('insert car', () async {