lethe-core-rust 0.1.1

High-performance hybrid retrieval engine combining BM25 lexical search with vector similarity using z-score fusion. Features hero configuration for optimal parity with splade baseline, gamma boosting for code/error contexts, and comprehensive chunking pipeline.
Documentation
#!/usr/bin/env python3
"""
Properly fix SQLx queries by replacing query! with query and adding .bind() calls
"""
import os
import re
from pathlib import Path

def fix_sqlx_query(content):
    """Fix SQLx query patterns"""
    
    # Pattern to match sqlx::query( ... multiline SQL ... , params...)
    pattern = r'sqlx::query\s*\(\s*r#"([^"]*)"#\s*,([^)]+)\)'
    
    def replace_query(match):
        sql = match.group(1).strip()
        params = match.group(2).strip()
        
        # Split parameters by comma
        param_list = [p.strip() for p in params.split(',') if p.strip()]
        
        # Build the replacement
        result = f'sqlx::query(\n            r#"{sql}"#\n        )'
        
        for param in param_list:
            result += f'\n        .bind({param})'
            
        return result
    
    # Also handle simpler patterns like sqlx::query("SQL", param)
    simple_pattern = r'sqlx::query\s*\(\s*"([^"]*)"[^,]*,([^)]+)\)'
    
    def replace_simple_query(match):
        sql = match.group(1).strip()
        params = match.group(2).strip()
        
        # Split parameters by comma
        param_list = [p.strip() for p in params.split(',') if p.strip()]
        
        # Build the replacement
        result = f'sqlx::query("{sql}")'
        
        for param in param_list:
            result += f'\n        .bind({param})'
            
        return result
    
    # Apply both patterns
    content = re.sub(pattern, replace_query, content, flags=re.DOTALL)
    content = re.sub(simple_pattern, replace_simple_query, content, flags=re.DOTALL)
    
    return content

def fix_file(file_path):
    """Fix a single file"""
    with open(file_path, 'r') as f:
        content = f.read()
    
    original_content = content
    fixed_content = fix_sqlx_query(content)
    
    if fixed_content != original_content:
        with open(file_path, 'w') as f:
            f.write(fixed_content)
        print(f"Fixed: {file_path}")
        return True
    return False

def main():
    print("🔧 Properly fixing SQLx query patterns...")
    
    # Find all Rust files in infrastructure crate
    rust_files = []
    for crate_dir in ['crates/infrastructure/src/repositories']:
        if os.path.exists(crate_dir):
            for root, dirs, files in os.walk(crate_dir):
                for file in files:
                    if file.endswith('.rs'):
                        rust_files.append(os.path.join(root, file))
    
    fixed_count = 0
    for file_path in rust_files:
        if fix_file(file_path):
            fixed_count += 1
    
    print(f"✅ Fixed {fixed_count} files")

if __name__ == "__main__":
    main()