deleteWhere method
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
}