
    (<i                        U d Z ddlmZ ddlZddlmZ ddlmZ  ee      Z	dZ
dZdZd	Zd
ZdZdZe
eeeeeegZded<    G d d      Zy)u  
utils/session_store_search.py — FTS5 메시지 전문 검색 및 스키마 DDL

SessionStore가 사용하는 SQLite 스키마 DDL 상수와
FTS5 기반 전문 검색 믹스인을 제공한다.

Usage:
    from utils.session_store_search import SCHEMA_DDL, SearchMixin
    )annotationsN)Any)
get_loggera   
CREATE TABLE IF NOT EXISTS sessions (
    session_id       TEXT PRIMARY KEY,
    source           TEXT NOT NULL,
    model            TEXT,
    parent_session_id TEXT,
    title            TEXT,
    created_at       TEXT NOT NULL,
    ended_at         TEXT,
    end_reason       TEXT
);
aI  
CREATE TABLE IF NOT EXISTS messages (
    id              INTEGER PRIMARY KEY AUTOINCREMENT,
    session_id      TEXT NOT NULL REFERENCES sessions(session_id) ON DELETE CASCADE,
    role            TEXT NOT NULL,
    content         TEXT,
    tool_calls      TEXT,
    tool_call_id    TEXT,
    created_at      TEXT NOT NULL
);
zY
CREATE INDEX IF NOT EXISTS idx_messages_session_id ON messages(session_id, created_at);
zp
CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts
USING fts5(content, role, content=messages, content_rowid=id);
z
CREATE TRIGGER IF NOT EXISTS messages_ai AFTER INSERT ON messages BEGIN
    INSERT INTO messages_fts(rowid, content, role) VALUES (new.id, new.content, new.role);
END;
z
CREATE TRIGGER IF NOT EXISTS messages_ad AFTER DELETE ON messages BEGIN
    INSERT INTO messages_fts(messages_fts, rowid, content, role)
    VALUES ('delete', old.id, old.content, old.role);
END;
a   
CREATE TRIGGER IF NOT EXISTS messages_au AFTER UPDATE ON messages BEGIN
    INSERT INTO messages_fts(messages_fts, rowid, content, role)
    VALUES ('delete', old.id, old.content, old.role);
    INSERT INTO messages_fts(rowid, content, role) VALUES (new.id, new.content, new.role);
END;
z	list[str]ALL_DDLc                  N    e Zd ZU dZded<   	 	 d	 	 	 	 	 	 	 ddZ	 d		 	 	 	 	 d
dZy)SearchMixinu   FTS5 메시지 검색 기능을 SessionStore에 주입하는 믹스인.

    사용 클래스는 self._conn(sqlite3.Connection)을 제공해야 한다.
    zsqlite3.Connection_connNc                L   	 | | j                   j                  d|||f      }n| j                   j                  d||f      }|j                         D cg c]  }t        |       c}S c c}w # t        j
                  $ r"}t        j                  d|       g cY d}~S d}~ww xY w)uT  FTS5로 메시지 내용을 전문 검색한다.

        Args:
            query: FTS5 검색어 (예: ``"python AND error"``)
            session_id: 특정 세션으로 결과를 제한 (None이면 전체)
            limit: 최대 반환 개수

        Returns:
            매칭된 메시지 dict 목록 (score 내림차순)
        Na*  
                    SELECT m.*
                    FROM messages m
                    JOIN messages_fts f ON m.id = f.rowid
                    WHERE messages_fts MATCH ?
                      AND m.session_id = ?
                    ORDER BY rank
                    LIMIT ?
                    z
                    SELECT m.*
                    FROM messages m
                    JOIN messages_fts f ON m.id = f.rowid
                    WHERE messages_fts MATCH ?
                    ORDER BY rank
                    LIMIT ?
                    z&search_messages: FTS5 query failed: %sr	   executefetchalldictsqlite3OperationalErrorloggerwarning)selfquery
session_idlimitcurrowexcs          K/home/jay/workspace/.worktrees/task-2057-dev2/utils/session_store_search.pysearch_messageszSearchMixin.search_messagesi   s     	%jj(( J. jj(( EN
 *-8#DI888'' 	NNCSII	s0   AA. A)&A. )A. .B#BB#B#c                   	 | j                   j                  d||f      }|j                         D cg c]  }t        |       c}S c c}w # t        j
                  $ r"}t        j                  d|       g cY d}~S d}~ww xY w)u  메시지 내용으로 세션을 검색한다.

        Args:
            query: FTS5 검색어
            limit: 최대 반환 세션 수

        Returns:
            매칭된 session_id를 포함하는 세션 dict 목록 (중복 제거, 최신순)
        a8  
                SELECT DISTINCT s.*
                FROM sessions s
                JOIN messages m ON m.session_id = s.session_id
                JOIN messages_fts f ON m.id = f.rowid
                WHERE messages_fts MATCH ?
                ORDER BY s.created_at DESC
                LIMIT ?
                z1search_sessions_by_content: FTS5 query failed: %sNr   )r   r   r   r   r   r   s         r   search_sessions_by_contentz&SearchMixin.search_sessions_by_content   st    	**$$ C *-8#DI888'' 	NNNPSTI	s.   0A AA A BA<6B<B)N   )r   strr   z
str | Noner   intreturnlist[dict[str, Any]])
   )r   r   r   r    r!   r"   )__name__
__module____qualname____doc____annotations__r   r        r   r   r   a   si    
 
 "&	-- - 	-
 
-d   
	r*   r   )r'   
__future__r   r   typingr   utils.loggerr   r$   r   DDL_SESSIONSDDL_MESSAGESDDL_MESSAGES_INDEXDDL_FTS5DDL_FTS5_TRIGGER_INSERTDDL_FTS5_TRIGGER_DELETEDDL_FTS5_TRIGGER_UPDATEr   r(   r   r)   r*   r   <module>r5      s    #   #	H	
 
      U Ur*   