Skip to content

Commit

Permalink
Merge pull request #34915 from owncloud/backport/34906
Browse files Browse the repository at this point in the history
[stable10] reduce query size by properly reusing the query builder
  • Loading branch information
Vincent Petry authored Mar 29, 2019
2 parents 01f925a + 5b57a61 commit 6e677d7
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 61 deletions.
65 changes: 33 additions & 32 deletions apps/federatedfilesharing/lib/FederatedShareProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -577,44 +577,45 @@ public function deleteFromSelf(IShare $share, $recipient) {
public function getAllSharesBy($userId, $shareTypes, $nodeIDs, $reshares) {
$shares = [];

$nodeIdsChunks = \array_chunk($nodeIDs, 100);
foreach ($nodeIdsChunks as $nodeIdsChunk) {
$qb = $this->dbConnection->getQueryBuilder();
$qb->select('*')
->from($this->shareTable);
$qb = $this->dbConnection->getQueryBuilder();
$qb->select('*')
->from($this->shareTable);

// In federated sharing currently we have only one share_type_remote
$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_REMOTE)));

// In federated sharing currently we have only one share_type_remote
$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_REMOTE)));
$qb->andWhere($qb->expr()->in('file_source', $qb->createParameter('file_source_ids')));

$qb->andWhere($qb->expr()->in('file_source', $qb->createParameter('file_source_ids')));
$qb->setParameter('file_source_ids', $nodeIdsChunk, IQueryBuilder::PARAM_INT_ARRAY);
/**
* Reshares for this user are shares where they are the owner.
*/
if ($reshares === false) {
//Special case for old shares created via the web UI
$or1 = $qb->expr()->andX(
$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
$qb->expr()->isNull('uid_initiator')
);

/**
* Reshares for this user are shares where they are the owner.
*/
if ($reshares === false) {
//Special case for old shares created via the web UI
$or1 = $qb->expr()->andX(
$qb->andWhere(
$qb->expr()->orX(
$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)),
$or1
)
);
} else {
$qb->andWhere(
$qb->expr()->orX(
$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
$qb->expr()->isNull('uid_initiator')
);
$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
)
);
}

$qb->andWhere(
$qb->expr()->orX(
$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)),
$or1
)
);
} else {
$qb->andWhere(
$qb->expr()->orX(
$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
)
);
}
$qb->orderBy('id');

$qb->orderBy('id');
$nodeIdsChunks = \array_chunk($nodeIDs, 900);
foreach ($nodeIdsChunks as $nodeIdsChunk) {
$qb->setParameter('file_source_ids', $nodeIdsChunk, IQueryBuilder::PARAM_INT_ARRAY);

$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
Expand Down
59 changes: 30 additions & 29 deletions lib/private/Share20/DefaultShareProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -440,41 +440,42 @@ public function getAllSharesBy($userId, $shareTypes, $nodeIDs, $reshares) {
$shares = [];
$qb = $this->dbConn->getQueryBuilder();

$nodeIdsChunks = \array_chunk($nodeIDs, 100);
foreach ($nodeIdsChunks as $nodeIdsChunk) {
$qb->select('*')
->from('share')
->andWhere($qb->expr()->orX(
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
));
$qb->select('*')
->from('share')
->andWhere($qb->expr()->orX(
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
));

$orX = $qb->expr()->orX();
$orX = $qb->expr()->orX();

foreach ($shareTypes as $shareType) {
$orX->add($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
}
foreach ($shareTypes as $shareType) {
$orX->add($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
}

$qb->andWhere($orX);
$qb->andWhere($orX);

/**
* Reshares for this user are shares where they are the owner.
*/
if ($reshares === false) {
$qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
} else {
$qb->andWhere(
$qb->expr()->orX(
$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
)
);
}
/**
* Reshares for this user are shares where they are the owner.
*/
if ($reshares === false) {
$qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
} else {
$qb->andWhere(
$qb->expr()->orX(
$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
)
);
}

$qb->andWhere($qb->expr()->in('file_source', $qb->createParameter('file_source_ids')));
$qb->setParameter('file_source_ids', $nodeIdsChunk, IQueryBuilder::PARAM_INT_ARRAY);
$qb->andWhere($qb->expr()->in('file_source', $qb->createParameter('file_source_ids')));

$qb->orderBy('id');
$qb->orderBy('id');

$nodeIdsChunks = \array_chunk($nodeIDs, 900);
foreach ($nodeIdsChunks as $nodeIdsChunk) {
$qb->setParameter('file_source_ids', $nodeIdsChunk, IQueryBuilder::PARAM_INT_ARRAY);

$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
Expand Down

0 comments on commit 6e677d7

Please sign in to comment.