Skip to content

Commit c88f17a

Browse files
authored
feat: add delete_node_by_prams filter (#810)
1 parent 9dba332 commit c88f17a

File tree

1 file changed

+42
-78
lines changed

1 file changed

+42
-78
lines changed

src/memos/graph_dbs/polardb.py

Lines changed: 42 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)