compile method

CompiledRelations compile({
  1. required String baseModel,
  2. required String baseAlias,
  3. required Map<String, dynamic> include,
  4. List<String>? baseSelectFields,
})

Compile include directive into JOIN clauses.

baseModel - The main model being queried (e.g., 'User'). baseAlias - The alias for the base table (e.g., 't0'). include - The include map from the query. baseSelectFields - Optional list of fields to select from base model.

Returns compiled relations with JOIN clauses and aliases.

Include syntax supports selecting specific fields from relations:

include: {
  'user': true,  // Include all fields
  'domain': {
    'select': {'id': true, 'name': true}  // Only id and name
  },
  'posts': {
    'select': {'title': true},
    'include': {'author': true}  // Nested include
  }
}

Implementation

CompiledRelations compile({
  required String baseModel,
  required String baseAlias,
  required Map<String, dynamic> include,
  List<String>? baseSelectFields,
}) {
  _aliasCounter = 0;

  final joins = <String>[];
  final aliases = <String, ColumnAlias>{};
  final includedRelations = <IncludedRelation>[];

  // Add base model columns (either all or selected)
  if (baseSelectFields != null && baseSelectFields.isNotEmpty) {
    _addSelectedColumns(
      modelName: baseModel,
      tableAlias: baseAlias,
      aliases: aliases,
      selectedFields: baseSelectFields,
    );
  } else {
    _addModelColumns(
      modelName: baseModel,
      tableAlias: baseAlias,
      aliases: aliases,
    );
  }

  // Process each include
  for (final entry in include.entries) {
    final relationName = entry.key;
    final relationValue = entry.value;

    // Skip if not included
    if (relationValue == false) continue;

    final relation = _schema.getRelation(baseModel, relationName);
    if (relation == null) {
      // Unknown relation, skip
      continue;
    }

    final result = _compileRelation(
      relation: relation,
      relationName: relationName,
      parentModel: baseModel,
      parentAlias: baseAlias,
      includeValue: relationValue,
      aliases: aliases,
    );

    if (result != null) {
      joins.add(result.joinClause);
      includedRelations.add(result.includedRelation);
    }
  }

  return CompiledRelations(
    joinClauses: joins.join(' '),
    columnAliases: aliases,
    includedRelations: includedRelations,
  );
}