@@ -4960,7 +4960,8 @@ def delete_node_by_prams(
49604960 If not provided, no user_name filter will be applied.
49614961 memory_ids (list[str], optional): List of memory node IDs to delete.
49624962 file_ids (list[str], optional): List of file node IDs to delete.
4963- filter (dict, optional): Filter dictionary to query matching nodes for deletion.
4963+ filter (dict, optional): Filter dictionary for metadata filtering.
4964+ Filter conditions are directly used in DELETE WHERE clause without pre-querying.
49644965
49654966 Returns:
49664967 int: Number of nodes deleted.
@@ -4980,35 +4981,14 @@ def delete_node_by_prams(
49804981 f"agtype_access_operator(VARIADIC ARRAY[properties, '\" user_name\" '::agtype]) = '\" { cube_id } \" '::agtype"
49814982 )
49824983
4983- # Query nodes by filter if provided
4984- filter_ids = set ()
4984+ # Build filter conditions using common method (no query, direct use in WHERE clause)
4985+ filter_conditions = []
49854986 if filter :
4986- # Parse filter to validate and transform field names (e.g., add "info." prefix if needed)
4987- parsed_filter = self .parse_filter (filter )
4988- if parsed_filter :
4989- # Use get_by_metadata with empty filters list and parsed filter
4990- filter_ids = set (
4991- self .get_by_metadata (
4992- filters = [],
4993- user_name = None ,
4994- filter = parsed_filter ,
4995- knowledgebase_ids = writable_cube_ids ,
4996- )
4997- )
4998- else :
4999- logger .warning (
5000- "[delete_node_by_prams] Filter parsed to None, skipping filter query"
5001- )
5002-
5003- # Combine all IDs that need to be deleted
5004- all_memory_ids = set ()
5005- if memory_ids :
5006- all_memory_ids .update (memory_ids )
5007- if filter_ids :
5008- all_memory_ids .update (filter_ids )
4987+ filter_conditions = self ._build_filter_conditions_sql (filter )
4988+ logger .info (f"[delete_node_by_prams] filter_conditions: { filter_conditions } " )
50094989
50104990 # If no conditions to delete, return 0
5011- if not all_memory_ids and not file_ids :
4991+ if not memory_ids and not file_ids and not filter_conditions :
50124992 logger .warning (
50134993 "[delete_node_by_prams] No nodes to delete (no memory_ids, file_ids, or filter provided)"
50144994 )
@@ -5019,74 +4999,58 @@ def delete_node_by_prams(
50194999 try :
50205000 conn = self ._get_connection ()
50215001 with conn .cursor () as cursor :
5022- # Process memory_ids and filter_ids (all at once, no batching)
5023- if all_memory_ids :
5024- memory_ids_list = list (all_memory_ids )
5025- logger .info (
5026- f"[delete_node_by_prams] Processing { len (memory_ids_list )} memory_ids"
5027- )
5002+ # Build WHERE conditions list
5003+ where_conditions = []
50285004
5029- # Build conditions for all memory_ids
5005+ # Add memory_ids conditions
5006+ if memory_ids :
5007+ logger .info (f"[delete_node_by_prams] Processing { len (memory_ids )} memory_ids" )
50305008 id_conditions = []
5031- for node_id in memory_ids_list :
5009+ for node_id in memory_ids :
50325010 id_conditions .append (
50335011 f"ag_catalog.agtype_access_operator(properties, '\" id\" '::agtype) = '\" { node_id } \" '::agtype"
50345012 )
5035- id_where = f"({ ' OR ' .join (id_conditions )} )"
5036-
5037- # Add user_name filter if provided
5038- if user_name_conditions :
5039- user_name_where = " OR " .join (user_name_conditions )
5040- where_clause = f"({ user_name_where } ) AND ({ id_where } )"
5041- else :
5042- where_clause = id_where
5043-
5044- # Delete directly without counting
5045- delete_query = f"""
5046- DELETE FROM "{ self .db_name } _graph"."Memory"
5047- WHERE { where_clause }
5048- """
5049- logger .info (f"[delete_node_by_prams] memory_ids delete_query: { delete_query } " )
5050-
5051- cursor .execute (delete_query )
5052- deleted_count = cursor .rowcount
5053- total_deleted_count += deleted_count
5013+ where_conditions .append (f"({ ' OR ' .join (id_conditions )} )" )
50545014
5055- logger .info (
5056- f"[delete_node_by_prams] Deleted { deleted_count } nodes by memory_ids"
5057- )
5058-
5059- # Process file_ids (all at once, no batching)
5015+ # Add file_ids conditions
50605016 if file_ids :
50615017 logger .info (f"[delete_node_by_prams] Processing { len (file_ids )} file_ids" )
5062-
5063- # Build conditions for all file_ids
50645018 file_id_conditions = []
50655019 for file_id in file_ids :
50665020 file_id_conditions .append (
50675021 f"agtype_in_operator(agtype_access_operator(VARIADIC ARRAY[properties, '\" file_ids\" '::agtype]), '\" { file_id } \" '::agtype)"
50685022 )
5069- file_id_where = f"({ ' OR ' .join (file_id_conditions )} )"
5023+ where_conditions . append ( f"({ ' OR ' .join (file_id_conditions )} )" )
50705024
5071- # Add user_name filter if provided
5072- if user_name_conditions :
5073- user_name_where = " OR " .join (user_name_conditions )
5074- where_clause = f"({ user_name_where } ) AND ({ file_id_where } )"
5075- else :
5076- where_clause = file_id_where
5025+ # Add filter conditions
5026+ if filter_conditions :
5027+ logger .info ("[delete_node_by_prams] Processing filter conditions" )
5028+ where_conditions .extend (filter_conditions )
50775029
5078- # Delete directly without counting
5079- delete_query = f"""
5080- DELETE FROM "{ self .db_name } _graph"."Memory"
5081- WHERE { where_clause }
5082- """
5083- logger .info (f"[delete_node_by_prams] file_ids delete_query: { delete_query } " )
5030+ # Add user_name filter if provided
5031+ if user_name_conditions :
5032+ user_name_where = " OR " .join (user_name_conditions )
5033+ where_conditions .append (f"({ user_name_where } )" )
5034+
5035+ # Build final WHERE clause
5036+ if not where_conditions :
5037+ logger .warning ("[delete_node_by_prams] No WHERE conditions to delete" )
5038+ return 0
50845039
5085- cursor .execute (delete_query )
5086- deleted_count = cursor .rowcount
5087- total_deleted_count += deleted_count
5040+ where_clause = " AND " .join (where_conditions )
5041+
5042+ # Delete directly without counting
5043+ delete_query = f"""
5044+ DELETE FROM "{ self .db_name } _graph"."Memory"
5045+ WHERE { where_clause }
5046+ """
5047+ logger .info (f"[delete_node_by_prams] delete_query: { delete_query } " )
5048+
5049+ cursor .execute (delete_query )
5050+ deleted_count = cursor .rowcount
5051+ total_deleted_count = deleted_count
50885052
5089- logger .info (f"[delete_node_by_prams] Deleted { deleted_count } nodes by file_ids " )
5053+ logger .info (f"[delete_node_by_prams] Deleted { deleted_count } nodes" )
50905054
50915055 elapsed_time = time .time () - batch_start_time
50925056 logger .info (
0 commit comments