
    XJh.                         d Z ddlZddlmZ ddlmZmZmZmZ ddlm	Z	 ddl
Z
e	 G d d             Ze	 G d d	             Ze	 G d
 d             Ze	 G d d             Z G d d      Zy)zb
Database models for the MAB Recommendation System.
Defines the structure of all database tables.
    N)datetime)OptionalListDictAny)	dataclassc                   ^    e Zd ZU dZeed<   eed<   eed<   eed<   dZe	ed<   de
eef   fd	Zy
)
FeedbackDBz)User interaction feedback database model.user_id
product_id
event_typesessionTactive_userreturnc                     | j                   | j                  | j                  | j                  r| j                  j	                         nd | j
                  dS )N)r   r   r   r   r   )r   r   r   r   	isoformatr   selfs    V/Users/divyeshpatel/Desktop/sahana/Recommender/recommender_rl/recommender/db/models.pyto_dictzFeedbackDB.to_dict   sB    ||////37<<t||--/T++
 	
    N)__name__
__module____qualname____doc__int__annotations__strr   r   boolr   r   r    r   r   r
   r
      s8    3LOOK
c3h 
r   r
   c                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dZe	e   ed<   dZ
e	e   ed	<   d
eeef   fdZy)ProductCatalogzProduct catalog database model.r   product_name
brand_namecategorypriceNdescription	image_urlr   c                     | j                   | j                  | j                  | j                  | j                  | j
                  | j                  dS )Nr   r#   r$   r%   r&   r'   r(   r*   r   s    r   r   zProductCatalog.to_dict+   sA    // --//ZZ++
 	
r   )r   r   r   r   r   r   r   floatr'   r   r(   r   r   r   r    r   r   r"   r"       sO    )OOML!%K#%#Ix}#	
c3h 	
r   r"   c                       e Zd ZU dZeed<   eed<   dZee   ed<   dZ	ee   ed<   dZ
ee   ed<   dZee   ed<   dZee   ed	<   d
eeef   fdZy)UserDemographicsz-User demographics and profile database model.r   nameNgenderageuser_cluster_id
created_atlast_activer   c                    | j                   | j                  | j                  | j                  | j                  | j
                  r| j
                  j                         nd | j                  r| j                  j                         dS d dS )N)r   r.   r/   r0   r1   r2   r3   )r   r.   r/   r0   r1   r2   r   r3   r   s    r   r   zUserDemographics.to_dictB   st    ||IIkk88#339=$//335d;?;K;K4++557
 	
 RV
 	
r   )r   r   r   r   r   r   r   r/   r   r0   r1   r2   r   r3   r   r   r   r    r   r   r-   r-   7   sk    7L
I FHSM C#%)OXc])%)J")&*K(#*	
c3h 	
r   r-   c                   n    e Zd ZU dZeed<   eed<   eed<   dZee   ed<   dZ	ee
   ed<   deeef   fd	Zy)
SearchHistoryz#User search history database model.r   query
session_idNr   	timestampr   c                     | j                   | j                  | j                  | j                  | j                  r| j                  j                         dS d dS )N)r   r7   r   r8   r9   )r   r7   r   r8   r9   r   r   s    r   r   zSearchHistory.to_dictW   sO    ||ZZ////7;~~113
 	

 LP
 	
r   )r   r   r   r   r   r   r   r   r   r9   r   r   r   r   r    r   r   r6   r6   N   sE    -LJO $J$$(Ix!(
c3h 
r   r6   c                   p    e Zd ZdZddefdZdej                  fdZdej                  fdZ	d Z
d	 Zd
 Zy)DatabaseManagerz7Manages SQLite database connections and initialization.db_pathc                     || _         y N)r=   )r   r=   s     r   __init__zDatabaseManager.__init__d   s	    r   r   c                 n    t        j                  | j                        }t         j                  |_        |S )z3Create a new database connection for thread safety.)sqlite3connectr=   Rowrow_factoryr   
connections     r   rC   zDatabaseManager.connectg   s&    __T\\2
!(
r   rG   c                 *    |r|j                          yy)z%Close a specific database connection.N)closerF   s     r   rI   zDatabaseManager.closem   s     r   c                 4   | j                         }|j                         }|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d	       |j                  d
       |j                  d       |j                  d       |j                  d       |j                          t	        d       y)zInitialize database tables.a8  
            CREATE TABLE IF NOT EXISTS feedback_db (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                user_id INTEGER NOT NULL,
                product_id TEXT NOT NULL,
                event_type TEXT NOT NULL,
                session DATETIME NOT NULL,
                active_user BOOLEAN DEFAULT 1,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                FOREIGN KEY (user_id) REFERENCES user_demographics (user_id),
                FOREIGN KEY (product_id) REFERENCES product_catalog (product_id)
            )
        a  
            CREATE TABLE IF NOT EXISTS product_catalog (
                product_id INTEGER PRIMARY KEY,
                product_name TEXT NOT NULL,
                brand_name TEXT NOT NULL,
                category TEXT NOT NULL,
                price REAL NOT NULL,
                description TEXT,
                image_url TEXT,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP
            )
        a  
            CREATE TABLE IF NOT EXISTS user_demographics (
                user_id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT NOT NULL,
                gender TEXT,
                age TEXT,
                user_cluster_id INTEGER,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                last_active DATETIME DEFAULT CURRENT_TIMESTAMP
            )
        a  
            CREATE TABLE IF NOT EXISTS search_history (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                user_id INTEGER NOT NULL,
                query TEXT NOT NULL,
                product_id INTEGER,
                session_id INTEGER NOT NULL,
                timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
                FOREIGN KEY (user_id) REFERENCES user_demographics (user_id),
                FOREIGN KEY (product_id) REFERENCES product_catalog (product_id)
            )
        zHCREATE INDEX IF NOT EXISTS idx_feedback_user_id ON feedback_db (user_id)zNCREATE INDEX IF NOT EXISTS idx_feedback_product_id ON feedback_db (product_id)zNCREATE INDEX IF NOT EXISTS idx_feedback_event_type ON feedback_db (event_type)zHCREATE INDEX IF NOT EXISTS idx_feedback_session ON feedback_db (session)zMCREATE INDEX IF NOT EXISTS idx_product_category ON product_catalog (category)zLCREATE INDEX IF NOT EXISTS idx_product_brand ON product_catalog (brand_name)zRCREATE INDEX IF NOT EXISTS idx_user_cluster ON user_demographics (user_cluster_id)zICREATE INDEX IF NOT EXISTS idx_search_user_id ON search_history (user_id)zOCREATE INDEX IF NOT EXISTS idx_search_session_id ON search_history (session_id)u,   ✅ Database tables initialized successfullyN)rC   cursorexecutecommitprint)r   connrK   s      r   init_databasezDatabaseManager.init_databaser   s    ||~ 	  	 	  	 	 
 
	 	  	 	abghghabfgefklbchi<=r   c                 D    | j                         | _        | j                  S r?   )rC   _current_connectionr   s    r   	__enter__zDatabaseManager.__enter__   s    #'<<> '''r   c                 T    t        | d      r| j                  | j                         y y )NrR   )hasattrrI   rR   )r   exc_typeexc_valexc_tbs       r   __exit__zDatabaseManager.__exit__   s$    4./JJt//0 0r   N)zrecommender_system.db)r   r   r   r   r   r@   rB   
ConnectionrC   rI   rP   rS   rY   r    r   r   r<   r<   a   sF    A ++  2 2 
I>V(1r   r<   )r   rB   r   typingr   r   r   r   dataclassesr   jsonr
   r"   r-   r6   r<   r    r   r   <module>r^      s   
   , , !  
 
 
$ 
 
 
, 
 
 
, 
 
 
$b1 b1r   