ref<T extends Object> method
Makes a column from the subquery available to the outer select statement.
For instance, consider a complex column like subqueryContentLength
being
added into a subquery:
final subqueryContentLength = todoEntries.content.length.sum();
final subquery = Subquery(
db.selectOnly(todoEntries)
..addColumns([todoEntries.category, subqueryContentLength])
..groupBy([todoEntries.category]),
's');
When the subqueryContentLength
column gets written, drift will write
the actual SUM()
expression which is only valid in the subquery itself.
When an outer query joining the subqery wants to read the column, it needs
to refer to that expression by name. This is what ref is doing:
final readableLength = subquery.ref(subqueryContentLength);
final query = selectOnly(categories)
..addColumns([categories.id, readableLength])
..join([
innerJoin(subquery,
subquery.ref(db.todosTable.category).equalsExp(db.categories.id))
]);
Here, ref is called two times: Once to obtain a column selected by the outer query and once as a join condition.
ref needs to be used every time a column from a subquery is used in an outer query, regardless of the context.
Implementation
Expression<T> ref<T extends Object>(Expression<T> inner) {
final name = select._nameForColumn(inner);
if (name == null) {
throw ArgumentError(
'The source select statement does not contain that column');
}
return columnsByName[name]!.dartCast();
}