Use subselects to reduce rows_examined and increase performance

Signed-off-by: Maximilian Ruta <mr@xtain.net>
This commit is contained in:
Maximilian Ruta 2019-07-09 22:52:33 +02:00
parent c43ec7557d
commit 2d4ac70096

View file

@ -275,8 +275,6 @@ class CircleProviderRequestBuilder extends CoreRequestBuilder {
protected function linkToMember(IQueryBuilder &$qb, $userId, $groupMemberAllowed) { protected function linkToMember(IQueryBuilder &$qb, $userId, $groupMemberAllowed) {
$expr = $qb->expr(); $expr = $qb->expr();
$qb->from(CoreRequestBuilder::TABLE_MEMBERS, 'm');
$orX = $expr->orX(); $orX = $expr->orX();
$orX->add($this->exprLinkToMemberAsCircleMember($qb, $userId)); $orX->add($this->exprLinkToMemberAsCircleMember($qb, $userId));
if ($groupMemberAllowed === true) { if ($groupMemberAllowed === true) {
@ -297,23 +295,29 @@ class CircleProviderRequestBuilder extends CoreRequestBuilder {
* @return \OCP\DB\QueryBuilder\ICompositeExpression * @return \OCP\DB\QueryBuilder\ICompositeExpression
*/ */
private function exprLinkToMemberAsCircleMember(IQueryBuilder &$qb, $userId) { private function exprLinkToMemberAsCircleMember(IQueryBuilder &$qb, $userId) {
$subQb = $this->dbConnection->getQueryBuilder();
$expr = $qb->expr(); $subQb
->select('mcm.circle_id')
->from(CoreRequestBuilder::TABLE_MEMBERS, 'mcm');
$expr = $subQb->expr();
$andX = $expr->andX(); $andX = $expr->andX();
$andX->add($expr->eq('m.user_id', $qb->createNamedParameter($userId))); $andX->add($expr->eq('mcm.user_id', $qb->createNamedParameter($userId)));
$andX->add($expr->gt('m.level', $qb->createNamedParameter(0))); $andX->add($expr->gt('mcm.level', $qb->createNamedParameter(0)));
$andX->add($expr->eq('m.user_type', $qb->createNamedParameter(Member::TYPE_USER))); $andX->add($expr->eq('mcm.user_type', $qb->createNamedParameter(Member::TYPE_USER)));
$andX->add(
$expr->eq( $subQb->andWhere($andX);
'm.circle_id',
return $qb->expr()->andX(
$expr->in(
$qb->createFunction( $qb->createFunction(
'SUBSTR(`c`.`unique_id`, 1, ' . Circle::SHORT_UNIQUE_ID_LENGTH . ')' 'SUBSTR(`c`.`unique_id`, 1, ' . Circle::SHORT_UNIQUE_ID_LENGTH . ')'
) ),
$qb->createFunction($subQb->getSQL())
) )
); );
return $andX;
} }
@ -328,23 +332,30 @@ class CircleProviderRequestBuilder extends CoreRequestBuilder {
private function exprLinkToMemberAsGroupMember(IQueryBuilder &$qb, $userId) { private function exprLinkToMemberAsGroupMember(IQueryBuilder &$qb, $userId) {
$expr = $qb->expr(); $expr = $qb->expr();
$subQb = $this->dbConnection->getQueryBuilder();
$subExpr = $subQb->expr();
$subQb
->select('g.circle_id')
->from(CoreRequestBuilder::TABLE_GROUPS, 'g');
/** @noinspection PhpMethodParametersCountMismatchInspection */ /** @noinspection PhpMethodParametersCountMismatchInspection */
$qb->leftJoin( $subQb->leftJoin(
'c', CoreRequestBuilder::TABLE_GROUPS, 'g', 'g', CoreRequestBuilder::NC_TABLE_GROUP_USER, 'ncgu',
$expr->andX( $subExpr->eq('ncgu.gid', 'g.group_id')
$expr->eq( );
'g.circle_id', $subQb->where(
$qb->createFunction('SUBSTR(`c`.`unique_id`, 1, ' . Circle::SHORT_UNIQUE_ID_LENGTH . ')') $subExpr->andX($subExpr->eq('ncgu.uid', $qb->createNamedParameter($userId)))
) );
return $qb->expr()->andX(
$expr->in(
$qb->createFunction(
'SUBSTR(`c`.`unique_id`, 1, ' . Circle::SHORT_UNIQUE_ID_LENGTH . ')'
),
$qb->createFunction($subQb->getSQL())
) )
); );
$qb->leftJoin(
'g', CoreRequestBuilder::NC_TABLE_GROUP_USER, 'ncgu',
$expr->eq('ncgu.gid', 'g.group_id')
);
return $expr->andX($expr->eq('ncgu.uid', $qb->createNamedParameter($userId)));
} }