4646executor = ThreadPoolExecutor (max_workers = 200 )
4747
4848dynamic_ds_types = [1 , 3 ]
49-
49+ dynamic_subsql_prefix = 'select * from sqlbot_dynamic_temp_table_'
5050
5151class LLMService :
5252 ds : CoreDatasource
@@ -615,12 +615,17 @@ def generate_with_sub_sql(self, sql, sub_mappings: list):
615615 def generate_assistant_dynamic_sql (self , sql , tables : List ):
616616 ds : AssistantOutDsSchema = self .ds
617617 sub_query = []
618+ result_dict = {}
618619 for table in ds .tables :
619620 if table .name in tables and table .sql :
620- sub_query .append ({"table" : table .name , "query" : table .sql })
621+ #sub_query.append({"table": table.name, "query": table.sql})
622+ result_dict [table .name ] = table .sql
623+ sub_query .append ({"table" : table .name , "query" : f'{ dynamic_subsql_prefix } { table .name } ' })
621624 if not sub_query :
622625 return None
623- return self .generate_with_sub_sql (sql = sql , sub_mappings = sub_query )
626+ temp_sql_text = self .generate_with_sub_sql (sql = sql , sub_mappings = sub_query )
627+ result_dict ['sqlbot_temp_sql_text' ] = temp_sql_text
628+ return result_dict
624629
625630 def build_table_filter (self , sql : str , filters : list ):
626631 filter = json .dumps (filters , ensure_ascii = False )
@@ -983,27 +988,27 @@ def run_task(self, in_chat: bool = True):
983988 chart_type = self .get_chart_type_from_sql_answer (full_sql_text )
984989
985990 use_dynamic_ds : bool = self .current_assistant and self .current_assistant .type in dynamic_ds_types
986-
991+ is_page_embedded : bool = self .current_assistant and self .current_assistant .type == 4
992+ dynamic_sql_result = None
993+ sqlbot_temp_sql_text = None
994+ assistant_dynamic_sql = None
987995 # todo row permission
988- if (not self .current_assistant and is_normal_user (self .current_user )) or use_dynamic_ds :
996+ if (( not self .current_assistant or is_page_embedded ) and is_normal_user (self .current_user )) or use_dynamic_ds :
989997 sql , tables = self .check_sql (res = full_sql_text )
990998 sql_result = None
991- dynamic_sql_result = None
992- if self . current_assistant :
999+
1000+ if use_dynamic_ds :
9931001 dynamic_sql_result = self .generate_assistant_dynamic_sql (sql , tables )
994- if dynamic_sql_result :
995- SQLBotLogUtil .info (dynamic_sql_result )
996- sql , * _ = self .check_sql (res = dynamic_sql_result )
997-
998- sql_result = self .generate_assistant_filter (sql , tables )
1002+ sqlbot_temp_sql_text = dynamic_sql_result .get ('sqlbot_temp_sql_text' ) if dynamic_sql_result else None
1003+ #sql_result = self.generate_assistant_filter(sql, tables)
9991004 else :
10001005 sql_result = self .generate_filter (sql , tables ) # maybe no sql and tables
10011006
10021007 if sql_result :
10031008 SQLBotLogUtil .info (sql_result )
10041009 sql = self .check_save_sql (res = sql_result )
1005- elif dynamic_sql_result :
1006- sql = self .check_save_sql (res = dynamic_sql_result )
1010+ elif dynamic_sql_result and sqlbot_temp_sql_text :
1011+ assistant_dynamic_sql = self .check_save_sql (res = sqlbot_temp_sql_text )
10071012 else :
10081013 sql = self .check_save_sql (res = full_sql_text )
10091014 else :
@@ -1017,7 +1022,14 @@ def run_task(self, in_chat: bool = True):
10171022 yield f'```sql\n { format_sql } \n ```\n \n '
10181023
10191024 # execute sql
1020- result = self .execute_sql (sql = sql )
1025+ real_execute_sql = sql
1026+ if sqlbot_temp_sql_text and assistant_dynamic_sql :
1027+ dynamic_sql_result .pop ('sqlbot_temp_sql_text' )
1028+ for origin_table , subsql in dynamic_sql_result .items ():
1029+ assistant_dynamic_sql = assistant_dynamic_sql .replace (f'{ dynamic_subsql_prefix } { origin_table } ' , subsql )
1030+ real_execute_sql = assistant_dynamic_sql
1031+
1032+ result = self .execute_sql (sql = real_execute_sql )
10211033 self .save_sql_data (data_obj = result )
10221034 if in_chat :
10231035 yield 'data:' + orjson .dumps ({'content' : 'execute-success' , 'type' : 'sql-data' }).decode () + '\n \n '
0 commit comments