2.0.0-dev.6

This commit is contained in:
Tobe O 2018-12-03 08:41:14 -05:00
parent 19fd1ed46b
commit a6eeeb32e8
58 changed files with 314 additions and 932 deletions

View file

@ -1,3 +1,6 @@
# 2.0.0-dev.6
* Add `delete`, `insert` and `update` methods to `Query`.
# 2.0.0-dev.4
* Add more querying methods.
* Add preamble to `Query.compile`.

View file

@ -39,6 +39,9 @@ abstract class _Employee extends Model {
}
class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
@override
final QueryValues values = new MapQueryValues();
@override
final EmployeeQueryWhere where = new EmployeeQueryWhere();

View file

@ -2,4 +2,4 @@ export 'src/annotations.dart';
export 'src/builder.dart';
export 'src/migration.dart';
export 'src/relations.dart';
export 'src/query.dart';
export 'src/query.dart';

View file

@ -40,7 +40,8 @@ class Column {
class PrimaryKey extends Column {
const PrimaryKey({ColumnType columnType})
: super(
type: columnType ?? ColumnType.serial, indexType: IndexType.primaryKey);
type: columnType ?? ColumnType.serial,
indexType: IndexType.primaryKey);
}
const Column primaryKey = const PrimaryKey();

View file

@ -9,6 +9,9 @@ abstract class QueryBase<T> {
/// If it's `null`, then this query will perform a `SELECT *`.
List<String> get fields;
/// A String of all [fields], joined by a comma (`,`).
String get fieldSet => fields.join(', ');
String compile({bool includeTableName: false, String preamble});
T deserialize(List row);
@ -42,6 +45,21 @@ class OrderBy {
String compile() => descending ? '$key DESC' : '$key ASC';
}
String toSql(Object obj) {
if (obj is DateTime) {
return dateYmdHms.format(obj);
} else if (obj is bool) {
return obj ? 'TRUE' : 'FALSE';
} else if (obj == null) {
return 'NULL';
} else if (obj is String) {
// TODO: Proper escapes
return obj;
} else {
return obj.toString();
}
}
/// A SQL `SELECT` query builder.
abstract class Query<T, Where extends QueryWhere> extends QueryBase<T> {
final List<OrderBy> _orderBy = [];
@ -54,9 +72,14 @@ abstract class Query<T, Where extends QueryWhere> extends QueryBase<T> {
/// A reference to an abstract query builder.
///
/// This is often a generated class.
/// This is usually a generated class.
Where get where;
/// A set of values, for an insertion or update.
///
/// This is usually a generated class.
QueryValues get values;
/// Makes a new [Where] clause.
Where newWhereClause() {
throw new UnsupportedError(
@ -168,6 +191,12 @@ abstract class Query<T, Where extends QueryWhere> extends QueryBase<T> {
return b.toString();
}
@override
Future<T> getOne(QueryExecutor executor) {
limit(1);
return super.getOne(executor);
}
Future<List<T>> delete(QueryExecutor executor) async {
var sql = compile(preamble: 'DELETE FROM $tableName');
return executor
@ -176,8 +205,88 @@ abstract class Query<T, Where extends QueryWhere> extends QueryBase<T> {
}
Future<T> deleteOne(QueryExecutor executor) {
limit(1);
return delete(executor).then((it) => it.isEmpty ? null : it.first);
}
Future<T> insert(QueryExecutor executor) {
var sql = new StringBuffer('INSERT INTO $tableName ($fieldSet)');
var valuesClause = values.compileForInsert();
if (valuesClause == null) {
throw new StateError('No values have been specified for update.');
} else {
sql.write(' $valuesClause');
return executor
.query(sql.toString(), fields)
.then((it) => it.isEmpty ? null : deserialize(it.first));
}
}
Future<List<T>> update(QueryExecutor executor) async {
var sql = new StringBuffer('UPDATE $tableName');
var valuesClause = values.compileForUpdate();
if (valuesClause == null) {
throw new StateError('No values have been specified for update.');
} else {
sql.write(' $valuesClause');
var whereClause = where.compile();
if (whereClause.isNotEmpty) sql.write(' WHERE $whereClause');
if (_limit != null) sql.write(' LIMIT $_limit');
return executor
.query(sql.toString(), fields)
.then((it) => it.map(deserialize).toList());
}
}
Future<T> updateOne(QueryExecutor executor) {
limit(1);
return update(executor).then((it) => it.isEmpty ? null : it.first);
}
}
abstract class QueryValues {
Map<String, dynamic> toMap();
String compileForInsert() {
var data = toMap();
if (data.isEmpty) return null;
var b = new StringBuffer('VALUES (');
int i = 0;
for (var entry in data.entries) {
if (i++ > 0) b.write(', ');
b.write(toSql(entry.value));
}
b.write(')');
return b.toString();
}
String compileForUpdate() {
var data = toMap();
if (data.isEmpty) return null;
var b = new StringBuffer('SET');
int i = 0;
for (var entry in data.entries) {
if (i++ > 0) b.write(',');
b.write(' ');
b.write(entry.key);
b.write('=');
b.write(toSql(entry.value));
}
return b.toString();
}
}
/// A [QueryValues] implementation that simply writes to a [Map].
class MapQueryValues extends QueryValues {
final Map<String, dynamic> values = {};
@override
Map<String, dynamic> toMap() => values;
}
/// Builds a SQL `WHERE` clause.

View file

@ -1,5 +1,5 @@
name: angel_orm
version: 2.0.0-dev.5
version: 2.0.0-dev.6
description: Runtime support for Angel's ORM.
author: Tobe O <thosakwe@gmail.com>
homepage: https://github.com/angel-dart/orm

View file

@ -10,3 +10,21 @@ builders:
- ".angel_orm.g.part"
applies_builders:
["source_gen|combining_builder", "source_gen|part_cleanup"]
targets:
_standalone:
sources:
- test/models/author.dart
- test/models/car.dart
- test/models/customer.dart
- test/models/foot.dart
- test/models/fruit.dart
- test/models/role.dart
$default:
dependencies:
- :_standalone
sources:
- test/models/book.dart
- test/models/leg.dart
- test/models/order.dart
- test/models/tree.dart
- test/models/user.dart

View file

@ -1,4 +1,4 @@
//export 'src/mongodb_orm_generator.dart';
export 'src/orm_build_context.dart';
export 'src/orm_generator.dart';
export 'src/readers.dart';
export 'src/readers.dart';

View file

@ -86,10 +86,8 @@ class OrmGenerator extends GeneratorForAnnotation<Orm> {
..annotations.add(refer('override'))
..type = MethodType.getter
..body = new Block((b) {
var names = ctx.buildContext.fields
.map((f) => literalString(f.name))
.toList();
b.addExpression(literalConstList(names).returned);
b.addExpression(
refer('${rc.pascalCase}Fields').property('allFields').returned);
});
}));
@ -116,8 +114,16 @@ class OrmGenerator extends GeneratorForAnnotation<Orm> {
var args = <String, Expression>{};
for (var field in ctx.buildContext.fields) {
var type = convertTypeReference(field.type);
args[field.name] = (refer('row').index(literalNum(i))).asA(type);
Reference type = convertTypeReference(field.type);
if (isSpecialId(field)) type = refer('int');
var expr = (refer('row').index(literalNum(i++)));
if (isSpecialId(field))
expr = expr.property('toString').call([]);
else
expr = expr.asA(type);
args[field.name] = expr;
}
b.addExpression(
@ -127,6 +133,10 @@ class OrmGenerator extends GeneratorForAnnotation<Orm> {
});
}
bool isSpecialId(FieldElement field) {
return (field.name == 'id' && autoIdAndDateFields);
}
Class buildWhereClass(OrmBuildContext ctx) {
return new Class((clazz) {
var rc = ctx.buildContext.modelClassNameRecase;
@ -151,7 +161,14 @@ class OrmGenerator extends GeneratorForAnnotation<Orm> {
// TODO: Handle fields with relations
Reference builderType;
if (const TypeChecker.fromRuntime(String).isExactlyType(field.type)) {
if (const TypeChecker.fromRuntime(int).isExactlyType(field.type) ||
const TypeChecker.fromRuntime(double).isExactlyType(field.type) ||
isSpecialId(field)) {
builderType = new TypeReference((b) => b
..symbol = 'NumericSqlExpressionBuilder'
..types.add(refer(isSpecialId(field) ? 'int' : field.type.name)));
} else if (const TypeChecker.fromRuntime(String)
.isExactlyType(field.type)) {
builderType = refer('StringSqlExpressionBuilder');
} else if (const TypeChecker.fromRuntime(bool)
.isExactlyType(field.type)) {
@ -159,12 +176,6 @@ class OrmGenerator extends GeneratorForAnnotation<Orm> {
} else if (const TypeChecker.fromRuntime(DateTime)
.isExactlyType(field.type)) {
builderType = refer('DateTimeSqlExpressionBuilder');
} else if (const TypeChecker.fromRuntime(int)
.isExactlyType(field.type) ||
const TypeChecker.fromRuntime(double).isExactlyType(field.type)) {
builderType = new TypeReference((b) => b
..symbol = 'NumericSqlExpressionBuilder'
..types.add(refer(field.type.name)));
} else {
throw new UnsupportedError(
'Cannot generate ORM code for field of type ${field.type.name}.');

View file

@ -24,5 +24,6 @@ dev_dependencies:
#angel_migration: ^1.0.0-alpha
#angel_test: ^1.0.0
build_runner: ^1.0.0
collection: ^1.0.0
postgres: ^1.0.0
test: ^1.0.0

View file

@ -1,16 +1,13 @@
/// Tests for @belongsTo...
library angel_orm_generator.test.book_test;
import 'package:postgres/postgres.dart';
import 'package:test/test.dart';
import 'models/author.dart';
import 'models/author.orm.g.dart';
import 'models/book.dart';
import 'models/book.orm.g.dart';
import 'common.dart';
main() {
PostgreSQLConnection connection;
PostgresExecutor connection;
Author rowling;
Author jameson;
Book deathlyHallows;
@ -24,13 +21,14 @@ main() {
// And a book
deathlyHallows = await BookQuery.insert(connection,
authorId: int.parse(rowling.id), name: 'Deathly Hallows', partnerAuthorId: int.parse(jameson.id));
authorId: int.parse(rowling.id),
name: 'Deathly Hallows',
partnerAuthorId: int.parse(jameson.id));
});
tearDown(() => connection.close());
group('selects', ()
{
group('selects', () {
test('select all', () async {
var query = new BookQuery();
var books = await query.get(connection).toList();
@ -52,8 +50,8 @@ main() {
query.where.id.equals(int.parse(deathlyHallows.id));
print(query.toSql());
var book = await BookQuery.getOne(
int.parse(deathlyHallows.id), connection);
var book =
await BookQuery.getOne(int.parse(deathlyHallows.id), connection);
print(book.toJson());
expect(book.id, deathlyHallows.id);
expect(book.name, deathlyHallows.name);
@ -85,10 +83,8 @@ main() {
});
test('union', () async {
var query1 = new BookQuery()
..where.name.like('Deathly%');
var query2 = new BookQuery()
..where.authorId.equals(-1);
var query1 = new BookQuery()..where.name.like('Deathly%');
var query2 = new BookQuery()..where.authorId.equals(-1);
var query3 = new BookQuery()
..where.name.isIn(['Goblet of Fire', 'Order of the Phoenix']);
query1

View file

@ -1,8 +1,9 @@
import 'dart:async';
import 'dart:io';
import 'package:angel_orm/angel_orm.dart';
import 'package:postgres/postgres.dart';
Future<PostgreSQLConnection> connectToPostgres(Iterable<String> schemas) async {
Future<PostgresExecutor> connectToPostgres(Iterable<String> schemas) async {
var conn = new PostgreSQLConnection('127.0.0.1', 5432, 'angel_orm_test',
username: Platform.environment['POSTGRES_USERNAME'] ?? 'postgres',
password: Platform.environment['POSTGRES_PASSWORD'] ?? 'password');
@ -12,5 +13,20 @@ Future<PostgreSQLConnection> connectToPostgres(Iterable<String> schemas) async {
await conn
.execute(await new File('test/models/$s.up.g.sql').readAsString());
return conn;
return new PostgresExecutor(conn);
}
class PostgresExecutor extends QueryExecutor {
final PostgreSQLConnection connection;
PostgresExecutor(this.connection);
Future close() => connection.close();
@override
Future<List<List>> query(String query, List<String> returningFields) {
var fields = returningFields.join(', ');
var returning = 'RETURNING ($fields)';
return connection.query('$query $returning');
}
}

View file

@ -1,13 +1,12 @@
import 'dart:async';
import 'package:angel_framework/angel_framework.dart';
import 'package:postgres/postgres.dart';
import 'package:angel_orm/angel_orm.dart';
import '../models/car.dart';
import '../models/car.orm.g.dart';
@Expose('/api/cars')
class CarController extends Controller {
@Expose('/luxury')
Stream<Car> getLuxuryCars(PostgreSQLConnection connection) {
Future<List<Car>> getLuxuryCars(QueryExecutor connection) {
var query = new CarQuery();
query.where
..familyFriendly.equals(false)

View file

@ -1,7 +1,7 @@
/// Tests for @hasOne...
library angel_orm_generator.test.has_one_test;
import 'package:postgres/postgres.dart';
import 'package:angel_orm/angel_orm.dart';
import 'package:test/test.dart';
import 'models/foot.orm.g.dart';
import 'models/leg.dart';
@ -9,7 +9,7 @@ import 'models/leg.orm.g.dart';
import 'common.dart';
main() {
PostgreSQLConnection connection;
QueryExecutor connection;
Leg originalLeg;
setUp(() async {

View file

@ -17,21 +17,22 @@ class AuthorQuery extends Query<Author, AuthorQueryWhere> {
@override
get fields {
return const ['id', 'name', 'createdAt', 'updatedAt'];
return AuthorFields.allFields;
}
@override
deserialize(List row) {
return new Author(
id: (row[0] as String),
name: (row[0] as String),
createdAt: (row[0] as DateTime),
updatedAt: (row[0] as DateTime));
id: row[0].toString(),
name: (row[1] as String),
createdAt: (row[2] as DateTime),
updatedAt: (row[3] as DateTime));
}
}
class AuthorQueryWhere extends QueryWhere {
final StringSqlExpressionBuilder id = new StringSqlExpressionBuilder('id');
final NumericSqlExpressionBuilder<int> id =
new NumericSqlExpressionBuilder<int>('id');
final StringSqlExpressionBuilder name =
new StringSqlExpressionBuilder('name');

View file

@ -1,24 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
import 'author.dart';
import 'dart:async';
import 'package:postgres/postgres.dart';
part 'author.postgresql.orm.g.dart';
abstract class AuthorOrm {
factory AuthorOrm.postgreSql(PostgreSQLConnection connection) =
PostgreSqlAuthorOrm;
Future<List<Author>> getAll();
Future<Author> getById(String id);
Future<Author> deleteById(String id);
Future<Author> createAuthor(Author model);
Future<Author> updateAuthor(Author model);
AuthorQuery query();
}
class AuthorQuery {}

View file

@ -1,77 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
part of 'author.orm.g.dart';
class PostgreSqlAuthorOrm implements AuthorOrm {
PostgreSqlAuthorOrm(this.connection);
final PostgreSQLConnection connection;
static Author parseRow(List row) {
return new Author(
id: (row[0] as String),
name: (row[1] as String),
createdAt: (row[2] as DateTime),
updatedAt: (row[3] as DateTime));
}
@override
Future<Author> getById(String id) async {
var r = await connection.query(
'SELECT id, name, created_at, updated_at FROM "authors" WHERE id = @id LIMIT 1;',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<Author> deleteById(String id) async {
var r = await connection.query(
'DELETE FROM "authors" WHERE id = @id RETURNING "id", "name", "created_at", "updated_at";',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<List<Author>> getAll() async {
var r = await connection
.query('SELECT id, name, created_at, updated_at FROM "authors";');
return r.map(parseRow).toList();
}
@override
Future<Author> createAuthor(Author model) async {
model = model.copyWith(
createdAt: new DateTime.now(), updatedAt: new DateTime.now());
var r = await connection.query(
'INSERT INTO "authors" ( "id", "name", "created_at", "updated_at") VALUES (@id,@name,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "name", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'name': model.name,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
@override
Future<Author> updateAuthor(Author model) async {
model = model.copyWith(updatedAt: new DateTime.now());
var r = await connection.query(
'UPDATE "authors" SET ( "id", "name", "created_at", "updated_at") = (@id,@name,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "name", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'name': model.name,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
AuthorQuery query() {
return null;
}
}

View file

@ -21,10 +21,10 @@ class Book extends _Book {
final String id;
@override
final dynamic author;
final Author author;
@override
final dynamic partnerAuthor;
final Author partnerAuthor;
@override
final int authorId;
@ -40,8 +40,8 @@ class Book extends _Book {
Book copyWith(
{String id,
dynamic author,
dynamic partnerAuthor,
Author author,
Author partnerAuthor,
int authorId,
String name,
DateTime createdAt,

View file

@ -1,7 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
// Error: Cannot infer SQL column type for field "author" with type "Author".

View file

@ -1,7 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
// Error: Cannot infer SQL column type for field "author" with type "Author".

View file

@ -10,8 +10,12 @@ abstract class BookSerializer {
static Book fromMap(Map map) {
return new Book(
id: map['id'] as String,
author: map['author'] as dynamic,
partnerAuthor: map['partner_author'] as dynamic,
author: map['author'] != null
? AuthorSerializer.fromMap(map['author'] as Map)
: null,
partnerAuthor: map['partner_author'] != null
? AuthorSerializer.fromMap(map['partner_author'] as Map)
: null,
authorId: map['author_id'] as int,
name: map['name'] as String,
createdAt: map['created_at'] != null
@ -32,8 +36,8 @@ abstract class BookSerializer {
}
return {
'id': model.id,
'author': model.author,
'partner_author': model.partnerAuthor,
'author': AuthorSerializer.toMap(model.author),
'partner_author': AuthorSerializer.toMap(model.partnerAuthor),
'author_id': model.authorId,
'name': model.name,
'created_at': model.createdAt?.toIso8601String(),

View file

@ -17,32 +17,25 @@ class CarQuery extends Query<Car, CarQueryWhere> {
@override
get fields {
return const [
'id',
'make',
'description',
'familyFriendly',
'recalledAt',
'createdAt',
'updatedAt'
];
return CarFields.allFields;
}
@override
deserialize(List row) {
return new Car(
id: (row[0] as String),
make: (row[0] as String),
description: (row[0] as String),
familyFriendly: (row[0] as bool),
recalledAt: (row[0] as DateTime),
createdAt: (row[0] as DateTime),
updatedAt: (row[0] as DateTime));
id: row[0].toString(),
make: (row[1] as String),
description: (row[2] as String),
familyFriendly: (row[3] as bool),
recalledAt: (row[4] as DateTime),
createdAt: (row[5] as DateTime),
updatedAt: (row[6] as DateTime));
}
}
class CarQueryWhere extends QueryWhere {
final StringSqlExpressionBuilder id = new StringSqlExpressionBuilder('id');
final NumericSqlExpressionBuilder<int> id =
new NumericSqlExpressionBuilder<int>('id');
final StringSqlExpressionBuilder make =
new StringSqlExpressionBuilder('make');

View file

@ -1,23 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
import 'car.dart';
import 'dart:async';
import 'package:postgres/postgres.dart';
part 'car.postgresql.orm.g.dart';
abstract class CarOrm {
factory CarOrm.postgreSql(PostgreSQLConnection connection) = PostgreSqlCarOrm;
Future<List<Car>> getAll();
Future<Car> getById(String id);
Future<Car> deleteById(String id);
Future<Car> createCar(Car model);
Future<Car> updateCar(Car model);
CarQuery query();
}
class CarQuery {}

View file

@ -1,86 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
part of 'car.orm.g.dart';
class PostgreSqlCarOrm implements CarOrm {
PostgreSqlCarOrm(this.connection);
final PostgreSQLConnection connection;
static Car parseRow(List row) {
return new Car(
id: (row[0] as String),
make: (row[1] as String),
description: (row[2] as String),
familyFriendly: (row[3] as bool),
recalledAt: (row[4] as DateTime),
createdAt: (row[5] as DateTime),
updatedAt: (row[6] as DateTime));
}
@override
Future<Car> getById(String id) async {
var r = await connection.query(
'SELECT id, make, description, family_friendly, recalled_at, created_at, updated_at FROM "cars" WHERE id = @id LIMIT 1;',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<Car> deleteById(String id) async {
var r = await connection.query(
'DELETE FROM "cars" WHERE id = @id RETURNING "id", "make", "description", "family_friendly", "recalled_at", "created_at", "updated_at";',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<List<Car>> getAll() async {
var r = await connection.query(
'SELECT id, make, description, family_friendly, recalled_at, created_at, updated_at FROM "cars";');
return r.map(parseRow).toList();
}
@override
Future<Car> createCar(Car model) async {
model = model.copyWith(
createdAt: new DateTime.now(), updatedAt: new DateTime.now());
var r = await connection.query(
'INSERT INTO "cars" ( "id", "make", "description", "family_friendly", "recalled_at", "created_at", "updated_at") VALUES (@id,@make,@description,@familyFriendly,CAST (@recalledAt AS timestamp),CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "make", "description", "family_friendly", "recalled_at", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'make': model.make,
'description': model.description,
'familyFriendly': model.familyFriendly,
'recalledAt': model.recalledAt,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
@override
Future<Car> updateCar(Car model) async {
model = model.copyWith(updatedAt: new DateTime.now());
var r = await connection.query(
'UPDATE "cars" SET ( "id", "make", "description", "family_friendly", "recalled_at", "created_at", "updated_at") = (@id,@make,@description,@familyFriendly,CAST (@recalledAt AS timestamp),CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "make", "description", "family_friendly", "recalled_at", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'make': model.make,
'description': model.description,
'familyFriendly': model.familyFriendly,
'recalledAt': model.recalledAt,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
CarQuery query() {
return null;
}
}

View file

@ -8,5 +8,4 @@ part 'customer.serializer.g.dart';
@orm
@serializable
class _Customer extends Model {
}
class _Customer extends Model {}

View file

@ -17,20 +17,21 @@ class CustomerQuery extends Query<Customer, CustomerQueryWhere> {
@override
get fields {
return const ['id', 'createdAt', 'updatedAt'];
return CustomerFields.allFields;
}
@override
deserialize(List row) {
return new Customer(
id: (row[0] as String),
createdAt: (row[0] as DateTime),
updatedAt: (row[0] as DateTime));
id: row[0].toString(),
createdAt: (row[1] as DateTime),
updatedAt: (row[2] as DateTime));
}
}
class CustomerQueryWhere extends QueryWhere {
final StringSqlExpressionBuilder id = new StringSqlExpressionBuilder('id');
final NumericSqlExpressionBuilder<int> id =
new NumericSqlExpressionBuilder<int>('id');
final DateTimeSqlExpressionBuilder createdAt =
new DateTimeSqlExpressionBuilder('created_at');

View file

@ -1,24 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
import 'customer.dart';
import 'dart:async';
import 'package:postgres/postgres.dart';
part 'customer.postgresql.orm.g.dart';
abstract class CustomerOrm {
factory CustomerOrm.postgreSql(PostgreSQLConnection connection) =
PostgreSqlCustomerOrm;
Future<List<Customer>> getAll();
Future<Customer> getById(String id);
Future<Customer> deleteById(String id);
Future<Customer> createCustomer(Customer model);
Future<Customer> updateCustomer(Customer model);
CustomerQuery query();
}
class CustomerQuery {}

View file

@ -1,74 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
part of 'customer.orm.g.dart';
class PostgreSqlCustomerOrm implements CustomerOrm {
PostgreSqlCustomerOrm(this.connection);
final PostgreSQLConnection connection;
static Customer parseRow(List row) {
return new Customer(
id: (row[0] as String),
createdAt: (row[1] as DateTime),
updatedAt: (row[2] as DateTime));
}
@override
Future<Customer> getById(String id) async {
var r = await connection.query(
'SELECT id, created_at, updated_at FROM "customers" WHERE id = @id LIMIT 1;',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<Customer> deleteById(String id) async {
var r = await connection.query(
'DELETE FROM "customers" WHERE id = @id RETURNING "id", "created_at", "updated_at";',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<List<Customer>> getAll() async {
var r = await connection
.query('SELECT id, created_at, updated_at FROM "customers";');
return r.map(parseRow).toList();
}
@override
Future<Customer> createCustomer(Customer model) async {
model = model.copyWith(
createdAt: new DateTime.now(), updatedAt: new DateTime.now());
var r = await connection.query(
'INSERT INTO "customers" ( "id", "created_at", "updated_at") VALUES (@id,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
@override
Future<Customer> updateCustomer(Customer model) async {
model = model.copyWith(updatedAt: new DateTime.now());
var r = await connection.query(
'UPDATE "customers" SET ( "id", "created_at", "updated_at") = (@id,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
CustomerQuery query() {
return null;
}
}

View file

@ -10,4 +10,4 @@ part 'foot.serializer.g.dart';
@orm
class _Foot extends Model {
int legId, nToes;
}
}

View file

@ -17,22 +17,23 @@ class FootQuery extends Query<Foot, FootQueryWhere> {
@override
get fields {
return const ['id', 'legId', 'nToes', 'createdAt', 'updatedAt'];
return FootFields.allFields;
}
@override
deserialize(List row) {
return new Foot(
id: (row[0] as String),
legId: (row[0] as int),
nToes: (row[0] as int),
createdAt: (row[0] as DateTime),
updatedAt: (row[0] as DateTime));
id: row[0].toString(),
legId: (row[1] as int),
nToes: (row[2] as int),
createdAt: (row[3] as DateTime),
updatedAt: (row[4] as DateTime));
}
}
class FootQueryWhere extends QueryWhere {
final StringSqlExpressionBuilder id = new StringSqlExpressionBuilder('id');
final NumericSqlExpressionBuilder<int> id =
new NumericSqlExpressionBuilder<int>('id');
final NumericSqlExpressionBuilder<int> legId =
new NumericSqlExpressionBuilder<int>('leg_id');

View file

@ -1,24 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
import 'dart:async';
import 'foot.dart';
import 'package:postgres/postgres.dart';
part 'foot.postgresql.orm.g.dart';
abstract class FootOrm {
factory FootOrm.postgreSql(PostgreSQLConnection connection) =
PostgreSqlFootOrm;
Future<List<Foot>> getAll();
Future<Foot> getById(String id);
Future<Foot> deleteById(String id);
Future<Foot> createFoot(Foot model);
Future<Foot> updateFoot(Foot model);
FootQuery query();
}
class FootQuery {}

View file

@ -1,80 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
part of 'foot.orm.g.dart';
class PostgreSqlFootOrm implements FootOrm {
PostgreSqlFootOrm(this.connection);
final PostgreSQLConnection connection;
static Foot parseRow(List row) {
return new Foot(
id: (row[0] as String),
legId: (row[1] as int),
nToes: (row[2] as int),
createdAt: (row[3] as DateTime),
updatedAt: (row[4] as DateTime));
}
@override
Future<Foot> getById(String id) async {
var r = await connection.query(
'SELECT id, leg_id, n_toes, created_at, updated_at FROM "foots" WHERE id = @id LIMIT 1;',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<Foot> deleteById(String id) async {
var r = await connection.query(
'DELETE FROM "foots" WHERE id = @id RETURNING "id", "leg_id", "n_toes", "created_at", "updated_at";',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<List<Foot>> getAll() async {
var r = await connection.query(
'SELECT id, leg_id, n_toes, created_at, updated_at FROM "foots";');
return r.map(parseRow).toList();
}
@override
Future<Foot> createFoot(Foot model) async {
model = model.copyWith(
createdAt: new DateTime.now(), updatedAt: new DateTime.now());
var r = await connection.query(
'INSERT INTO "foots" ( "id", "leg_id", "n_toes", "created_at", "updated_at") VALUES (@id,@legId,@nToes,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "leg_id", "n_toes", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'legId': model.legId,
'nToes': model.nToes,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
@override
Future<Foot> updateFoot(Foot model) async {
model = model.copyWith(updatedAt: new DateTime.now());
var r = await connection.query(
'UPDATE "foots" SET ( "id", "leg_id", "n_toes", "created_at", "updated_at") = (@id,@legId,@nToes,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "leg_id", "n_toes", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'legId': model.legId,
'nToes': model.nToes,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
FootQuery query() {
return null;
}
}

View file

@ -11,4 +11,4 @@ part 'fruit.serializer.g.dart';
class _Fruit extends Model {
int treeId;
String commonName;
}
}

View file

@ -17,22 +17,23 @@ class FruitQuery extends Query<Fruit, FruitQueryWhere> {
@override
get fields {
return const ['id', 'treeId', 'commonName', 'createdAt', 'updatedAt'];
return FruitFields.allFields;
}
@override
deserialize(List row) {
return new Fruit(
id: (row[0] as String),
treeId: (row[0] as int),
commonName: (row[0] as String),
createdAt: (row[0] as DateTime),
updatedAt: (row[0] as DateTime));
id: row[0].toString(),
treeId: (row[1] as int),
commonName: (row[2] as String),
createdAt: (row[3] as DateTime),
updatedAt: (row[4] as DateTime));
}
}
class FruitQueryWhere extends QueryWhere {
final StringSqlExpressionBuilder id = new StringSqlExpressionBuilder('id');
final NumericSqlExpressionBuilder<int> id =
new NumericSqlExpressionBuilder<int>('id');
final NumericSqlExpressionBuilder<int> treeId =
new NumericSqlExpressionBuilder<int>('tree_id');

View file

@ -1,24 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
import 'dart:async';
import 'fruit.dart';
import 'package:postgres/postgres.dart';
part 'fruit.postgresql.orm.g.dart';
abstract class FruitOrm {
factory FruitOrm.postgreSql(PostgreSQLConnection connection) =
PostgreSqlFruitOrm;
Future<List<Fruit>> getAll();
Future<Fruit> getById(String id);
Future<Fruit> deleteById(String id);
Future<Fruit> createFruit(Fruit model);
Future<Fruit> updateFruit(Fruit model);
FruitQuery query();
}
class FruitQuery {}

View file

@ -1,80 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
part of 'fruit.orm.g.dart';
class PostgreSqlFruitOrm implements FruitOrm {
PostgreSqlFruitOrm(this.connection);
final PostgreSQLConnection connection;
static Fruit parseRow(List row) {
return new Fruit(
id: (row[0] as String),
treeId: (row[1] as int),
commonName: (row[2] as String),
createdAt: (row[3] as DateTime),
updatedAt: (row[4] as DateTime));
}
@override
Future<Fruit> getById(String id) async {
var r = await connection.query(
'SELECT id, tree_id, common_name, created_at, updated_at FROM "fruits" WHERE id = @id LIMIT 1;',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<Fruit> deleteById(String id) async {
var r = await connection.query(
'DELETE FROM "fruits" WHERE id = @id RETURNING "id", "tree_id", "common_name", "created_at", "updated_at";',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<List<Fruit>> getAll() async {
var r = await connection.query(
'SELECT id, tree_id, common_name, created_at, updated_at FROM "fruits";');
return r.map(parseRow).toList();
}
@override
Future<Fruit> createFruit(Fruit model) async {
model = model.copyWith(
createdAt: new DateTime.now(), updatedAt: new DateTime.now());
var r = await connection.query(
'INSERT INTO "fruits" ( "id", "tree_id", "common_name", "created_at", "updated_at") VALUES (@id,@treeId,@commonName,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "tree_id", "common_name", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'treeId': model.treeId,
'commonName': model.commonName,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
@override
Future<Fruit> updateFruit(Fruit model) async {
model = model.copyWith(updatedAt: new DateTime.now());
var r = await connection.query(
'UPDATE "fruits" SET ( "id", "tree_id", "common_name", "created_at", "updated_at") = (@id,@treeId,@commonName,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "tree_id", "common_name", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'treeId': model.treeId,
'commonName': model.commonName,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
FruitQuery query() {
return null;
}
}

View file

@ -14,4 +14,4 @@ class _Leg extends Model {
Foot foot;
String name;
}
}

View file

@ -14,7 +14,7 @@ class Leg extends _Leg {
final String id;
@override
final dynamic foot;
final Foot foot;
@override
final String name;
@ -27,7 +27,7 @@ class Leg extends _Leg {
Leg copyWith(
{String id,
dynamic foot,
Foot foot,
String name,
DateTime createdAt,
DateTime updatedAt}) {

View file

@ -1,7 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
// Error: Cannot infer SQL column type for field "foot" with type "Foot".

View file

@ -1,7 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
// Error: Cannot infer SQL column type for field "foot" with type "Foot".

View file

@ -10,7 +10,9 @@ abstract class LegSerializer {
static Leg fromMap(Map map) {
return new Leg(
id: map['id'] as String,
foot: map['foot'] as dynamic,
foot: map['foot'] != null
? FootSerializer.fromMap(map['foot'] as Map)
: null,
name: map['name'] as String,
createdAt: map['created_at'] != null
? (map['created_at'] is DateTime
@ -30,7 +32,7 @@ abstract class LegSerializer {
}
return {
'id': model.id,
'foot': model.foot,
'foot': FootSerializer.toMap(model.foot),
'name': model.name,
'created_at': model.createdAt?.toIso8601String(),
'updated_at': model.updatedAt?.toIso8601String()

View file

@ -17,32 +17,25 @@ class OrderQuery extends Query<Order, OrderQueryWhere> {
@override
get fields {
return const [
'id',
'customerId',
'employeeId',
'orderDate',
'shipperId',
'createdAt',
'updatedAt'
];
return OrderFields.allFields;
}
@override
deserialize(List row) {
return new Order(
id: (row[0] as String),
customerId: (row[0] as int),
employeeId: (row[0] as int),
orderDate: (row[0] as DateTime),
shipperId: (row[0] as int),
createdAt: (row[0] as DateTime),
updatedAt: (row[0] as DateTime));
id: row[0].toString(),
customerId: (row[1] as int),
employeeId: (row[2] as int),
orderDate: (row[3] as DateTime),
shipperId: (row[4] as int),
createdAt: (row[5] as DateTime),
updatedAt: (row[6] as DateTime));
}
}
class OrderQueryWhere extends QueryWhere {
final StringSqlExpressionBuilder id = new StringSqlExpressionBuilder('id');
final NumericSqlExpressionBuilder<int> id =
new NumericSqlExpressionBuilder<int>('id');
final NumericSqlExpressionBuilder<int> customerId =
new NumericSqlExpressionBuilder<int>('customer_id');

View file

@ -1,24 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
import 'dart:async';
import 'order.dart';
import 'package:postgres/postgres.dart';
part 'order.postgresql.orm.g.dart';
abstract class OrderOrm {
factory OrderOrm.postgreSql(PostgreSQLConnection connection) =
PostgreSqlOrderOrm;
Future<List<Order>> getAll();
Future<Order> getById(String id);
Future<Order> deleteById(String id);
Future<Order> createOrder(Order model);
Future<Order> updateOrder(Order model);
OrderQuery query();
}
class OrderQuery {}

View file

@ -1,86 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
part of 'order.orm.g.dart';
class PostgreSqlOrderOrm implements OrderOrm {
PostgreSqlOrderOrm(this.connection);
final PostgreSQLConnection connection;
static Order parseRow(List row) {
return new Order(
id: (row[0] as String),
customerId: (row[1] as int),
employeeId: (row[2] as int),
orderDate: (row[3] as DateTime),
shipperId: (row[4] as int),
createdAt: (row[5] as DateTime),
updatedAt: (row[6] as DateTime));
}
@override
Future<Order> getById(String id) async {
var r = await connection.query(
'SELECT id, customer_id, employee_id, order_date, shipper_id, created_at, updated_at FROM "orders" WHERE id = @id LIMIT 1;',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<Order> deleteById(String id) async {
var r = await connection.query(
'DELETE FROM "orders" WHERE id = @id RETURNING "id", "customer_id", "employee_id", "order_date", "shipper_id", "created_at", "updated_at";',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<List<Order>> getAll() async {
var r = await connection.query(
'SELECT id, customer_id, employee_id, order_date, shipper_id, created_at, updated_at FROM "orders";');
return r.map(parseRow).toList();
}
@override
Future<Order> createOrder(Order model) async {
model = model.copyWith(
createdAt: new DateTime.now(), updatedAt: new DateTime.now());
var r = await connection.query(
'INSERT INTO "orders" ( "id", "customer_id", "employee_id", "order_date", "shipper_id", "created_at", "updated_at") VALUES (@id,@customerId,@employeeId,CAST (@orderDate AS timestamp),@shipperId,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "customer_id", "employee_id", "order_date", "shipper_id", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'customerId': model.customerId,
'employeeId': model.employeeId,
'orderDate': model.orderDate,
'shipperId': model.shipperId,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
@override
Future<Order> updateOrder(Order model) async {
model = model.copyWith(updatedAt: new DateTime.now());
var r = await connection.query(
'UPDATE "orders" SET ( "id", "customer_id", "employee_id", "order_date", "shipper_id", "created_at", "updated_at") = (@id,@customerId,@employeeId,CAST (@orderDate AS timestamp),@shipperId,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "customer_id", "employee_id", "order_date", "shipper_id", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'customerId': model.customerId,
'employeeId': model.employeeId,
'orderDate': model.orderDate,
'shipperId': model.shipperId,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
OrderQuery query() {
return null;
}
}

View file

@ -10,4 +10,4 @@ part 'role.serializer.g.dart';
@orm
class _Role extends Model {
String name;
}
}

View file

@ -17,21 +17,22 @@ class RoleQuery extends Query<Role, RoleQueryWhere> {
@override
get fields {
return const ['id', 'name', 'createdAt', 'updatedAt'];
return RoleFields.allFields;
}
@override
deserialize(List row) {
return new Role(
id: (row[0] as String),
name: (row[0] as String),
createdAt: (row[0] as DateTime),
updatedAt: (row[0] as DateTime));
id: row[0].toString(),
name: (row[1] as String),
createdAt: (row[2] as DateTime),
updatedAt: (row[3] as DateTime));
}
}
class RoleQueryWhere extends QueryWhere {
final StringSqlExpressionBuilder id = new StringSqlExpressionBuilder('id');
final NumericSqlExpressionBuilder<int> id =
new NumericSqlExpressionBuilder<int>('id');
final StringSqlExpressionBuilder name =
new StringSqlExpressionBuilder('name');

View file

@ -1,24 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
import 'dart:async';
import 'package:postgres/postgres.dart';
import 'role.dart';
part 'role.postgresql.orm.g.dart';
abstract class RoleOrm {
factory RoleOrm.postgreSql(PostgreSQLConnection connection) =
PostgreSqlRoleOrm;
Future<List<Role>> getAll();
Future<Role> getById(String id);
Future<Role> deleteById(String id);
Future<Role> createRole(Role model);
Future<Role> updateRole(Role model);
RoleQuery query();
}
class RoleQuery {}

View file

@ -1,77 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
part of 'role.orm.g.dart';
class PostgreSqlRoleOrm implements RoleOrm {
PostgreSqlRoleOrm(this.connection);
final PostgreSQLConnection connection;
static Role parseRow(List row) {
return new Role(
id: (row[0] as String),
name: (row[1] as String),
createdAt: (row[2] as DateTime),
updatedAt: (row[3] as DateTime));
}
@override
Future<Role> getById(String id) async {
var r = await connection.query(
'SELECT id, name, created_at, updated_at FROM "roles" WHERE id = @id LIMIT 1;',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<Role> deleteById(String id) async {
var r = await connection.query(
'DELETE FROM "roles" WHERE id = @id RETURNING "id", "name", "created_at", "updated_at";',
substitutionValues: {'id': int.parse(id)});
return parseRow(r.first);
}
@override
Future<List<Role>> getAll() async {
var r = await connection
.query('SELECT id, name, created_at, updated_at FROM "roles";');
return r.map(parseRow).toList();
}
@override
Future<Role> createRole(Role model) async {
model = model.copyWith(
createdAt: new DateTime.now(), updatedAt: new DateTime.now());
var r = await connection.query(
'INSERT INTO "roles" ( "id", "name", "created_at", "updated_at") VALUES (@id,@name,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "name", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'name': model.name,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
@override
Future<Role> updateRole(Role model) async {
model = model.copyWith(updatedAt: new DateTime.now());
var r = await connection.query(
'UPDATE "roles" SET ( "id", "name", "created_at", "updated_at") = (@id,@name,CAST (@createdAt AS timestamp),CAST (@updatedAt AS timestamp)) RETURNING "id", "name", "created_at", "updated_at";',
substitutionValues: {
'id': model.id,
'name': model.name,
'createdAt': model.createdAt,
'updatedAt': model.updatedAt
});
return parseRow(r.first);
}
RoleQuery query() {
return null;
}
}

View file

@ -9,11 +9,7 @@ part of angel_orm_generator.test.models.tree;
@generatedSerializable
class Tree extends _Tree {
Tree(
{this.id,
this.rings,
List<dynamic> fruits,
this.createdAt,
this.updatedAt})
{this.id, this.rings, List<Fruit> fruits, this.createdAt, this.updatedAt})
: this.fruits = new List.unmodifiable(fruits ?? []);
@override
@ -23,7 +19,7 @@ class Tree extends _Tree {
final int rings;
@override
final List<dynamic> fruits;
final List<Fruit> fruits;
@override
final DateTime createdAt;
@ -34,7 +30,7 @@ class Tree extends _Tree {
Tree copyWith(
{String id,
int rings,
List<dynamic> fruits,
List<Fruit> fruits,
DateTime createdAt,
DateTime updatedAt}) {
return new Tree(
@ -49,7 +45,7 @@ class Tree extends _Tree {
return other is _Tree &&
other.id == id &&
other.rings == rings &&
const ListEquality<dynamic>(const DefaultEquality())
const ListEquality<Fruit>(const DefaultEquality<Fruit>())
.equals(other.fruits, fruits) &&
other.createdAt == createdAt &&
other.updatedAt == updatedAt;

View file

@ -1,7 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
// Error: Cannot infer SQL column type for field "fruits" with type "List".

View file

@ -1,7 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
// Error: Cannot infer SQL column type for field "fruits" with type "List".

View file

@ -11,7 +11,11 @@ abstract class TreeSerializer {
return new Tree(
id: map['id'] as String,
rings: map['rings'] as int,
fruits: map['fruits'] as List<dynamic>,
fruits: map['fruits'] is Iterable
? new List.unmodifiable(((map['fruits'] as Iterable)
.where((x) => x is Map) as Iterable<Map>)
.map(FruitSerializer.fromMap))
: null,
createdAt: map['created_at'] != null
? (map['created_at'] is DateTime
? (map['created_at'] as DateTime)
@ -31,7 +35,7 @@ abstract class TreeSerializer {
return {
'id': model.id,
'rings': model.rings,
'fruits': model.fruits,
'fruits': model.fruits?.map((m) => m.toJson())?.toList(),
'created_at': model.createdAt?.toIso8601String(),
'updated_at': model.updatedAt?.toIso8601String()
};

View file

@ -3,6 +3,7 @@ library angel_orm_generator.test.models.user;
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 'role.dart';
part 'user.g.dart';
part 'user.serializer.g.dart';
@ -14,4 +15,4 @@ class _User extends Model {
@belongsToMany
List<Role> roles;
}
}

View file

@ -13,7 +13,7 @@ class User extends _User {
this.username,
this.password,
this.email,
List<dynamic> roles,
List<Role> roles,
this.createdAt,
this.updatedAt})
: this.roles = new List.unmodifiable(roles ?? []);
@ -31,7 +31,7 @@ class User extends _User {
final String email;
@override
final List<dynamic> roles;
final List<Role> roles;
@override
final DateTime createdAt;
@ -44,7 +44,7 @@ class User extends _User {
String username,
String password,
String email,
List<dynamic> roles,
List<Role> roles,
DateTime createdAt,
DateTime updatedAt}) {
return new User(
@ -63,7 +63,7 @@ class User extends _User {
other.username == username &&
other.password == password &&
other.email == email &&
const ListEquality<dynamic>(const DefaultEquality())
const ListEquality<Role>(const DefaultEquality<Role>())
.equals(other.roles, roles) &&
other.createdAt == createdAt &&
other.updatedAt == updatedAt;

View file

@ -1,7 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// OrmGenerator
// **************************************************************************
// Error: Cannot infer SQL column type for field "roles" with type "List".

View file

@ -1,7 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// PostgreSqlOrmGenerator
// **************************************************************************
// Error: Cannot infer SQL column type for field "roles" with type "List".

View file

@ -13,7 +13,11 @@ abstract class UserSerializer {
username: map['username'] as String,
password: map['password'] as String,
email: map['email'] as String,
roles: map['roles'] as List<dynamic>,
roles: map['roles'] is Iterable
? new List.unmodifiable(((map['roles'] as Iterable)
.where((x) => x is Map) as Iterable<Map>)
.map(RoleSerializer.fromMap))
: null,
createdAt: map['created_at'] != null
? (map['created_at'] is DateTime
? (map['created_at'] as DateTime)
@ -35,7 +39,7 @@ abstract class UserSerializer {
'username': model.username,
'password': model.password,
'email': model.email,
'roles': model.roles,
'roles': model.roles?.map((m) => m.toJson())?.toList(),
'created_at': model.createdAt?.toIso8601String(),
'updated_at': model.updatedAt?.toIso8601String()
};

View file

@ -2,7 +2,6 @@
library angel_orm_generator.test.car_test;
import 'package:angel_orm/angel_orm.dart';
import 'package:postgres/postgres.dart';
import 'package:test/test.dart';
import 'models/car.dart';
import 'common.dart';
@ -44,7 +43,7 @@ main() {
});
group('queries', () {
PostgreSQLConnection connection;
PostgresExecutor connection;
setUp(() async {
connection = await connectToPostgres(['car']);
@ -52,7 +51,7 @@ main() {
group('selects', () {
test('select all', () async {
var cars = await CarQuery.getAll(connection);
var cars = await new CarQuery().get(connection);
expect(cars, []);
});
@ -66,6 +65,8 @@ main() {
familyFriendly: false);
});
tearDown(() => connection.close());
test('where clause is applied', () async {
var query = new CarQuery()..where.familyFriendly.equals(true);
var cars = await query.get(connection);
@ -113,23 +114,29 @@ main() {
});
test('get one', () async {
var car = await CarQuery.getOne(int.parse(ferrari.id), connection);
expect(car.toJson(), ferrari.toJson());
var id = int.parse(ferrari.id);
var query = new CarQuery()..where.id.equals(id);
var car = await query.getOne(connection);
expect(car, ferrari);
});
test('delete one', () async {
var car = await CarQuery.deleteOne(int.parse(ferrari.id), connection);
var id = int.parse(ferrari.id);
var query = new CarQuery()..where.id.equals(id);
var car = await query.deleteOne(connection);
expect(car.toJson(), ferrari.toJson());
var cars = await CarQuery.getAll(connection);
var cars = await new CarQuery().get(connection);
expect(cars, isEmpty);
});
test('delete stream', () async {
var query = new CarQuery()..where.make.equals('Ferrari');
query.or(new CarQueryWhere()..familyFriendly.equals(true));
print(query.compile('DELETE FROM "cars"'));
var cars = await query.delete(connection);
var query = new CarQuery()
..where.make.equals('Ferrari')
..orWhere((w) => w.familyFriendly.equals(true));
print(query.compile(preamble: 'DELETE FROM "cars"'));
var cars = await query.get(connection);
expect(cars, hasLength(1));
expect(cars.first.toJson(), ferrari.toJson());
});