Reduce disk reads when editing documents https://github.com/siyuan-note/siyuan/issues/10961

This commit is contained in:
Daniel 2024-04-10 15:38:40 +08:00
parent 06a2f3fb5c
commit 616821a090
No known key found for this signature in database
GPG key ID: 86211BA83DF03017

View file

@ -959,59 +959,25 @@ func deleteByBoxTx(tx *sql.Tx, box string) (err error) {
} }
func deleteBlocksByIDs(tx *sql.Tx, ids []string) (err error) { func deleteBlocksByIDs(tx *sql.Tx, ids []string) (err error) {
placeholders := strings.Repeat("?,", len(ids))
placeholders = placeholders[:len(placeholders)-1]
stmt := "DELETE FROM blocks WHERE id IN (" + placeholders + ")"
args := make([]interface{}, len(ids))
for i, id := range ids {
args[i] = id
}
if err = execStmtTx(tx, stmt, args...); nil != err {
return
}
var ftsIDs []string var ftsIDs []string
for _, id := range ids { for _, id := range ids {
removeBlockCache(id) removeBlockCache(id)
ftsIDs = append(ftsIDs, "\""+id+"\"") ftsIDs = append(ftsIDs, "\""+id+"\"")
} }
stmt = "SELECT ROWID FROM blocks_fts WHERE blocks_fts MATCH 'id:(" + strings.Join(ftsIDs, " OR ") + ")'"
rows, err := tx.Query(stmt) stmt := "DELETE FROM blocks WHERE id IN (" + strings.Join(ftsIDs, ",") + ")"
if nil != err { if err = execStmtTx(tx, stmt); nil != err {
logging.LogErrorf("query blocks_fts failed: %s", err)
return return
} }
var rowIDs []string
for rows.Next() { ftsIDsMatch := strings.Join(ftsIDs, " OR ")
var rowID int stmt = "DELETE FROM blocks_fts WHERE rowid IN (SELECT ROWID FROM blocks_fts WHERE blocks_fts MATCH 'id:(" + ftsIDsMatch + ")')"
if err = rows.Scan(&rowID); nil != err {
return
}
rowIDs = append(rowIDs, fmt.Sprintf("%d", rowID))
}
rows.Close()
stmt = "DELETE FROM blocks_fts WHERE rowid IN (" + strings.Join(rowIDs, ",") + ")"
if err = execStmtTx(tx, stmt); nil != err { if err = execStmtTx(tx, stmt); nil != err {
return return
} }
if !caseSensitive { if !caseSensitive {
stmt = "SELECT ROWID FROM blocks_fts_case_insensitive WHERE blocks_fts_case_insensitive MATCH 'id:(" + strings.Join(ftsIDs, " OR ") + ")'" stmt = "DELETE FROM blocks_fts_case_insensitive WHERE rowid IN (SELECT ROWID FROM blocks_fts_case_insensitive WHERE blocks_fts_case_insensitive MATCH 'id:(" + ftsIDsMatch + ")')"
rows, err = tx.Query(stmt)
if nil != err {
logging.LogErrorf("query blocks_fts_case_insensitive failed: %s", err)
return
}
rowIDs = nil
for rows.Next() {
var rowID int
if err = rows.Scan(&rowID); nil != err {
return
}
rowIDs = append(rowIDs, fmt.Sprintf("%d", rowID))
}
rows.Close()
stmt = "DELETE FROM blocks_fts_case_insensitive WHERE rowid IN (" + strings.Join(rowIDs, ",") + ")"
if err = execStmtTx(tx, stmt); nil != err { if err = execStmtTx(tx, stmt); nil != err {
return return
} }