mirror of https://github.com/AMT-Cheif/drift.git
Move joiner into composer ceuz
Non-modular generation can't do imports
This commit is contained in:
parent
c383a9d173
commit
4373489724
|
@ -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;
|
|
||||||
}
|
|
|
@ -22,4 +22,50 @@ sealed class Composer<DB extends GeneratedDatabase, CT extends Table> {
|
||||||
final CT $table;
|
final CT $table;
|
||||||
|
|
||||||
Composer(this.$db, this.$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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,10 +101,7 @@ class _ReferencedFilterWriter extends _FilterWriter {
|
||||||
..write(" $filterName(")
|
..write(" $filterName(")
|
||||||
..writeDriftRef("ComposableFilter")
|
..writeDriftRef("ComposableFilter")
|
||||||
..writeln(" Function( $referencedFilterComposer f) f) {")
|
..writeln(" Function( $referencedFilterComposer f) f) {")
|
||||||
..write("return ")
|
..write("return \$composeWithJoins(")
|
||||||
..writeUriRef(
|
|
||||||
Uri.parse('package:drift/internal/manager.dart'), 'composeWithJoins')
|
|
||||||
..writeln('(')
|
|
||||||
..writeln("\$db: \$db,")
|
..writeln("\$db: \$db,")
|
||||||
..writeln("\$table: \$table,")
|
..writeln("\$table: \$table,")
|
||||||
..writeln("referencedTable: $referencedTableField,")
|
..writeln("referencedTable: $referencedTableField,")
|
||||||
|
@ -186,10 +183,7 @@ class _ReferencedOrderingWriter extends _OrderingWriter {
|
||||||
..write(" $orderingName(")
|
..write(" $orderingName(")
|
||||||
..writeDriftRef("ComposableOrdering")
|
..writeDriftRef("ComposableOrdering")
|
||||||
..writeln(" Function( $referencedOrderingComposer o) o) {")
|
..writeln(" Function( $referencedOrderingComposer o) o) {")
|
||||||
..write("return ")
|
..write("return \$composeWithJoins(")
|
||||||
..writeUriRef(
|
|
||||||
Uri.parse('package:drift/internal/manager.dart'), 'composeWithJoins')
|
|
||||||
..writeln('(')
|
|
||||||
..writeln("\$db: \$db,")
|
..writeln("\$db: \$db,")
|
||||||
..writeln("\$table: \$table,")
|
..writeln("\$table: \$table,")
|
||||||
..writeln("referencedTable: $referencedTableField,")
|
..writeln("referencedTable: $referencedTableField,")
|
||||||
|
|
Loading…
Reference in New Issue