generate method

List<String> generate(
  1. QueryableModel model
)

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,
  ];
}