user = $user; $this->joinHelper = $joinHelper; } public function apply(SelectBuilder $queryBuilder, SearchParams $searchParams): void { $folder = $this->retrieveFolder($searchParams); if ($folder === 'drafts') { $queryBuilder->useIndex('createdById'); } else if ($folder === 'important') { // skip } else if ($this->checkApplyDateSentIndex($queryBuilder, $searchParams)) { $queryBuilder->useIndex('dateSent'); } if ($folder !== 'drafts') { $this->joinEmailUser($queryBuilder); } } protected function joinEmailUser(SelectBuilder $queryBuilder): void { $this->joinHelper->joinEmailUser($queryBuilder, $this->user->getId()); if ($queryBuilder->build()->getSelect() === []) { $queryBuilder->select('*'); } $itemList = [ 'isRead', 'isImportant', 'inTrash', 'folderId', ]; foreach ($itemList as $item) { $queryBuilder->select('emailUser.' . $item, $item); } } protected 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; } protected 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; } }