pub fn normalize_query(query: &str) -> String {
linkrs_metrics::aggregated_stats::normalize_query_text(query)
}
pub fn generate_query_fingerprint(query: &str) -> String {
let normalized = normalize_query(query);
const FNV_OFFSET_BASIS: u64 = 0xcbf29ce484222325;
const FNV_PRIME: u64 = 0x100000001b3;
let mut hash = FNV_OFFSET_BASIS;
for byte in normalized.bytes() {
hash ^= byte as u64;
hash = hash.wrapping_mul(FNV_PRIME);
}
format!("{:016x}", hash)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_normalize_query() {
let query1 = "SELECT * FROM users WHERE age > 25 AND name = 'John'";
let normalized1 = normalize_query(query1);
assert!(normalized1.contains("?"));
assert!(normalized1.starts_with("select * from users where"));
let query2 = " SELECT id FROM t WHERE x = 100 ";
let normalized2 = normalize_query(query2);
assert!(normalized2.contains("?"));
assert!(normalized2.starts_with("select id from t where"));
}
#[test]
fn test_normalize_query_with_escaped_quotes() {
let query = "SELECT * FROM t WHERE name = 'O''Brien'";
let normalized = normalize_query(query);
assert!(normalized.contains("?"));
assert!(normalized.starts_with("select * from t where"));
}
#[test]
fn test_generate_query_fingerprint() {
let query1 = "SELECT * FROM users WHERE id = 1";
let query2 = "SELECT * FROM users WHERE id = 2";
let fp1 = generate_query_fingerprint(query1);
let fp2 = generate_query_fingerprint(query2);
assert_eq!(fp1, fp2);
let query3 = "SELECT * FROM orders WHERE id = 1";
let fp3 = generate_query_fingerprint(query3);
assert_ne!(fp1, fp3);
}
}