#ifndef CLASS_MYSQL_FTS_H #define CLASS_MYSQL_FTS_H #ifdef PROXYSQLGENAI #include "sqlite3db.h" #include #include // Forward declaration class MySQL_Tool_Handler; /** * @brief MySQL Full Text Search (FTS) for Fast Data Discovery * * This class manages a dedicated SQLite database that provides: * - Full-text search indexes for MySQL tables * - Fast data discovery before querying the actual MySQL database * - Cross-table search capabilities * - BM25 ranking with FTS5 * * The FTS system serves as a fast local cache for AI agents to quickly * find relevant data before making targeted queries to MySQL backend. */ class MySQL_FTS { private: SQLite3DB* db; std::string db_path; /** * @brief Initialize FTS schema * @return 0 on success, -1 on error */ int init_schema(); /** * @brief Create FTS metadata tables * @return 0 on success, -1 on error */ int create_tables(); /** * @brief Create per-index tables (data and FTS5 virtual table) * @param schema Schema name * @param table Table name * @return 0 on success, -1 on error */ int create_index_tables(const std::string& schema, const std::string& table); /** * @brief Get sanitized data table name for a schema.table * @param schema Schema name * @param table Table name * @return Sanitized table name */ std::string get_data_table_name(const std::string& schema, const std::string& table); /** * @brief Get FTS search table name for a schema.table * @param schema Schema name * @param table Table name * @return Sanitized FTS table name */ std::string get_fts_table_name(const std::string& schema, const std::string& table); /** * @brief Sanitize a name for use as SQLite table name * @param name Name to sanitize * @return Sanitized name */ std::string sanitize_name(const std::string& name); /** * @brief Escape single quotes for SQL * @param str String to escape * @return Escaped string */ std::string escape_sql(const std::string& str); /** * @brief Escape identifier for SQLite (double backticks) * @param identifier Identifier to escape * @return Escaped identifier */ std::string escape_identifier(const std::string& identifier); public: /** * @brief Constructor * @param path Path to the FTS database file */ MySQL_FTS(const std::string& path); // Prevent copy and move (class owns raw pointer) MySQL_FTS(const MySQL_FTS&) = delete; MySQL_FTS& operator=(const MySQL_FTS&) = delete; MySQL_FTS(MySQL_FTS&&) = delete; MySQL_FTS& operator=(MySQL_FTS&&) = delete; /** * @brief Destructor */ ~MySQL_FTS(); /** * @brief Initialize the FTS database * @return 0 on success, -1 on error */ int init(); /** * @brief Close the FTS database */ void close(); /** * @brief Check if an index exists for a schema.table * @param schema Schema name * @param table Table name * @return true if exists, false otherwise */ bool index_exists(const std::string& schema, const std::string& table); /** * @brief Create and populate an FTS index for a MySQL table * * @param schema Schema name * @param table Table name * @param columns JSON array of column names to index * @param primary_key Primary key column name * @param where_clause Optional WHERE clause for filtering * @param mysql_handler Pointer to MySQL_Tool_Handler for executing queries * @return JSON result with success status and metadata */ std::string index_table( const std::string& schema, const std::string& table, const std::string& columns, const std::string& primary_key, const std::string& where_clause, MySQL_Tool_Handler* mysql_handler ); /** * @brief Search indexed data using FTS5 * * @param query FTS5 search query * @param schema Optional schema filter * @param table Optional table filter * @param limit Max results (default 100) * @param offset Pagination offset (default 0) * @return JSON result with matches and snippets */ std::string search( const std::string& query, const std::string& schema = "", const std::string& table = "", int limit = 100, int offset = 0 ); /** * @brief List all FTS indexes with metadata * @return JSON array of indexes */ std::string list_indexes(); /** * @brief Remove an FTS index * * @param schema Schema name * @param table Table name * @return JSON result */ std::string delete_index(const std::string& schema, const std::string& table); /** * @brief Refresh an index with fresh data (full rebuild) * * @param schema Schema name * @param table Table name * @param mysql_handler Pointer to MySQL_Tool_Handler for executing queries * @return JSON result */ std::string reindex( const std::string& schema, const std::string& table, MySQL_Tool_Handler* mysql_handler ); /** * @brief Rebuild ALL FTS indexes with fresh data * * @param mysql_handler Pointer to MySQL_Tool_Handler for executing queries * @return JSON result with summary */ std::string rebuild_all(MySQL_Tool_Handler* mysql_handler); /** * @brief Get database handle for direct access * @return SQLite3DB pointer */ SQLite3DB* get_db() { return db; } }; #endif /* PROXYSQLGENAI */ #endif /* CLASS_MYSQL_FTS_H */