Updated deserialize
This commit is contained in:
parent
922eaa102b
commit
b952d10d4b
6 changed files with 34 additions and 19 deletions
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue