|
|
|
@ -36,9 +36,9 @@ use OCP\Files\IMimeTypeLoader; |
|
|
|
use OCP\Files\IRootFolder; |
|
|
|
use OCP\Files\IRootFolder; |
|
|
|
use OCP\Files\Mount\IMountPoint; |
|
|
|
use OCP\Files\Mount\IMountPoint; |
|
|
|
use OCP\Files\Search\ISearchBinaryOperator; |
|
|
|
use OCP\Files\Search\ISearchBinaryOperator; |
|
|
|
use OCP\Files\Search\ISearchComparison; |
|
|
|
|
|
|
|
use OCP\Files\Search\ISearchQuery; |
|
|
|
use OCP\Files\Search\ISearchQuery; |
|
|
|
use OCP\IDBConnection; |
|
|
|
use OCP\IDBConnection; |
|
|
|
|
|
|
|
use OCP\IGroupManager; |
|
|
|
use OCP\IUser; |
|
|
|
use OCP\IUser; |
|
|
|
use Psr\Log\LoggerInterface; |
|
|
|
use Psr\Log\LoggerInterface; |
|
|
|
|
|
|
|
|
|
|
|
@ -54,6 +54,7 @@ class QuerySearchHelper { |
|
|
|
private $searchBuilder; |
|
|
|
private $searchBuilder; |
|
|
|
/** @var QueryOptimizer */ |
|
|
|
/** @var QueryOptimizer */ |
|
|
|
private $queryOptimizer; |
|
|
|
private $queryOptimizer; |
|
|
|
|
|
|
|
private IGroupManager $groupManager; |
|
|
|
|
|
|
|
|
|
|
|
public function __construct( |
|
|
|
public function __construct( |
|
|
|
IMimeTypeLoader $mimetypeLoader, |
|
|
|
IMimeTypeLoader $mimetypeLoader, |
|
|
|
@ -61,7 +62,8 @@ class QuerySearchHelper { |
|
|
|
SystemConfig $systemConfig, |
|
|
|
SystemConfig $systemConfig, |
|
|
|
LoggerInterface $logger, |
|
|
|
LoggerInterface $logger, |
|
|
|
SearchBuilder $searchBuilder, |
|
|
|
SearchBuilder $searchBuilder, |
|
|
|
QueryOptimizer $queryOptimizer |
|
|
|
QueryOptimizer $queryOptimizer, |
|
|
|
|
|
|
|
IGroupManager $groupManager, |
|
|
|
) { |
|
|
|
) { |
|
|
|
$this->mimetypeLoader = $mimetypeLoader; |
|
|
|
$this->mimetypeLoader = $mimetypeLoader; |
|
|
|
$this->connection = $connection; |
|
|
|
$this->connection = $connection; |
|
|
|
@ -69,6 +71,7 @@ class QuerySearchHelper { |
|
|
|
$this->logger = $logger; |
|
|
|
$this->logger = $logger; |
|
|
|
$this->searchBuilder = $searchBuilder; |
|
|
|
$this->searchBuilder = $searchBuilder; |
|
|
|
$this->queryOptimizer = $queryOptimizer; |
|
|
|
$this->queryOptimizer = $queryOptimizer; |
|
|
|
|
|
|
|
$this->groupManager = $groupManager; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected function getQueryBuilder() { |
|
|
|
protected function getQueryBuilder() { |
|
|
|
@ -118,16 +121,16 @@ class QuerySearchHelper { |
|
|
|
return $tags; |
|
|
|
return $tags; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected function equipQueryForSystemTags(CacheQueryBuilder $query): void { |
|
|
|
protected function equipQueryForSystemTags(CacheQueryBuilder $query, IUser $user): void { |
|
|
|
$query |
|
|
|
$query->leftJoin('file', 'systemtag_object_mapping', 'systemtagmap', $query->expr()->andX( |
|
|
|
->leftJoin('file', 'systemtag_object_mapping', 'systemtagmap', $query->expr()->andX( |
|
|
|
|
|
|
|
$query->expr()->eq('file.fileid', $query->expr()->castColumn('systemtagmap.objectid', IQueryBuilder::PARAM_INT)), |
|
|
|
$query->expr()->eq('file.fileid', $query->expr()->castColumn('systemtagmap.objectid', IQueryBuilder::PARAM_INT)), |
|
|
|
$query->expr()->eq('systemtagmap.objecttype', $query->createNamedParameter('files')) |
|
|
|
$query->expr()->eq('systemtagmap.objecttype', $query->createNamedParameter('files')) |
|
|
|
)) |
|
|
|
|
|
|
|
->leftJoin('systemtagmap', 'systemtag', 'systemtag', $query->expr()->andX( |
|
|
|
|
|
|
|
$query->expr()->eq('systemtag.id', 'systemtagmap.systemtagid'), |
|
|
|
|
|
|
|
$query->expr()->eq('systemtag.visibility', $query->createNamedParameter(true)) |
|
|
|
|
|
|
|
)); |
|
|
|
)); |
|
|
|
|
|
|
|
$on = $query->expr()->andX($query->expr()->eq('systemtag.id', 'systemtagmap.systemtagid')); |
|
|
|
|
|
|
|
if (!$this->groupManager->isAdmin($user->getUID())) { |
|
|
|
|
|
|
|
$on->add($query->expr()->eq('systemtag.visibility', $query->createNamedParameter(true))); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
$query->leftJoin('systemtagmap', 'systemtag', 'systemtag', $on); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected function equipQueryForDavTags(CacheQueryBuilder $query, IUser $user): void { |
|
|
|
protected function equipQueryForDavTags(CacheQueryBuilder $query, IUser $user): void { |
|
|
|
@ -171,25 +174,12 @@ class QuerySearchHelper { |
|
|
|
|
|
|
|
|
|
|
|
$query = $builder->selectFileCache('file', false); |
|
|
|
$query = $builder->selectFileCache('file', false); |
|
|
|
|
|
|
|
|
|
|
|
if ($this->searchBuilder->shouldJoinTags($searchQuery->getSearchOperation())) { |
|
|
|
$requestedFields = $this->searchBuilder->extractRequestedFields($searchQuery->getSearchOperation()); |
|
|
|
$user = $searchQuery->getUser(); |
|
|
|
if (in_array('systemtag', $requestedFields)) { |
|
|
|
if ($user === null) { |
|
|
|
$this->equipQueryForSystemTags($query, $this->requireUser($searchQuery)); |
|
|
|
throw new \InvalidArgumentException("Searching by tag requires the user to be set in the query"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if ($searchQuery->getSearchOperation() instanceof ISearchComparison) { |
|
|
|
|
|
|
|
switch ($searchQuery->getSearchOperation()->getField()) { |
|
|
|
|
|
|
|
case 'systemtag': |
|
|
|
|
|
|
|
$this->equipQueryForSystemTags($query); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 'tagname': |
|
|
|
|
|
|
|
case 'favorite': |
|
|
|
|
|
|
|
$this->equipQueryForDavTags($query, $user); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} elseif ($searchQuery->getSearchOperation() instanceof SearchBinaryOperator) { |
|
|
|
|
|
|
|
$this->equipQueryForSystemTags($query); |
|
|
|
|
|
|
|
$this->equipQueryForDavTags($query, $user); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (in_array('tagname', $requestedFields) || in_array('favorite', $requestedFields)) { |
|
|
|
|
|
|
|
$this->equipQueryForDavTags($query, $this->requireUser($searchQuery)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
$this->applySearchConstraints($query, $searchQuery, $caches); |
|
|
|
$this->applySearchConstraints($query, $searchQuery, $caches); |
|
|
|
@ -217,6 +207,14 @@ class QuerySearchHelper { |
|
|
|
return $results; |
|
|
|
return $results; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function requireUser(ISearchQuery $searchQuery): IUser { |
|
|
|
|
|
|
|
$user = $searchQuery->getUser(); |
|
|
|
|
|
|
|
if ($user === null) { |
|
|
|
|
|
|
|
throw new \InvalidArgumentException("This search operation requires the user to be set in the query"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return $user; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* @return list{0?: array<array-key, ICache>, 1?: array<array-key, IMountPoint>} |
|
|
|
* @return list{0?: array<array-key, ICache>, 1?: array<array-key, IMountPoint>} |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|