From 9241bbccc1f81e219a71130794fc0896f7b04d9c Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Sat, 8 Jun 2019 15:04:49 +0200 Subject: [PATCH] Better integration of floating-point values --- moor/lib/src/dsl/columns.dart | 3 ++- .../lib/src/runtime/expressions/comparable.dart | 5 ++++- moor/lib/src/runtime/expressions/variables.dart | 2 +- moor/lib/src/runtime/structure/columns.dart | 17 ++++++++++++----- moor/lib/src/types/sql_types.dart | 4 ++-- moor/test/data/tables/todos.g.dart | 16 ++++++++-------- moor/test/insert_test.dart | 12 ++++++++++++ .../lib/src/model/specified_column.dart | 2 +- 8 files changed, 42 insertions(+), 19 deletions(-) diff --git a/moor/lib/src/dsl/columns.dart b/moor/lib/src/dsl/columns.dart index a10131ee..017222b7 100644 --- a/moor/lib/src/dsl/columns.dart +++ b/moor/lib/src/dsl/columns.dart @@ -28,7 +28,8 @@ abstract class DateTimeColumn extends Column {} abstract class BlobColumn extends Column {} /// A column that stores floating point numeric values. -abstract class RealColumn extends Column {} +abstract class RealColumn extends Column + implements DoubleExpression {} /// A column builder is used to specify which columns should appear in a table. /// All of the methods defined in this class and its subclasses are not meant to diff --git a/moor/lib/src/runtime/expressions/comparable.dart b/moor/lib/src/runtime/expressions/comparable.dart index 32bb84a8..281020dd 100644 --- a/moor/lib/src/runtime/expressions/comparable.dart +++ b/moor/lib/src/runtime/expressions/comparable.dart @@ -2,7 +2,10 @@ import 'package:moor/moor.dart'; import 'expression.dart'; abstract class IntExpression extends Expression - with ComparableExpr {} + implements ComparableExpr {} + +abstract class DoubleExpression extends Expression + implements ComparableExpr {} mixin ComparableExpr> on Expression { /// Returns an expression that is true if this expression is strictly bigger diff --git a/moor/lib/src/runtime/expressions/variables.dart b/moor/lib/src/runtime/expressions/variables.dart index 815ec93d..67139af9 100644 --- a/moor/lib/src/runtime/expressions/variables.dart +++ b/moor/lib/src/runtime/expressions/variables.dart @@ -37,7 +37,7 @@ class Variable> extends Expression { } /// Creates a variable that holds the specified floating point value. - static Variable withReal(num value) { + static Variable withReal(double value) { return Variable(value); } diff --git a/moor/lib/src/runtime/structure/columns.dart b/moor/lib/src/runtime/structure/columns.dart index c638f45e..4cd7ea1d 100644 --- a/moor/lib/src/runtime/structure/columns.dart +++ b/moor/lib/src/runtime/structure/columns.dart @@ -193,18 +193,25 @@ class GeneratedDateTimeColumn extends GeneratedColumn class GeneratedBlobColumn extends GeneratedColumn implements BlobColumn { GeneratedBlobColumn(String $name, String tableName, bool $nullable, - {String $customConstraints}) + {String $customConstraints, Expression defaultValue}) : super($name, tableName, $nullable, - $customConstraints: $customConstraints); + $customConstraints: $customConstraints, defaultValue: defaultValue); @override final String typeName = 'BLOB'; } -class GeneratedRealColumn extends GeneratedColumn +class GeneratedRealColumn extends GeneratedColumn + with ComparableExpr implements RealColumn { - GeneratedRealColumn(String $name, String tableName, bool $nullable) - : super($name, tableName, $nullable); + GeneratedRealColumn( + String $name, + String tableName, + bool $nullable, { + Expression defaultValue, + String $customConstraints, + }) : super($name, tableName, $nullable, + defaultValue: defaultValue, $customConstraints: $customConstraints); @override String get typeName => 'REAL'; diff --git a/moor/lib/src/types/sql_types.dart b/moor/lib/src/types/sql_types.dart index 1eb973df..dd838c89 100644 --- a/moor/lib/src/types/sql_types.dart +++ b/moor/lib/src/types/sql_types.dart @@ -112,11 +112,11 @@ class BlobType extends SqlType { mapToSqlVariable(content) => content; } -class RealType extends SqlType { +class RealType extends SqlType { const RealType(); @override - num mapFromDatabaseResponse(response) => response as num; + double mapFromDatabaseResponse(response) => (response as num).toDouble(); @override String mapToSqlConstant(num content) => content.toString(); diff --git a/moor/test/data/tables/todos.g.dart b/moor/test/data/tables/todos.g.dart index 23a202f3..54a9973f 100644 --- a/moor/test/data/tables/todos.g.dart +++ b/moor/test/data/tables/todos.g.dart @@ -625,26 +625,26 @@ class $SharedTodosTable extends SharedTodos class TableWithoutPKData extends DataClass { final int notReallyAnId; - final num someFloat; + final double someFloat; TableWithoutPKData({this.notReallyAnId, this.someFloat}); factory TableWithoutPKData.fromData( Map data, GeneratedDatabase db, {String prefix}) { final effectivePrefix = prefix ?? ''; final intType = db.typeSystem.forDartType(); - final numType = db.typeSystem.forDartType(); + final doubleType = db.typeSystem.forDartType(); return TableWithoutPKData( notReallyAnId: intType .mapFromDatabaseResponse(data['${effectivePrefix}not_really_an_id']), - someFloat: - numType.mapFromDatabaseResponse(data['${effectivePrefix}some_float']), + someFloat: doubleType + .mapFromDatabaseResponse(data['${effectivePrefix}some_float']), ); } factory TableWithoutPKData.fromJson(Map json, {ValueSerializer serializer = const ValueSerializer.defaults()}) { return TableWithoutPKData( notReallyAnId: serializer.fromJson(json['notReallyAnId']), - someFloat: serializer.fromJson(json['someFloat']), + someFloat: serializer.fromJson(json['someFloat']), ); } @override @@ -652,11 +652,11 @@ class TableWithoutPKData extends DataClass { {ValueSerializer serializer = const ValueSerializer.defaults()}) { return { 'notReallyAnId': serializer.toJson(notReallyAnId), - 'someFloat': serializer.toJson(someFloat), + 'someFloat': serializer.toJson(someFloat), }; } - TableWithoutPKData copyWith({int notReallyAnId, num someFloat}) => + TableWithoutPKData copyWith({int notReallyAnId, double someFloat}) => TableWithoutPKData( notReallyAnId: notReallyAnId ?? this.notReallyAnId, someFloat: someFloat ?? this.someFloat, @@ -737,7 +737,7 @@ class $TableWithoutPKTable extends TableWithoutPK map['not_really_an_id'] = Variable(d.notReallyAnId); } if (d.someFloat != null || includeNulls) { - map['some_float'] = Variable(d.someFloat); + map['some_float'] = Variable(d.someFloat); } return map; } diff --git a/moor/test/insert_test.dart b/moor/test/insert_test.dart index c2d27d68..9618925c 100644 --- a/moor/test/insert_test.dart +++ b/moor/test/insert_test.dart @@ -24,6 +24,18 @@ void main() { ['Implement insert statements'])); }); + test('can insert floating point values', () async { + // regression test for https://github.com/simolus3/moor/issues/30 + await db + .into(db.tableWithoutPK) + .insert(TableWithoutPKData(notReallyAnId: 42, someFloat: 3.1415)); + + verify(executor.runInsert( + 'INSERT INTO table_without_p_k ' + '(not_really_an_id, some_float) VALUES (?, ?)', + [42, 3.1415])); + }); + test('generates insert or replace statements', () async { await db.into(db.todosTable).insert( TodoEntry( diff --git a/moor_generator/lib/src/model/specified_column.dart b/moor_generator/lib/src/model/specified_column.dart index e564d7ac..52dc5e43 100644 --- a/moor_generator/lib/src/model/specified_column.dart +++ b/moor_generator/lib/src/model/specified_column.dart @@ -76,7 +76,7 @@ class SpecifiedColumn { ColumnType.integer: 'int', ColumnType.datetime: 'DateTime', ColumnType.blob: 'Uint8List', - ColumnType.real: 'num', + ColumnType.real: 'double', }[type]; /// The column type from the dsl library. For instance, if a table has