deleteWhere method

Future<void> deleteWhere(
  1. String query
)

Deleta registros usando uma string de consulta (ex: "id=10" ou "status=inativo")

Implementation

Future<void> deleteWhere(String query) async {
  final regExp = RegExp(r"(\w+)\s*(=|!=|>|<)\s*(.+)");
  final match = regExp.firstMatch(query);

  if (match == null) {
    throw Exception("Formato de query inválido. Use 'coluna=valor'.");
  }

  final field = match.group(1);
  final operator = match.group(2);
  final value = match
      .group(3)
      ?.replaceAll("'", "")
      .replaceAll('"', '')
      .trim();

  final rows = await getRawRows(forceRefresh: true);
  if (rows.isEmpty) return;

  final headers = List<String>.from(rows[0]);
  int colIndex = headers.indexOf(field!);

  if (colIndex == -1) {
    throw Exception("Coluna '$field' não encontrada na planilha.");
  }

  List<int> indicesToDelete = [];

  for (var i = 1; i < rows.length; i++) {
    if (rows[i].length <= colIndex) continue;

    final cellValue = rows[i][colIndex].toString();
    bool shouldDelete = false;

    switch (operator) {
      case '=':
        shouldDelete = (cellValue == value);
        break;
      case '!=':
        shouldDelete = (cellValue != value);
        break;
    }

    if (shouldDelete) {
      indicesToDelete.add(i);
    }
  }

  if (indicesToDelete.isEmpty) return;

  final gid = await getGid();

  // Pega os índices da cascata de todas as tabelas afetadas
  final deletedIds = indicesToDelete
      .map((idx) => rows[idx][0].toString())
      .toList();
  final cascadeIndices = await GoogleSheetsDatabase()
      .buildCascadeDeleteIndices(sheetName, deletedIds);

  // Adiciona os índices da tabela atual no mapa de deleção
  cascadeIndices.putIfAbsent(gid, () => {}).addAll(indicesToDelete);

  // Constrói os requests finais
  final List<sheets.Request> requests = [];
  cascadeIndices.forEach((sheetId, indices) {
    // Ordena de forma decrescente para não quebrar a ordem de deleção no Sheets
    final sortedIndices = indices.toList()..sort((a, b) => b.compareTo(a));
    for (final index in sortedIndices) {
      requests.add(
        sheets.Request(
          deleteDimension: sheets.DeleteDimensionRequest(
            range: sheets.DimensionRange(
              sheetId: sheetId,
              dimension: "ROWS",
              startIndex: index,
              endIndex: index + 1,
            ),
          ),
        ),
      );
    }
  });

  await api.spreadsheets.batchUpdate(
    sheets.BatchUpdateSpreadsheetRequest(requests: requests),
    spreadsheetId,
  );

  // Como a deleção pode ter apagado a linha 2 (que contém as fórmulas ARRAYFORMULA),
  // nós reaplicamos as fórmulas para garantir que a planilha continue funcionando.
  await GoogleSheetsDatabase().reapplyFormulas();

  _cachedRawRows = null; // Invalida o cache local
}