{
"eq" => ->(col, v) { ["#{col} = ?", v] },
"ne" => ->(col, v) { ["#{col} <> ?", v] },
"gt" => ->(col, v) { ["#{col} > ?", v] },
"gte" => ->(col, v) { ["#{col} >= ?", v] },
"lt" => ->(col, v) { ["#{col} < ?", v] },
"lte" => ->(col, v) { ["#{col} <= ?", v] },
"contains" => ->(col, v) { ["#{col} LIKE ?", "%#{v}%"] },
"startswith" => ->(col, v) { ["#{col} LIKE ?", "#{v}%"] },
"endswith" => ->(col, v) { ["#{col} LIKE ?", "%#{v}"] },
"icontains" => ->(col, v) { ["#{col} ILIKE ?", "%#{v}%"] },
"istartswith" => ->(col, v) { ["#{col} ILIKE ?", "#{v}%"] },
"iendswith" => ->(col, v) { ["#{col} ILIKE ?", "%#{v}"] },
"in" => ->(col, v) { ["#{col} IN (?)", v] },
"nin" => ->(col, v) { ["#{col} NOT IN (?)", v] },
"isnull" => ->(col, v) { v.to_s == "true" ? ["#{col} IS NULL"] : ["#{col} IS NOT NULL"] },
"range" => lambda { |col, v|
a, b = v
["#{col} BETWEEN ? AND ?", a, b]
}
}.freeze