mirror of
https://github.com/netzbegruenung/circles.git
synced 2024-05-14 09:06:06 +02:00
Use subselects to reduce rows_examined and increase performance
Signed-off-by: Maximilian Ruta <mr@xtain.net>
This commit is contained in:
parent
c43ec7557d
commit
2d4ac70096
|
@ -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)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue