generate method
Implementation
List<String> generate(QueryableModel model) {
final root = model.root;
final infos = model.classInfos;
final className = root.className;
if (root.aggregateInfo case final agg?) {
return [
_companion(
className: className,
extendsClause: 'MappedQuery<$className>',
members: [
aggregateQueryEmitter.emit(className: className, info: agg),
],
),
];
}
bool hasRelations(String cls) =>
(infos[cls]?.ownEdges ?? const <RelationEdge>[]).isNotEmpty;
final members = <String>[];
final String extendsClause;
List<String> accClasses = const [];
if (root.hasManyEdges.isNotEmpty) {
extendsClause = 'FoldMappedQuery<$className>';
members.add(
hasManyQueryEmitter.emit(root: root, classInfos: infos),
);
} else if (root.ownEdges.isNotEmpty) {
extendsClause = 'MappedQuery<$className>';
List<RelationEdge> edgesOf(String cls) =>
infos[cls]?.ownEdges ?? const <RelationEdge>[];
final treeNodes = RelationTreeBuilder(edgesOf).unrollRoots(root.ownEdges);
final seedBudget =
root.ownEdges.map((e) => e.depth).reduce((a, b) => a > b ? a : b);
members.add(
queryGetterEmitter.emit(
className: className,
tableMarker: root.tableMarker,
seedBudget: seedBudget,
treeNodes: treeNodes,
),
);
} else {
extendsClause = 'MappedQuery<$className>';
members.add(
selectQueryEmitter.emit(
className: className,
tableMarker: root.tableMarker,
columnArgs: root.columnArgs,
),
);
}
members.add(
readerEmitter.emit(
className: className,
tableMarker: root.tableMarker,
columnArgs: root.columnArgs,
relationArgs: relationCalls.forReader(root.ownEdges, hasRelations),
),
);
members.add(
' /// Reusable row mapper: `from(t).mapWith(${className}Query.mapper)`.\n'
' static const mapper = RowMapper<$className>(fromRow);\n',
);
if (root.hasManyEdges.isNotEmpty) {
final foldCode = hasManyFoldEmitter.emit(root: root, classInfos: infos);
members.add(foldCode.foldMember);
accClasses = foldCode.accClasses;
}
return [
_companion(
className: className,
extendsClause: extendsClause,
members: members,
),
...accClasses,
];
}