From 9f48d49cb32ad15b015914d2df46071dd8c32b44 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Sun, 23 Oct 2022 17:36:28 +0200 Subject: [PATCH] Read primary key in drift files --- drift/test/generated/custom_tables.g.dart | 10 ++++---- .../lib/src/analysis/resolver/dart/table.dart | 2 +- .../src/analysis/resolver/drift/table.dart | 16 +++++++++++++ drift_dev/lib/src/analysis/results/table.dart | 22 +++++++++++------- drift_dev/lib/src/analysis/serializer.dart | 23 +++++++++---------- 5 files changed, 46 insertions(+), 27 deletions(-) diff --git a/drift/test/generated/custom_tables.g.dart b/drift/test/generated/custom_tables.g.dart index a02f1d9f..770e45bb 100644 --- a/drift/test/generated/custom_tables.g.dart +++ b/drift/test/generated/custom_tables.g.dart @@ -853,11 +853,11 @@ class MytableCompanion extends UpdateCompanion { this.somedate = const Value.absent(), }); MytableCompanion.insert({ - required int someid, + this.someid = const Value.absent(), this.sometext = const Value.absent(), this.isInserting = const Value.absent(), this.somedate = const Value.absent(), - }) : someid = Value(someid); + }); static Insertable custom({ Expression? someid, Expression? sometext, @@ -923,7 +923,7 @@ class $MytableTable extends Table with TableInfo<$MytableTable, MytableData> { final VerificationMeta _someidMeta = const VerificationMeta('someid'); late final GeneratedColumn someid = GeneratedColumn( 'someid', aliasedName, false, - type: DriftSqlType.int, requiredDuringInsert: true); + type: DriftSqlType.int, requiredDuringInsert: false); final VerificationMeta _sometextMeta = const VerificationMeta('sometext'); late final GeneratedColumn sometext = GeneratedColumn( 'sometext', aliasedName, true, @@ -954,8 +954,6 @@ class $MytableTable extends Table with TableInfo<$MytableTable, MytableData> { if (data.containsKey('someid')) { context.handle(_someidMeta, someid.isAcceptableOrUnknown(data['someid']!, _someidMeta)); - } else if (isInserting) { - context.missing(_someidMeta); } if (data.containsKey('sometext')) { context.handle(_sometextMeta, @@ -976,7 +974,7 @@ class $MytableTable extends Table with TableInfo<$MytableTable, MytableData> { } @override - Set get $primaryKey => const {}; + Set get $primaryKey => {someid}; @override MytableData map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; diff --git a/drift_dev/lib/src/analysis/resolver/dart/table.dart b/drift_dev/lib/src/analysis/resolver/dart/table.dart index 2ff8b75c..739d0a47 100644 --- a/drift_dev/lib/src/analysis/resolver/dart/table.dart +++ b/drift_dev/lib/src/analysis/resolver/dart/table.dart @@ -56,8 +56,8 @@ class DartTableResolver extends LocalElementResolver { existingRowClass: dataClassInfo.existingClass, customParentClass: dataClassInfo.extending, baseDartName: element.name, - primaryKeyFromTableConstraint: primaryKey, tableConstraints: [ + if (primaryKey != null) PrimaryKeyColumns(primaryKey), for (final uniqueKey in uniqueKeys ?? const >[]) UniqueColumns(uniqueKey), ], diff --git a/drift_dev/lib/src/analysis/resolver/drift/table.dart b/drift_dev/lib/src/analysis/resolver/drift/table.dart index 83f1668d..8bc9ef60 100644 --- a/drift_dev/lib/src/analysis/resolver/drift/table.dart +++ b/drift_dev/lib/src/analysis/resolver/drift/table.dart @@ -176,6 +176,22 @@ class DriftTableResolver extends LocalElementResolver { onDelete: constraint.clause.onDelete, )); } + } else if (constraint is KeyClause) { + final keyColumns = {}; + + for (final keyColumn in constraint.columns) { + final expression = keyColumn.expression; + if (expression is Reference) { + keyColumns.add(columns + .firstWhere((e) => e.nameInSql == expression.columnName)); + } + } + + if (constraint.isPrimaryKey) { + tableConstraints.add(PrimaryKeyColumns(keyColumns)); + } else { + tableConstraints.add(UniqueColumns(keyColumns)); + } } } } else if (stmt is CreateVirtualTableStatement) { diff --git a/drift_dev/lib/src/analysis/results/table.dart b/drift_dev/lib/src/analysis/results/table.dart index b004d052..a954c44e 100644 --- a/drift_dev/lib/src/analysis/results/table.dart +++ b/drift_dev/lib/src/analysis/results/table.dart @@ -1,3 +1,4 @@ +import 'package:collection/collection.dart'; import 'package:drift/drift.dart' show DriftSqlType; import 'package:json_annotation/json_annotation.dart'; import 'package:sqlparser/sqlparser.dart' as sql; @@ -16,8 +17,6 @@ class DriftTable extends DriftElementWithResultSet { final List tableConstraints; - final Set? primaryKeyFromTableConstraint; - @override final List references; @@ -69,7 +68,6 @@ class DriftTable extends DriftElementWithResultSet { this.fixedEntityInfoName, this.withoutRowId = false, this.strict = false, - this.primaryKeyFromTableConstraint, this.tableConstraints = const [], this.virtualTableData, this.writeDefaultConstraints = true, @@ -83,12 +81,14 @@ class DriftTable extends DriftElementWithResultSet { @override String get dbGetterName => DriftSchemaElement.dbFieldName(baseDartName); - /// The primary key for this table, computed by looking at the - /// [primaryKeyFromTableConstraint] and primary key constraints applied to - /// individiual columns. + /// The primary key for this table, computed by looking at the primary key + /// defined as a table constraint or as a column constraint. Set get fullPrimaryKey { - if (primaryKeyFromTableConstraint != null) { - return primaryKeyFromTableConstraint!; + final fromTable = + tableConstraints.whereType().firstOrNull; + + if (fromTable != null) { + return fromTable.primaryKey; } return columns @@ -149,6 +149,12 @@ class UniqueColumns extends DriftTableConstraint { UniqueColumns(this.uniqueSet); } +class PrimaryKeyColumns extends DriftTableConstraint { + final Set primaryKey; + + PrimaryKeyColumns(this.primaryKey); +} + class ForeignKeyTable extends DriftTableConstraint { final List localColumns; final DriftTable otherTable; diff --git a/drift_dev/lib/src/analysis/serializer.dart b/drift_dev/lib/src/analysis/serializer.dart index 233e39fd..be04950e 100644 --- a/drift_dev/lib/src/analysis/serializer.dart +++ b/drift_dev/lib/src/analysis/serializer.dart @@ -27,9 +27,6 @@ class ElementSerializer { for (final column in element.columns) _serializeColumn(column), ], 'existing_data_class': element.existingRowClass?.toJson(), - 'primary_key_table_constraint': element.primaryKeyFromTableConstraint - ?.map((e) => e.nameInSql) - .toList(), 'table_constraints': [ for (final constraint in element.tableConstraints) _serializeTableConstraint(constraint), @@ -203,6 +200,13 @@ class ElementSerializer { 'type': 'unique', 'columns': [for (final column in constraint.uniqueSet) column.nameInSql] }; + } else if (constraint is PrimaryKeyColumns) { + return { + 'type': 'primary_key', + 'columns': [ + for (final column in constraint.primaryKey) column.nameInSql, + ], + }; } else if (constraint is ForeignKeyTable) { return { 'type': 'foreign', @@ -411,14 +415,6 @@ class ElementDeserializer { for (final column in columns) column.nameInSql: column, }; - Set? primaryKeyFromTableConstraint; - final serializedPk = json['primary_key_table_constraint']; - if (serializedPk != null) { - primaryKeyFromTableConstraint = { - for (final entry in serializedPk) columnByName[entry]!, - }; - } - return DriftTable( id, declaration, @@ -427,7 +423,6 @@ class ElementDeserializer { existingRowClass: json['existing_data_class'] != null ? ExistingRowClass.fromJson(json['existing_data_class'] as Map) : null, - primaryKeyFromTableConstraint: primaryKeyFromTableConstraint, tableConstraints: [ for (final constraint in json['table_constraints']) await _readTableConstraint(constraint as Map, columnByName), @@ -667,6 +662,10 @@ class ElementDeserializer { return UniqueColumns({ for (final ref in json['columns']) localColumns[ref]!, }); + case 'primary_key': + return PrimaryKeyColumns( + {for (final ref in json['columns']) localColumns[ref]!}, + ); case 'foreign': return ForeignKeyTable( localColumns: [