Skip to content

Commit 0695b28

Browse files
committed
fix: enhance knowledge retrieval logic with dynamic SQL selection based on workspace management
1 parent 16482af commit 0695b28

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

apps/knowledge/serializers/knowledge.py

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from application.models import ApplicationKnowledgeMapping
2121
from common.config.embedding_config import VectorStore
22+
from common.database_model_manage.database_model_manage import DatabaseModelManage
2223
from common.db.search import native_search, get_dynamics_model, native_page_search
2324
from common.db.sql_execute import select_list
2425
from common.event import ListenerManagement
@@ -36,6 +37,7 @@
3637
from knowledge.task.sync import sync_web_knowledge, sync_replace_web_knowledge
3738
from maxkb.conf import PROJECT_DIR
3839
from models_provider.models import Model
40+
from users.serializers.user import is_workspace_manage
3941

4042

4143
class KnowledgeModelSerializer(serializers.ModelSerializer):
@@ -108,6 +110,12 @@ class Query(serializers.Serializer):
108110
allow_blank=True, max_length=256, min_length=1)
109111
user_id = serializers.UUIDField(required=False, label=_('user id'), allow_null=True)
110112

113+
@staticmethod
114+
def is_x_pack_ee():
115+
workspace_user_role_mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping")
116+
role_permission_mapping_model = DatabaseModelManage.get_model("role_permission_mapping_model")
117+
return workspace_user_role_mapping_model is not None and role_permission_mapping_model is not None
118+
111119
def get_query_set(self):
112120
workspace_id = self.data.get("workspace_id")
113121
query_set_dict = {}
@@ -150,28 +158,44 @@ def get_query_set(self):
150158
def page(self, current_page: int, page_size: int):
151159
self.is_valid(raise_exception=True)
152160

153-
folder_id = self.data.get('folder_id', 'root')
161+
folder_id = self.data.get('folder_id', self.data.get("workspace_id"))
154162
root = KnowledgeFolder.objects.filter(id=folder_id).first()
155163
if not root:
156164
raise serializers.ValidationError(_('Folder not found'))
165+
workspace_manage = is_workspace_manage(self.data.get('user_id'), self.data.get('workspace_id'))
157166

158167
return native_page_search(
159168
current_page,
160169
page_size,
161170
self.get_query_set(),
162171
select_string=get_file_content(
163-
os.path.join(PROJECT_DIR, "apps", "knowledge", 'sql', 'list_knowledge.sql')
172+
os.path.join(
173+
PROJECT_DIR,
174+
"apps",
175+
"knowledge", 'sql',
176+
'list_knowledge.sql' if workspace_manage else (
177+
'list_knowledge_user_ee.sql' if self.is_x_pack_ee() else 'list_knowledge_user.sql'
178+
)
179+
)
164180
),
165181
post_records_handler=lambda r: r
166182
)
167183

168184
def list(self):
169185
self.is_valid(raise_exception=True)
186+
workspace_manage = is_workspace_manage(self.data.get('user_id'), self.data.get('workspace_id'))
187+
170188
return native_search(
171189
self.get_query_set(),
172190
select_string=get_file_content(
173-
os.path.join(PROJECT_DIR, "apps", "knowledge", 'sql', 'list_knowledge.sql')
174-
)
191+
os.path.join(
192+
PROJECT_DIR,
193+
"apps",
194+
"knowledge", 'sql',
195+
'list_knowledge.sql' if workspace_manage else (
196+
'list_knowledge_user_ee.sql' if self.is_x_pack_ee() else 'list_knowledge_user.sql'
197+
)
198+
))
175199
)
176200

177201
class Operate(serializers.Serializer):
@@ -433,7 +457,7 @@ def save_base(self, instance, with_valid=True):
433457
if with_valid:
434458
self.is_valid(raise_exception=True)
435459
KnowledgeBaseCreateRequest(data=instance).is_valid(raise_exception=True)
436-
folder_id = instance.get('folder_id', 'root')
460+
folder_id = instance.get('folder_id', self.data.get('workspace_id'))
437461
if QuerySet(Knowledge).filter(workspace_id=self.data.get('workspace_id'),
438462
folder_id=folder_id,
439463
name=instance.get('name')).exists():
@@ -495,7 +519,7 @@ def save_web(self, instance: Dict, with_valid=True):
495519
self.is_valid(raise_exception=True)
496520
KnowledgeWebCreateRequest(data=instance).is_valid(raise_exception=True)
497521

498-
folder_id = instance.get('folder_id', 'root')
522+
folder_id = instance.get('folder_id', self.data.get('workspace_id'))
499523
if QuerySet(Knowledge).filter(workspace_id=self.data.get('workspace_id'),
500524
folder_id=folder_id,
501525
name=instance.get('name')).exists():

apps/knowledge/sql/list_knowledge.sql

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,7 @@ FROM (SELECT "temp_knowledge".id::text, "temp_knowledge".name,
1717
ELSE "app_knowledge_temp"."count" END AS application_mapping_count,
1818
"document_temp".document_count
1919
FROM (SELECT knowledge.*
20-
FROM knowledge knowledge ${knowledge_custom_sql}
21-
AND id in (SELECT target
22-
FROM workspace_user_resource_permission
23-
WHERE auth_target_type = 'KNOWLEDGE'
24-
AND 'VIEW' = any (permission_list))) temp_knowledge
20+
FROM knowledge knowledge ${knowledge_custom_sql}) temp_knowledge
2521
LEFT JOIN (SELECT "count"("id") AS document_count, "sum"("char_length") "char_length", knowledge_id
2622
FROM "document"
2723
GROUP BY knowledge_id) "document_temp" ON temp_knowledge."id" = "document_temp".knowledge_id

0 commit comments

Comments
 (0)