Переглянути джерело

HUE-5533 [home] Improve home page load time

To roll up documents inside '/', we ignore all documents which has
a parent directory within the same list. This fix aims to optimize
this DB operation by just calling the exclude on directories instead of all documents.
krish 9 роки тому
батько
коміт
6109918dc2
2 змінених файлів з 11 додано та 3 видалено
  1. 2 3
      desktop/core/src/desktop/api2.py
  2. 9 0
      desktop/core/src/desktop/models.py

+ 2 - 3
desktop/core/src/desktop/api2.py

@@ -228,11 +228,10 @@ def _get_document_helper(request, uuid, with_data, with_dependencies, path):
     # If this is the user's home directory, fetch shared docs too
     if document.is_home_directory:
       children = directory.get_children_and_shared_documents(user=request.user)
+      response.update(_filter_documents(request, queryset=children, flatten=True))
     else:
       children = directory.get_children_documents()
-
-    # Filter and order results
-    response.update(_filter_documents(request, queryset=children, flatten=False))
+      response.update(_filter_documents(request, queryset=children, flatten=False))
 
   # Paginate and serialize Results
   if 'documents' in response:

+ 9 - 0
desktop/core/src/desktop/models.py

@@ -1419,6 +1419,15 @@ class Directory(Document2):
     trashed_ids = [doc.id for doc in documents if Document2.TRASH_DIR in doc.parent_directory.path]
     documents = documents.exclude(id__in=trashed_ids)
 
+    # Optimizing roll up for /home by checking only with directories instead of all documents
+    # For all other directories roll up is done in _filter_documents()
+    directories_all = Document2.objects.filter(type='directory').exclude(id=self.id)
+    directories_inside_home = directories_all.filter(
+      (Q(document2permission__users=user) | Q(document2permission__groups__in=user.groups.all())) &
+        ~Q(owner=user)
+    )
+    documents = documents.exclude(parent_directory__in=directories_inside_home)
+
     return documents.defer('description', 'data', 'extra', 'search').distinct().order_by('-last_modified')