This commit is contained in:
Moshe Dicker 2024-04-02 14:52:42 -04:00
parent f9d77b5fa2
commit d03414bd80
2 changed files with 44 additions and 43 deletions

View File

@ -39,22 +39,17 @@ class DatabaseWriter {
void write() { void write() {
final elements = input.resolvedAccessor.availableElements; final elements = input.resolvedAccessor.availableElements;
final managerWriter = ManagerWriter(scope.child(), dbClassName);
// Write data classes, companions and info classes // Write data classes, companions and info classes
if (!scope.generationOptions.isModular) { if (!scope.generationOptions.isModular) {
for (final reference in elements) { for (final reference in elements) {
if (reference is DriftTable) { if (reference is DriftTable) {
TableWriter(reference, scope.child()).writeInto(); TableWriter(reference, scope.child()).writeInto();
managerWriter.addTable(reference);
} else if (reference is DriftView) { } else if (reference is DriftView) {
ViewWriter(reference, scope.child(), this).write(); ViewWriter(reference, scope.child(), this).write();
} }
} }
} }
managerWriter.write();
// Write the database class // Write the database class
final dbScope = scope.child(); final dbScope = scope.child();
@ -153,6 +148,12 @@ class DatabaseWriter {
} }
} }
final managerWriter = ManagerWriter(scope.child(), dbScope, dbClassName);
for (var table in elements.whereType<DriftTable>()) {
managerWriter.addTable(table);
}
managerWriter.write();
firstLeaf.writeln(managerWriter.managerGetter); firstLeaf.writeln(managerWriter.managerGetter);
// Write implementation for query methods // Write implementation for query methods

View File

@ -1,7 +1,6 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first // ignore_for_file: public_member_api_docs, sort_constructors_first
import 'package:drift_dev/src/analysis/results/results.dart'; import 'package:drift_dev/src/analysis/results/results.dart';
import 'package:drift_dev/src/writer/writer.dart'; import 'package:drift_dev/src/writer/writer.dart';
import 'package:recase/recase.dart';
abstract class _Filter { abstract class _Filter {
final String filterName; final String filterName;
@ -60,13 +59,13 @@ class _ReferencedFilter extends _Filter {
void writeFilter(TextEmitter leaf, bool isModular) { void writeFilter(TextEmitter leaf, bool isModular) {
final String referencedTableGetter = isModular final String referencedTableGetter = isModular
? "state.db.resultSet<${referencedTable.tableClassName}>('${referencedTable.table.schemaName}')" ? "state.db.resultSet<${referencedTable.tableClassName}>('${referencedTable.table.schemaName}')"
: "state.db.${referencedTable.tableGetterName}"; : "state.db.${referencedTable.table.dbGetterName}";
leaf leaf
..writeDriftRef("ComposableFilter") ..writeDriftRef("ComposableFilter")
..write(" $filterName(") ..write(" $filterName(")
..writeDriftRef("ComposableFilter") ..writeDriftRef("ComposableFilter")
..writeln(" Function( ${referencedTable.filterComposer} f) f) {") ..writeln(" Function( ${referencedTable.filterComposer} f) f) {")
..writeln(''' ..write('''
return referenced( return referenced(
referencedTable: $referencedTableGetter, referencedTable: $referencedTableGetter,
getCurrentColumn: (f) => f.$fieldGetter, getCurrentColumn: (f) => f.$fieldGetter,
@ -111,7 +110,7 @@ class _ReferencedOrdering extends _Ordering {
void writeOrdering(TextEmitter leaf, bool isModular) { void writeOrdering(TextEmitter leaf, bool isModular) {
final String referencedTableGetter = isModular final String referencedTableGetter = isModular
? "state.db.resultSet<${referencedTable.tableClassName}>('${referencedTable.table.schemaName}')" ? "state.db.resultSet<${referencedTable.tableClassName}>('${referencedTable.table.schemaName}')"
: "state.db.${referencedTable.tableGetterName}"; : "state.db.${referencedTable.table.dbGetterName}";
leaf leaf
..writeDriftRef("ComposableOrdering") ..writeDriftRef("ComposableOrdering")
@ -144,7 +143,10 @@ class _TableNames {
final DriftTable table; final DriftTable table;
/// Generation Scope /// Generation Scope
final Scope _scope; final Scope scope;
/// Generation Scope for the entire database
final Scope dbScope;
/// The name of the filter composer class /// The name of the filter composer class
/// ///
@ -176,38 +178,34 @@ class _TableNames {
/// E.G `UserTableManager` /// E.G `UserTableManager`
final String rootTableManager; final String rootTableManager;
/// Name of the table class that will be generated
///
/// E.G `$CategoriesTable`
final String tableClassName;
/// Name of the getter for the table
///
/// E.G `categories`
final String tableGetterName;
/// Name of the typedef for the insertCompanionBuilder /// Name of the typedef for the insertCompanionBuilder
/// ///
/// E.G. `insertCompanionBuilder` /// E.G. `insertCompanionBuilder`
final String insertCompanionBuilderTypeDefName; final String insertCompanionBuilderTypeDefName;
/// Table class name, this may be different from the entity name
/// if modular generation is enabled
/// E.G. `i5.$CategoriesTable`
String get tableClassName {
return dbScope.dartCode(dbScope.entityInfoType(table));
}
String get rowClassName {
return dbScope.dartCode(dbScope.writer.rowType(table));
}
/// Name of the arguments for the updateCompanionBuilder /// Name of the arguments for the updateCompanionBuilder
/// ///
/// E.G. `updateCompanionBuilderTypeDef` /// E.G. `updateCompanionBuilderTypeDef`
final String updateCompanionBuilderTypeDefName; final String updateCompanionBuilderTypeDefName;
/// Name of the class that cooresponds to a table row
///
/// E.G `Category`
final String rowClassName;
/// Columns with their names, filters and orderings /// Columns with their names, filters and orderings
final List<_ColumnNames> columns; final List<_ColumnNames> columns;
/// Filters for back references /// Filters for back references
final List<_ReferencedFilter> backRefFilters; final List<_ReferencedFilter> backRefFilters;
_TableNames(this.table, this._scope) _TableNames(this.table, this.scope, this.dbScope)
: filterComposer = '\$${table.entityInfoName}FilterComposer', : filterComposer = '\$${table.entityInfoName}FilterComposer',
orderingComposer = '\$${table.entityInfoName}OrderingComposer', orderingComposer = '\$${table.entityInfoName}OrderingComposer',
processedTableManager = processedTableManager =
@ -221,9 +219,6 @@ class _TableNames {
'\$${table.entityInfoName}InsertCompanionBuilder', '\$${table.entityInfoName}InsertCompanionBuilder',
updateCompanionBuilderTypeDefName = updateCompanionBuilderTypeDefName =
'\$${table.entityInfoName}UpdateCompanionBuilder', '\$${table.entityInfoName}UpdateCompanionBuilder',
rowClassName = table.nameOfRowClass,
tableClassName = table.entityInfoName,
tableGetterName = table.dbGetterName,
backRefFilters = [], backRefFilters = [],
columns = []; columns = [];
@ -236,11 +231,11 @@ class _TableNames {
..writeln('$filterComposer(super.db, super.table);'); ..writeln('$filterComposer(super.db, super.table);');
for (var c in columns) { for (var c in columns) {
for (var f in c.filters) { for (var f in c.filters) {
f.writeFilter(leaf, _scope.generationOptions.isModular); f.writeFilter(leaf, scope.generationOptions.isModular);
} }
} }
for (var f in backRefFilters) { for (var f in backRefFilters) {
f.writeFilter(leaf, _scope.generationOptions.isModular); f.writeFilter(leaf, scope.generationOptions.isModular);
} }
leaf.writeln('}'); leaf.writeln('}');
} }
@ -254,18 +249,19 @@ class _TableNames {
..writeln('$orderingComposer(super.db, super.table);'); ..writeln('$orderingComposer(super.db, super.table);');
for (var c in columns) { for (var c in columns) {
for (var o in c.orderings) { for (var o in c.orderings) {
o.writeOrdering(leaf, _scope.generationOptions.isModular); o.writeOrdering(leaf, scope.generationOptions.isModular);
} }
} }
leaf.writeln('}'); leaf.writeln('}');
} }
void _writeProcessedTableManager(TextEmitter leaf, String dbClassName) { void _writeProcessedTableManager(TextEmitter leaf, String dbClassName) {
print(table.entityInfoName);
leaf leaf
..write('class $processedTableManager extends ') ..write('class $processedTableManager extends ')
..writeDriftRef('ProcessedTableManager') ..writeDriftRef('ProcessedTableManager')
..writeln( ..writeln(
'<$dbClassName,$tableClassName,$rowClassName,$filterComposer,$orderingComposer,$processedTableManager,$insertCompanionBuilderTypeDefName,$updateCompanionBuilderTypeDefName> {') '<$dbClassName,${tableClassName},${rowClassName},$filterComposer,$orderingComposer,$processedTableManager,$insertCompanionBuilderTypeDefName,$updateCompanionBuilderTypeDefName> {')
..writeln('const $processedTableManager(super.state);') ..writeln('const $processedTableManager(super.state);')
..writeln('}'); ..writeln('}');
} }
@ -365,7 +361,8 @@ class _TableNames {
?.otherColumn; ?.otherColumn;
final referencedTable = referencedCol?.owner; final referencedTable = referencedCol?.owner;
if (referencedCol != null && referencedTable is DriftTable) { if (referencedCol != null && referencedTable is DriftTable) {
final referencedTableNames = _TableNames(referencedTable, _scope); final referencedTableNames =
_TableNames(referencedTable, scope, dbScope);
final referencedColumnNames = final referencedColumnNames =
_ColumnNames(referencedCol.nameInDart, [], []); _ColumnNames(referencedCol.nameInDart, [], []);
c.filters.add(_ReferencedFilter(c.fieldGetter, "${c.fieldGetter}Ref", c.filters.add(_ReferencedFilter(c.fieldGetter, "${c.fieldGetter}Ref",
@ -379,10 +376,10 @@ class _TableNames {
columns.add(c); columns.add(c);
} }
for (var otherTable in tables) { for (var otherTable in tables) {
final otherTableNames = _TableNames(otherTable, _scope); final otherTableNames = _TableNames(otherTable, scope, dbScope);
/// We are adding backrefs now, skip the current table /// We are adding backrefs now, skip the current table
if (otherTableNames.tableClassName == tableClassName) { if (otherTableNames.table.entityInfoName == table.entityInfoName) {
continue; continue;
} }
for (var otherColumn in otherTable.columns) { for (var otherColumn in otherTable.columns) {
@ -392,15 +389,17 @@ class _TableNames {
?.otherColumn; ?.otherColumn;
final referencedTable = referencedCol?.owner; final referencedTable = referencedCol?.owner;
if (referencedCol != null && referencedTable is DriftTable) { if (referencedCol != null && referencedTable is DriftTable) {
final referencedTableNames = _TableNames(referencedTable, _scope); final referencedTableNames =
_TableNames(referencedTable, scope, dbScope);
final referencedColumnNames = final referencedColumnNames =
_ColumnNames(referencedCol.nameInDart, [], []); _ColumnNames(referencedCol.nameInDart, [], []);
// If we are referencing the current table, add a back ref // If we are referencing the current table, add a back ref
if (referencedTableNames.tableClassName == tableClassName) { if (referencedTableNames.table.entityInfoName ==
table.entityInfoName) {
backRefFilters.add(_ReferencedFilter( backRefFilters.add(_ReferencedFilter(
referencedColumnNames.fieldGetter, referencedColumnNames.fieldGetter,
"${otherTableNames.tableClassName.camelCase}Refs", "${otherTableNames.table.dbGetterName}Refs",
otherTableNames, otherTableNames,
referencedColumnNames)); referencedColumnNames));
} }
@ -442,15 +441,16 @@ class _TableNames {
class ManagerWriter { class ManagerWriter {
final Scope _scope; final Scope _scope;
final Scope _dbScope;
final String _dbClassName; final String _dbClassName;
late final List<DriftTable> _addedTables; late final List<DriftTable> _addedTables;
ManagerWriter(this._scope, this._dbClassName) { ManagerWriter(this._scope, this._dbScope, this._dbClassName) {
_addedTables = []; _addedTables = [];
} }
String get managerGetter { String get managerGetter {
return '''$_dbMangerName get managers => $_dbMangerName(this);'''; return '$_dbMangerName get managers => $_dbMangerName(this);';
} }
void addTable(DriftTable table) { void addTable(DriftTable table) {
@ -463,7 +463,7 @@ class ManagerWriter {
final leaf = _scope.leaf(); final leaf = _scope.leaf();
final tableNames = <_TableNames>[]; final tableNames = <_TableNames>[];
for (var table in _addedTables) { for (var table in _addedTables) {
final t = _TableNames(table, _scope); final t = _TableNames(table, _scope, _dbScope);
t.addFiltersAndOrderings(_addedTables, leaf); t.addFiltersAndOrderings(_addedTables, leaf);
tableNames.add(t); tableNames.add(t);
} }
@ -477,7 +477,7 @@ class ManagerWriter {
? _scope.drift("GeneratedDatabase") ? _scope.drift("GeneratedDatabase")
: _dbClassName); : _dbClassName);
tableManagerGetters.writeln( tableManagerGetters.writeln(
"${table.rootTableManager} get ${table.tableGetterName} => ${table.rootTableManager}(_db, _db.${table.tableGetterName});"); "${table.rootTableManager} get ${table.table.dbGetterName} => ${table.rootTableManager}(_db, _db.${table.table.dbGetterName});");
} }
leaf.write(""" leaf.write("""