retrieveFolder($searchParams); $this->applyIndexes($folder, $queryBuilder, $searchParams); if ($folder !== Folder::DRAFTS) { $this->joinEmailUser($queryBuilder); } } private function applyIndexes(?string $folder, SelectBuilder $queryBuilder, SearchParams $searchParams): void { if ($searchParams->getTextFilter()) { return; } if ($folder === Folder::IMPORTANT) { return; } if ($folder === Folder::DRAFTS) { $queryBuilder->useIndex('createdById'); return; } if ($this->checkApplyDateSentIndex($queryBuilder, $searchParams)) { $queryBuilder->useIndex('dateSent'); } } private function joinEmailUser(SelectBuilder $queryBuilder): void { $this->joinHelper->joinEmailUser($queryBuilder, $this->user->getId()); if ($queryBuilder->build()->getSelect() === []) { $queryBuilder->select('*'); } $itemList = [ Email::USERS_COLUMN_IS_READ, Email::USERS_COLUMN_IS_IMPORTANT, Email::USERS_COLUMN_IN_TRASH, Email::USERS_COLUMN_FOLDER_ID, ]; foreach ($itemList as $item) { $queryBuilder->select('emailUser.' . $item, $item); } } private function retrieveFolder(SearchParams $searchParams): ?string { if (!$searchParams->getWhere()) { return null; } foreach ($searchParams->getWhere()->getItemList() as $item) { if ($item->getType() === 'inFolder') { return $item->getValue(); } } return null; } private function checkApplyDateSentIndex(SelectBuilder $queryBuilder, SearchParams $searchParams): bool { if ($searchParams->getTextFilter()) { return false; } if ($searchParams->getOrderBy() && $searchParams->getOrderBy() !== 'dateSent') { return false; } $whereItemList = []; if ($searchParams->getWhere()) { $whereItemList = $searchParams->getWhere()->getItemList(); } foreach ($whereItemList as $item) { $itemAttribute = $item->getAttribute(); if ( $itemAttribute && $itemAttribute !== 'folderId' && !in_array($itemAttribute, ['teams', 'users', 'status']) ) { return false; } } if ($queryBuilder->hasLeftJoinAlias('teamsAccess')) { return false; } return true; } }