fix: optimize api /knowledge/space/list (#906)

This commit is contained in:
Shinexy 2023-12-08 14:07:51 +08:00 committed by GitHub
parent a6642dc67f
commit e7e4aff667
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 4 deletions

View File

@ -135,6 +135,31 @@ class KnowledgeDocumentDao(BaseDao):
session.close()
return result
def get_knowledge_documents_count_bulk(self, space_names):
session = self.get_session()
"""
Perform a batch query to count the number of documents for each knowledge space.
Args:
space_names: A list of knowledge space names to query for document counts.
session: A SQLAlchemy session object.
Returns:
A dictionary mapping each space name to its document count.
"""
counts_query = (
session.query(
KnowledgeDocumentEntity.space,
func.count(KnowledgeDocumentEntity.id).label("document_count"),
)
.filter(KnowledgeDocumentEntity.space.in_(space_names))
.group_by(KnowledgeDocumentEntity.space)
)
results = counts_query.all()
docs_count = {result.space: result.document_count for result in results}
return docs_count
def get_knowledge_documents_count(self, query):
session = self.get_session()
knowledge_documents = session.query(func.count(KnowledgeDocumentEntity.id))

View File

@ -116,8 +116,12 @@ class KnowledgeService:
query = KnowledgeSpaceEntity(
name=request.name, vector_type=request.vector_type, owner=request.owner
)
responses = []
spaces = knowledge_space_dao.get_knowledge_space(query)
space_names = [space.name for space in spaces]
docs_count = knowledge_document_dao.get_knowledge_documents_count_bulk(
space_names
)
responses = []
for space in spaces:
res = SpaceQueryResponse()
res.id = space.id
@ -128,9 +132,7 @@ class KnowledgeService:
res.gmt_created = space.gmt_created
res.gmt_modified = space.gmt_modified
res.context = space.context
query = KnowledgeDocumentEntity(space=space.name)
doc_count = knowledge_document_dao.get_knowledge_documents_count(query)
res.docs = doc_count
res.docs = docs_count.get(space.name, 0)
responses.append(res)
return responses