perf(app): optimize FileMetadata queries by batching lookups
Multiple services were performing individual database queries for FileMetadata when resolving missing file names/sizes. This change batches the queries using `in_()` to reduce database round trips and improve performance.
This commit is contained in:
@@ -219,13 +219,20 @@ class AppChatService:
|
|||||||
"reasoning_content": result.get("reasoning_content")
|
"reasoning_content": result.get("reasoning_content")
|
||||||
}
|
}
|
||||||
if files:
|
if files:
|
||||||
|
local_ids = [f.upload_file_id for f in files
|
||||||
|
if f.transfer_method.value == "local_file" and f.upload_file_id
|
||||||
|
and (not f.name or not f.size)]
|
||||||
|
meta_map = {}
|
||||||
|
if local_ids:
|
||||||
|
rows = self.db.query(FileMetadata).filter(
|
||||||
|
FileMetadata.id.in_(local_ids),
|
||||||
|
FileMetadata.status == "completed"
|
||||||
|
).all()
|
||||||
|
meta_map = {str(r.id): r for r in rows}
|
||||||
for f in files:
|
for f in files:
|
||||||
name, size = f.name, f.size
|
name, size = f.name, f.size
|
||||||
if f.transfer_method.value == "local_file" and f.upload_file_id and (not name or not size):
|
if f.transfer_method.value == "local_file" and f.upload_file_id and (not name or not size):
|
||||||
meta = self.db.query(FileMetadata).filter(
|
meta = meta_map.get(str(f.upload_file_id))
|
||||||
FileMetadata.id == f.upload_file_id,
|
|
||||||
FileMetadata.status == "completed"
|
|
||||||
).first()
|
|
||||||
if meta:
|
if meta:
|
||||||
name = name or meta.file_name
|
name = name or meta.file_name
|
||||||
size = size or meta.file_size
|
size = size or meta.file_size
|
||||||
@@ -521,13 +528,20 @@ class AppChatService:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if files:
|
if files:
|
||||||
|
local_ids = [f.upload_file_id for f in files
|
||||||
|
if f.transfer_method.value == "local_file" and f.upload_file_id
|
||||||
|
and (not f.name or not f.size)]
|
||||||
|
meta_map = {}
|
||||||
|
if local_ids:
|
||||||
|
rows = self.db.query(FileMetadata).filter(
|
||||||
|
FileMetadata.id.in_(local_ids),
|
||||||
|
FileMetadata.status == "completed"
|
||||||
|
).all()
|
||||||
|
meta_map = {str(r.id): r for r in rows}
|
||||||
for f in files:
|
for f in files:
|
||||||
name, size = f.name, f.size
|
name, size = f.name, f.size
|
||||||
if f.transfer_method.value == "local_file" and f.upload_file_id and (not name or not size):
|
if f.transfer_method.value == "local_file" and f.upload_file_id and (not name or not size):
|
||||||
meta = self.db.query(FileMetadata).filter(
|
meta = meta_map.get(str(f.upload_file_id))
|
||||||
FileMetadata.id == f.upload_file_id,
|
|
||||||
FileMetadata.status == "completed"
|
|
||||||
).first()
|
|
||||||
if meta:
|
if meta:
|
||||||
name = name or meta.file_name
|
name = name or meta.file_name
|
||||||
size = size or meta.file_size
|
size = size or meta.file_size
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ class AppDslService:
|
|||||||
tenant_id: uuid.UUID,
|
tenant_id: uuid.UUID,
|
||||||
warnings: list,
|
warnings: list,
|
||||||
now: datetime.datetime,
|
now: datetime.datetime,
|
||||||
) -> tuple[type(App), list]:
|
) -> tuple[App, list[str]]:
|
||||||
"""覆盖已有应用的配置,类型不一致时抛出异常"""
|
"""覆盖已有应用的配置,类型不一致时抛出异常"""
|
||||||
app = self.db.query(App).filter(
|
app = self.db.query(App).filter(
|
||||||
App.id == app_id,
|
App.id == app_id,
|
||||||
|
|||||||
@@ -1300,13 +1300,20 @@ class AgentRunService:
|
|||||||
}
|
}
|
||||||
if files:
|
if files:
|
||||||
from app.models.file_metadata_model import FileMetadata
|
from app.models.file_metadata_model import FileMetadata
|
||||||
|
local_ids = [f.upload_file_id for f in files
|
||||||
|
if f.transfer_method.value == "local_file" and f.upload_file_id
|
||||||
|
and (not f.name or not f.size)]
|
||||||
|
meta_map = {}
|
||||||
|
if local_ids:
|
||||||
|
rows = self.db.query(FileMetadata).filter(
|
||||||
|
FileMetadata.id.in_(local_ids),
|
||||||
|
FileMetadata.status == "completed"
|
||||||
|
).all()
|
||||||
|
meta_map = {str(r.id): r for r in rows}
|
||||||
for f in files:
|
for f in files:
|
||||||
name, size = f.name, f.size
|
name, size = f.name, f.size
|
||||||
if f.transfer_method.value == "local_file" and f.upload_file_id and (not name or not size):
|
if f.transfer_method.value == "local_file" and f.upload_file_id and (not name or not size):
|
||||||
meta = self.db.query(FileMetadata).filter(
|
meta = meta_map.get(str(f.upload_file_id))
|
||||||
FileMetadata.id == f.upload_file_id,
|
|
||||||
FileMetadata.status == "completed"
|
|
||||||
).first()
|
|
||||||
if meta:
|
if meta:
|
||||||
name = name or meta.file_name
|
name = name or meta.file_name
|
||||||
size = size or meta.file_size
|
size = size or meta.file_size
|
||||||
|
|||||||
Reference in New Issue
Block a user