all has one tests pass

This commit is contained in:
Tobe O 2018-12-07 21:57:09 -05:00
parent 43736c4f48
commit 643661cf86
16 changed files with 55 additions and 7 deletions

View file

@ -3,6 +3,7 @@ import 'dart:async';
import 'package:analyzer/dart/constant/value.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart';
import 'package:angel_serialize_generator/angel_serialize_generator.dart';
@ -112,16 +113,18 @@ Future<OrmBuildContext> buildOrmContext(
'Cannot apply relationship to field "${field.name}" - ${field.type.name} is not assignable to Model.');
} else {
try {
var modelType = firstModelAncestor(field.type) ?? field.type;
foreign = await buildOrmContext(
field.type.element as ClassElement,
modelType.element as ClassElement,
new ConstantReader(const TypeChecker.fromRuntime(Serializable)
.firstAnnotationOf(field.type.element)),
.firstAnnotationOf(modelType.element)),
buildStep,
resolver,
autoSnakeCaseNames,
autoIdAndDateFields);
var ormAnn = const TypeChecker.fromRuntime(Orm)
.firstAnnotationOf(field.type.element);
.firstAnnotationOf(modelType.element);
if (ormAnn != null) {
foreignTable =
@ -243,3 +246,15 @@ class RelationFieldImpl extends ShimFieldImpl {
RelationFieldImpl(String name, DartType type, this.originalFieldName)
: super(name, type);
}
InterfaceType firstModelAncestor(DartType type) {
if (type is InterfaceType) {
if (const TypeChecker.fromRuntime(Model).isExactlyType(type.superclass)) {
return type;
} else {
return firstModelAncestor(type.superclass);
}
} else {
return null;
}
}

View file

@ -153,6 +153,7 @@ class OrmGenerator extends GeneratorForAnnotation<Orm> {
args[field.name] = expr;
}
b.statements.add(new Code('if (row.every((x) => x == null)) return null;'));
b.addExpression(ctx.buildContext.modelClassType
.newInstance([], args).assignVar('model'));
@ -200,7 +201,8 @@ class OrmGenerator extends GeneratorForAnnotation<Orm> {
..body = new Block((b) {
ctx.relations.forEach((fieldName, relation) {
//var name = ctx.buildContext.resolveFieldName(fieldName);
if (relation.type == RelationshipType.belongsTo) {
if (relation.type == RelationshipType.belongsTo ||
relation.type == RelationshipType.hasOne) {
var foreign = ctx.relationTypes[relation];
var additionalFields = foreign.effectiveFields
.where((f) => f.name != 'id' || !isSpecialId(f))

View file

@ -20,6 +20,7 @@ main() {
test('sets to null if no child', () async {
var query = new LegQuery()..where.id.equals(int.parse(originalLeg.id));
var leg = await query.getOne(executor);
print(leg.toJson());
expect(leg.name, originalLeg.name);
expect(leg.id, originalLeg.id);
expect(leg.foot, isNull);

View file

@ -0,0 +1,7 @@
CREATE TEMPORARY TABLE "feet" (
id serial PRIMARY KEY,
leg_id int NOT NULL,
n_toes int NOT NULL,
created_at timestamp,
updated_at timestamp
);

View file

@ -0,0 +1,6 @@
CREATE TEMPORARY TABLE "legs" (
id serial PRIMARY KEY,
name varchar(255) NOT NULL,
created_at timestamp,
updated_at timestamp
);

View file

@ -29,6 +29,7 @@ class AuthorQuery extends Query<Author, AuthorQueryWhere> {
}
static Author parseRow(List row) {
if (row.every((x) => x == null)) return null;
var model = new Author(
id: row[0].toString(),
name: (row[1] as String),

View file

@ -43,6 +43,7 @@ class BookQuery extends Query<Book, BookQueryWhere> {
}
static Book parseRow(List row) {
if (row.every((x) => x == null)) return null;
var model = new Book(
id: row[0].toString(),
name: (row[3] as String),

View file

@ -37,6 +37,7 @@ class CarQuery extends Query<Car, CarQueryWhere> {
}
static Car parseRow(List row) {
if (row.every((x) => x == null)) return null;
var model = new Car(
id: row[0].toString(),
make: (row[1] as String),

View file

@ -29,6 +29,7 @@ class CustomerQuery extends Query<Customer, CustomerQueryWhere> {
}
static Customer parseRow(List row) {
if (row.every((x) => x == null)) return null;
var model = new Customer(
id: row[0].toString(),
createdAt: (row[1] as DateTime),

View file

@ -7,7 +7,7 @@ part 'foot.g.dart';
part 'foot.serializer.g.dart';
@serializable
@orm
@Orm(tableName: 'feet')
class _Foot extends Model {
int legId, nToes;
}

View file

@ -15,7 +15,7 @@ class FootQuery extends Query<Foot, FootQueryWhere> {
@override
get tableName {
return 'foots';
return 'feet';
}
@override
@ -29,6 +29,7 @@ class FootQuery extends Query<Foot, FootQueryWhere> {
}
static Foot parseRow(List row) {
if (row.every((x) => x == null)) return null;
var model = new Foot(
id: row[0].toString(),
legId: (row[1] as int),

View file

@ -29,6 +29,7 @@ class FruitQuery extends Query<Fruit, FruitQueryWhere> {
}
static Fruit parseRow(List row) {
if (row.every((x) => x == null)) return null;
var model = new Fruit(
id: row[0].toString(),
treeId: (row[1] as int),

View file

@ -7,7 +7,14 @@ part of angel_orm_generator.test.models.leg;
// **************************************************************************
class LegQuery extends Query<Leg, LegQueryWhere> {
LegQuery() {}
LegQuery() {
leftJoin('feet', 'id', 'leg_id', additionalFields: const [
'leg_id',
'n_toes',
'created_at',
'updated_at'
]);
}
@override
final LegQueryValues values = new LegQueryValues();
@ -31,6 +38,7 @@ class LegQuery extends Query<Leg, LegQueryWhere> {
}
static Leg parseRow(List row) {
if (row.every((x) => x == null)) return null;
var model = new Leg(
id: row[0].toString(),
name: (row[1] as String),

View file

@ -37,6 +37,7 @@ class OrderQuery extends Query<Order, OrderQueryWhere> {
}
static Order parseRow(List row) {
if (row.every((x) => x == null)) return null;
var model = new Order(
id: row[0].toString(),
customerId: (row[1] as int),

View file

@ -29,6 +29,7 @@ class RoleQuery extends Query<Role, RoleQueryWhere> {
}
static Role parseRow(List row) {
if (row.every((x) => x == null)) return null;
var model = new Role(
id: row[0].toString(),
name: (row[1] as String),

View file

@ -3,6 +3,7 @@ library angel_orm_generator.test.models.tree;
import 'package:angel_model/angel_model.dart';
import 'package:angel_orm/angel_orm.dart';
import 'package:angel_serialize/angel_serialize.dart';
import 'package:collection/collection.dart';
import 'fruit.dart';
part 'tree.g.dart';
part 'tree.serializer.g.dart';