33
44import boto3
55from botocore .exceptions import ClientError
6+ from boto3 .dynamodb .conditions import Key
67
78logger = logging .getLogger (__name__ )
89
1213
1314
1415class DynamoQueryLogEntity :
15- def __init__ (self , log_id , profile_name , user_id , session_id , sql , query , intent , log_info , time_str ):
16+ def __init__ (self , log_id , profile_name , user_id , session_id , sql , query , intent , log_info , log_type , time_str ):
1617 self .log_id = log_id
1718 self .profile_name = profile_name
1819 self .user_id = user_id
@@ -21,6 +22,7 @@ def __init__(self, log_id, profile_name, user_id, session_id, sql, query, intent
2122 self .query = query
2223 self .intent = intent
2324 self .log_info = log_info
25+ self .log_type = log_type
2426 self .time_str = time_str
2527
2628 def to_dict (self ):
@@ -34,6 +36,7 @@ def to_dict(self):
3436 'query' : self .query ,
3537 'intent' : self .intent ,
3638 'log_info' : self .log_info ,
39+ 'log_type' : self .log_type ,
3740 'time_str' : self .time_str
3841 }
3942
@@ -113,6 +116,68 @@ def add(self, entity):
113116 def update (self , entity ):
114117 self .table .put_item (Item = entity .to_dict ())
115118
116- def add_log (self , log_id , profile_name , user_id , session_id , sql , query , intent , log_info , time_str ):
117- entity = DynamoQueryLogEntity (log_id , profile_name , user_id , session_id , sql , query , intent , log_info , time_str )
119+ def add_log (self , log_id , profile_name , user_id , session_id , sql , query , intent , log_info , log_type , time_str ):
120+ entity = DynamoQueryLogEntity (log_id , profile_name , user_id , session_id , sql , query , intent , log_info , log_type , time_str )
118121 self .add (entity )
122+
123+ def get_history_by_user_profile (self , user_id , profile_name ):
124+ try :
125+ # First, we need to scan the table to find all items for the user and profile
126+ response = self .table .scan (
127+ FilterExpression = Key ('user_id' ).eq (user_id ) & Key ('profile_name' ).eq (profile_name ) & Key ('log_type' ).eq ("chat_history" )
128+ )
129+
130+ items = response ['Items' ]
131+
132+ # DynamoDB might not return all items in a single response if the data set is large
133+ while 'LastEvaluatedKey' in response :
134+ response = self .table .scan (
135+ FilterExpression = Key ('user_id' ).eq (user_id ) & Key ('profile_name' ).eq (profile_name ) & Key ('log_type' ).eq ("chat_history" ),
136+ ExclusiveStartKey = response ['LastEvaluatedKey' ]
137+ )
138+ items .extend (response ['Items' ])
139+
140+ # Sort the items by time_str to get them in chronological order
141+ sorted_items = sorted (items , key = lambda x : x ['time_str' ])
142+
143+ return sorted_items
144+
145+ except ClientError as err :
146+ logger .error (
147+ "Couldn't get history for user %s and profile %s. Here's why: %s: %s" ,
148+ user_id ,
149+ profile_name ,
150+ err .response ["Error" ]["Code" ],
151+ err .response ["Error" ]["Message" ],
152+ )
153+ return []
154+
155+ def get_all_history (self ):
156+ try :
157+ # First, we need to scan the table to find all items for the user and profile
158+ response = self .table .scan (
159+ FilterExpression = Key ('log_type' ).eq ("chat_history" )
160+ )
161+
162+ items = response ['Items' ]
163+
164+ # DynamoDB might not return all items in a single response if the data set is large
165+ while 'LastEvaluatedKey' in response :
166+ response = self .table .scan (
167+ FilterExpression = Key ('log_type' ).eq ("chat_history" ),
168+ ExclusiveStartKey = response ['LastEvaluatedKey' ]
169+ )
170+ items .extend (response ['Items' ])
171+
172+ # Sort the items by time_str to get them in chronological order
173+ sorted_items = sorted (items , key = lambda x : x ['time_str' ])
174+
175+ return sorted_items
176+
177+ except ClientError as err :
178+ logger .error (
179+ "Couldn't get history Here's why: %s: %s" ,
180+ err .response ["Error" ]["Code" ],
181+ err .response ["Error" ]["Message" ],
182+ )
183+ return []
0 commit comments