Move joiner into composer ceuz

Non-modular generation can't do imports
This commit is contained in:
Moshe Dicker 2024-04-04 08:56:30 -04:00
parent c383a9d173
commit 4373489724
3 changed files with 48 additions and 61 deletions

View File

@ -1,53 +0,0 @@
/// Internal library used by generated managers.
///
/// This library is not part of drift's public API and should not be imported
/// manually.
library drift.internal.manager;
import 'package:drift/drift.dart';
import 'package:drift/src/runtime/manager/manager.dart';
/// Utility for creating a composer which contains the joins needed to
/// execute a query on a table that is referenced by a foreign key.
B composeWithJoins<RT extends Table, DB extends GeneratedDatabase,
CT extends Table, QC extends Composer<DB, RT>, B extends HasJoinBuilders>({
required DB $db,
required CT $table,
required GeneratedColumn Function(CT) getCurrentColumn,
required RT referencedTable,
required GeneratedColumn Function(RT) getReferencedColumn,
required B Function(QC) builder,
required QC Function(DB db, RT table) getReferencedComposer,
}) {
// The name of the alias will be created using the following logic:
// "currentTableName__currentColumnName__referencedColumnName__referencedTableName"
// This is to ensure that the alias is unique
final currentColumn = getCurrentColumn($table);
final tempReferencedColumn = getReferencedColumn(referencedTable);
final aliasName =
'${currentColumn.tableName}__${currentColumn.name}__${tempReferencedColumn.tableName}__${tempReferencedColumn.name}';
final aliasedReferencedTable =
$db.alias(referencedTable as TableInfo, aliasName);
final aliasedReferencedColumn =
getReferencedColumn(aliasedReferencedTable as RT);
// Create a join builder for the referenced table
final joinBuilder = JoinBuilder(
currentTable: $table,
currentColumn: currentColumn,
referencedTable: aliasedReferencedTable,
referencedColumn: aliasedReferencedColumn,
);
// Get the query composer for the referenced table, passing in the aliased
// table and all the join builders
final referencedComposer = getReferencedComposer($db, aliasedReferencedTable);
// Run the user provided builder with the referencedQueryComposer
// This may return a filter or ordering, but we only enforce that it's
// a HasJoinBuilders
final result = builder(referencedComposer);
result.addJoinBuilders({joinBuilder});
return result;
}

View File

@ -22,4 +22,50 @@ sealed class Composer<DB extends GeneratedDatabase, CT extends Table> {
final CT $table;
Composer(this.$db, this.$table);
/// Utility for creating a composer which contains the joins needed to
/// execute a query on a table that is referenced by a foreign key.
B $composeWithJoins<RT extends Table, QC extends Composer<DB, RT>,
B extends HasJoinBuilders>({
required DB $db,
required CT $table,
required GeneratedColumn Function(CT) getCurrentColumn,
required RT referencedTable,
required GeneratedColumn Function(RT) getReferencedColumn,
required B Function(QC) builder,
required QC Function(DB db, RT table) getReferencedComposer,
}) {
// The name of the alias will be created using the following logic:
// "currentTableName__currentColumnName__referencedColumnName__referencedTableName"
// This is to ensure that the alias is unique
final currentColumn = getCurrentColumn($table);
final tempReferencedColumn = getReferencedColumn(referencedTable);
final aliasName =
'${currentColumn.tableName}__${currentColumn.name}__${tempReferencedColumn.tableName}__${tempReferencedColumn.name}';
final aliasedReferencedTable =
$db.alias(referencedTable as TableInfo, aliasName);
final aliasedReferencedColumn =
getReferencedColumn(aliasedReferencedTable as RT);
// Create a join builder for the referenced table
final joinBuilder = JoinBuilder(
currentTable: $table,
currentColumn: currentColumn,
referencedTable: aliasedReferencedTable,
referencedColumn: aliasedReferencedColumn,
);
// Get the query composer for the referenced table, passing in the aliased
// table and all the join builders
final referencedComposer =
getReferencedComposer($db, aliasedReferencedTable);
// Run the user provided builder with the referencedQueryComposer
// This may return a filter or ordering, but we only enforce that it's
// a HasJoinBuilders
final result = builder(referencedComposer);
result.addJoinBuilders({joinBuilder});
return result;
}
}

View File

@ -101,10 +101,7 @@ class _ReferencedFilterWriter extends _FilterWriter {
..write(" $filterName(")
..writeDriftRef("ComposableFilter")
..writeln(" Function( $referencedFilterComposer f) f) {")
..write("return ")
..writeUriRef(
Uri.parse('package:drift/internal/manager.dart'), 'composeWithJoins')
..writeln('(')
..write("return \$composeWithJoins(")
..writeln("\$db: \$db,")
..writeln("\$table: \$table,")
..writeln("referencedTable: $referencedTableField,")
@ -186,10 +183,7 @@ class _ReferencedOrderingWriter extends _OrderingWriter {
..write(" $orderingName(")
..writeDriftRef("ComposableOrdering")
..writeln(" Function( $referencedOrderingComposer o) o) {")
..write("return ")
..writeUriRef(
Uri.parse('package:drift/internal/manager.dart'), 'composeWithJoins')
..writeln('(')
..write("return \$composeWithJoins(")
..writeln("\$db: \$db,")
..writeln("\$table: \$table,")
..writeln("referencedTable: $referencedTableField,")