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/src/query.dart';
import 'package:angel_serialize/angel_serialize.dart';
import 'package:optional/optional.dart';
part 'main.g.dart';
part 'main.serializer.g.dart';
@ -75,14 +77,14 @@ class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
EmployeeQueryWhere newWhereClause() => EmployeeQueryWhere(this);
@override
Employee deserialize(List row) {
return Employee(
Optional<Employee> deserialize(List row) {
return Optional.ofNullable(Employee(
id: row[0].toString(),
firstName: row[1] as String,
lastName: row[2] as String,
salary: row[3] as double,
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
.query(tableName, sql, substitutionValues,
fields.map(adornWithTableName).toList())
.then((it) => it.map(deserialize).toList());
.then((it) => deserializeList(it));
} else {
return executor.transaction((tx) async {
// 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) =>
it.isEmpty
? 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
.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 = '',
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 {
var sql = compile({});
return executor
.query(tableName, sql, substitutionValues)
.then((it) => it.map(deserialize).toList());
.then((it) => deserializeList(it));
}
Future<Optional<T>> getOne(QueryExecutor executor) {

View file

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

View file

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

View file

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