Skip to content

Commit b51b790

Browse files
Merge pull request #1876 from nextcloud/refactor/querybuilder/orx-andx
2 parents cc7dd9a + e1ed433 commit b51b790

7 files changed

Lines changed: 153 additions & 209 deletions

lib/Db/CircleRequest.php

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -265,17 +265,14 @@ private function buildProbeCircle(
265265

266266
$aliasMembership = $qb->generateAlias(CoreQueryBuilder::CIRCLE, CoreQueryBuilder::MEMBERSHIPS);
267267

268-
$limit = $qb->expr()->orX();
269268
if (is_null($initiator)) {
270269
// to get unique result, enforce a limit on level=owner
271-
$limit->add($qb->exprLimitInt('level', Member::LEVEL_OWNER, $aliasMembership));
270+
$limit = $qb->exprLimitInt('level', Member::LEVEL_OWNER, $aliasMembership);
272271
} else {
273-
$limit->add(
274-
$qb->exprLimit(
275-
'single_id',
276-
$initiator->getSingleId(),
277-
$aliasMembership
278-
)
272+
$limit = $qb->exprLimit(
273+
'single_id',
274+
$initiator->getSingleId(),
275+
$aliasMembership
279276
);
280277
$qb->completeProbeWithInitiator(CoreQueryBuilder::CIRCLE, 'single_id', $aliasMembership);
281278
}

lib/Db/CoreQueryBuilder.php

Lines changed: 84 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -372,22 +372,19 @@ public function filterCircleDetails(Circle $circle): void {
372372
}
373373

374374
$expr = $this->expr();
375-
$orX = $expr->orX();
375+
$andX = null;
376376
if ($circle->getDisplayName() !== '') {
377-
$andX = $expr->andX();
377+
$andX = [];
378378
foreach (explode(' ', $circle->getDisplayName()) as $word) {
379-
$andX->add(
380-
$expr->iLike(
381-
$this->getDefaultSelectAlias() . '.' . 'display_name',
382-
$this->createNamedParameter('%' . $word . '%')
383-
)
379+
$andX[] = $expr->iLike(
380+
$this->getDefaultSelectAlias() . '.' . 'display_name',
381+
$this->createNamedParameter('%' . $word . '%')
384382
);
385383
}
386-
$orX->add($andX);
387384
}
388385

389-
if ($orX->count() > 0) {
390-
$this->andWhere($orX);
386+
if ($andX !== null) {
387+
$this->andWhere(...$andX);
391388
}
392389

393390
if ($circle->getSource() > 0) {
@@ -572,46 +569,39 @@ protected function limitRemoteVisibility(string $alias, bool $sensitive, string
572569
$aliasRemoteCircleOwner = $this->generateAlias($aliasRemoteCircle, self::OWNER);
573570

574571
$expr = $this->expr();
575-
$orX = $expr->orX();
576-
$orX->add(
577-
$expr->eq($aliasRemote . '.type', $this->createNamedParameter(RemoteInstance::TYPE_GLOBALSCALE))
578-
);
572+
$orX = [$expr->eq($aliasRemote . '.type', $this->createNamedParameter(RemoteInstance::TYPE_GLOBALSCALE))];
579573

580-
$orExtOrPassive = $expr->orX();
581-
$orExtOrPassive->add(
582-
$expr->eq($aliasRemote . '.type', $this->createNamedParameter(RemoteInstance::TYPE_EXTERNAL))
583-
);
574+
$orExtOrPassive = [$expr->eq($aliasRemote . '.type', $this->createNamedParameter(RemoteInstance::TYPE_EXTERNAL))];
584575
if (!$sensitive) {
585-
$orExtOrPassive->add(
586-
$expr->eq($aliasRemote . '.type', $this->createNamedParameter(RemoteInstance::TYPE_PASSIVE))
587-
);
576+
$orExtOrPassive[] = $expr->eq($aliasRemote . '.type', $this->createNamedParameter(RemoteInstance::TYPE_PASSIVE));
588577
} else {
589578
if ($this->getDefaultSelectAlias() === CoreQueryBuilder::MEMBER) {
590-
$orExtOrPassive->add($this->limitRemoteVisibility_Sensitive_Members($aliasRemote));
579+
$orExtOrPassive[] = $this->limitRemoteVisibility_Sensitive_Members($aliasRemote);
591580
}
592581
}
593582

594-
$orInstance = $expr->orX();
595-
$orInstance->add($expr->isNotNull($aliasRemoteMember . '.instance'));
596-
$orInstance->add($expr->isNotNull($aliasRemoteCircleOwner . '.instance'));
583+
$orInstance = $expr->orX(
584+
$expr->isNotNull($aliasRemoteMember . '.instance'),
585+
$expr->isNotNull($aliasRemoteCircleOwner . '.instance'),
586+
);
597587

598-
$andExternal = $expr->andX();
599-
$andExternal->add($orExtOrPassive);
600-
$andExternal->add($orInstance);
588+
$andExternal = $expr->andX(
589+
$expr->orX(...$orExtOrPassive),
590+
$orInstance,
591+
);
601592

602-
$orExtOrTrusted = $expr->orX();
603-
$orExtOrTrusted->add($andExternal);
604-
$orExtOrTrusted->add(
605-
$expr->eq($aliasRemote . '.type', $this->createNamedParameter(RemoteInstance::TYPE_TRUSTED))
593+
$orExtOrTrusted = $expr->orX(
594+
$andExternal,
595+
$expr->eq($aliasRemote . '.type', $this->createNamedParameter(RemoteInstance::TYPE_TRUSTED)),
606596
);
607597

608-
$andTrusted = $expr->andX();
609-
$andTrusted->add($orExtOrTrusted);
610-
$andTrusted->add($this->exprLimitBitwise('config', Circle::CFG_FEDERATED, $aliasCircle));
611-
$andTrusted->add($expr->emptyString($aliasOwner . '.instance'));
612-
$orX->add($andTrusted);
598+
$orX[] = $expr->andX(
599+
$orExtOrTrusted,
600+
$this->exprLimitBitwise('config', Circle::CFG_FEDERATED, $aliasCircle),
601+
$expr->emptyString($aliasOwner . '.instance'),
602+
);
613603

614-
$this->andWhere($orX);
604+
$this->andWhere($expr->orX(...$orX));
615605
}
616606

617607

@@ -682,38 +672,30 @@ public function filterDirectMembership(string $aliasMember, Member $member): voi
682672
}
683673

684674
$expr = $this->expr();
685-
$andX = $expr->andX();
675+
$andX = [];
686676

687677
if ($member->getUserId() !== '') {
688-
$andX->add(
689-
$expr->eq($aliasMember . '.user_id', $this->createNamedParameter($member->getUserId()))
690-
);
678+
$andX[] = $expr->eq($aliasMember . '.user_id', $this->createNamedParameter($member->getUserId()));
691679
}
692680

693681
if ($member->getSingleId() !== '') {
694-
$andX->add(
695-
$expr->eq($aliasMember . '.single_id', $this->createNamedParameter($member->getSingleId()))
696-
);
682+
$andX[] = $expr->eq($aliasMember . '.single_id', $this->createNamedParameter($member->getSingleId()));
697683
}
698684

699685
if ($member->getUserType() > 0) {
700-
$andX->add(
701-
$expr->eq($aliasMember . '.user_type', $this->createNamedParameter($member->getUserType()))
702-
);
686+
$andX[] = $expr->eq($aliasMember . '.user_type', $this->createNamedParameter($member->getUserType()));
703687
}
704688

705689
$this->limitToInstance($this->getInstance($member));
706690

707691
if ($member->getLevel() > 0) {
708-
$andX->add(
709-
$expr->gte(
710-
$aliasMember . '.level',
711-
$this->createNamedParameter($member->getLevel(), IQueryBuilder::PARAM_INT)
712-
)
692+
$andX[] = $expr->gte(
693+
$aliasMember . '.level',
694+
$this->createNamedParameter($member->getLevel(), IQueryBuilder::PARAM_INT)
713695
);
714696
}
715697

716-
$this->andWhere($andX);
698+
$this->andWhere($expr->andX(...$andX));
717699
}
718700

719701

@@ -1200,18 +1182,15 @@ public function leftJoinInitiator(
12001182

12011183
try {
12021184
$aliasMembershipCircle = $this->generateAlias($aliasMembership, self::CONFIG, $options);
1203-
$orXMembershipCircle = $expr->orX();
1204-
array_map(
1205-
function (string $alias) use ($orXMembershipCircle, $aliasMembershipCircle) {
1206-
$orXMembershipCircle->add(
1207-
$this->expr()->eq(
1208-
$alias . '.circle_id',
1209-
$aliasMembershipCircle . '.unique_id'
1210-
)
1185+
$orXMembershipCircle = $expr->orX(...array_map(
1186+
function (string $alias) use ($aliasMembershipCircle) {
1187+
return $this->expr()->eq(
1188+
$alias . '.circle_id',
1189+
$aliasMembershipCircle . '.unique_id'
12111190
);
12121191
},
12131192
$listMembershipCircleAlias
1214-
);
1193+
));
12151194

12161195
$this->leftJoin(
12171196
$aliasMembership,
@@ -1338,78 +1317,72 @@ protected function limitInitiatorVisibility(string $alias): ICompositeExpression
13381317
// - 0 (default), if initiator is member
13391318
// - 2 (Personal), if initiator is owner)
13401319
// - 4 (Visible to everyone)
1341-
$orX = $expr->orX();
1320+
$orX = [];
13421321

13431322
// filterPersonalCircles will remove access to Personal Circles as Owner
13441323
if (!$this->getBool('filterPersonalCircles', $options, false)) {
1345-
$orX->add(
1346-
$expr->andX(
1347-
$this->exprLimitBitwise('config', Circle::CFG_PERSONAL, $aliasMembershipCircle),
1348-
$expr->eq($aliasMembership . '.level', $this->createNamedParameter(Member::LEVEL_OWNER))
1349-
)
1324+
$orX[] = $expr->andX(
1325+
$this->exprLimitBitwise('config', Circle::CFG_PERSONAL, $aliasMembershipCircle),
1326+
$expr->eq($aliasMembership . '.level', $this->createNamedParameter(Member::LEVEL_OWNER))
13501327
);
13511328
}
13521329

13531330
$minimumLevel = $this->getInt('minimumLevel', $options);
1354-
$andXMember = $expr->andX();
1355-
$orXLevelCheck = $expr->orX();
1356-
1357-
array_map(
1358-
function (string $alias) use ($orXLevelCheck, $minimumLevel) {
1359-
$orXLevelCheck->add(
1360-
$this->expr()->gte(
1361-
$alias . '.level',
1362-
$this->createNamedParameter($minimumLevel, self::PARAM_INT)
1363-
)
1331+
$orXLevelCheck = $expr->orX(...array_map(
1332+
function (string $alias) use ($minimumLevel) {
1333+
return $this->expr()->gte(
1334+
$alias . '.level',
1335+
$this->createNamedParameter($minimumLevel, self::PARAM_INT)
13641336
);
13651337
},
13661338
$levelCheck
1367-
);
1368-
$andXMember->add($orXLevelCheck);
1339+
));
1340+
$andXMember = [$orXLevelCheck];
13691341

13701342
if (!$this->getBool('includePersonalCircles', $options, false)) {
1371-
$andXMember->add(
1372-
$this->exprFilterBitwise(
1373-
'config', Circle::CFG_PERSONAL,
1374-
$aliasMembershipCircle
1375-
)
1343+
$andXMember[] = $this->exprFilterBitwise(
1344+
'config', Circle::CFG_PERSONAL,
1345+
$aliasMembershipCircle
13761346
);
13771347
}
1378-
$orX->add($andXMember);
1348+
$orX[] = $expr->andX(...$andXMember);
13791349

13801350
if ($directMember !== '' && $this->getBool('allowRequestingMembership', $options, false)) {
1381-
$orX->add($expr->orX(
1351+
$orX[] = $expr->orX(
13821352
$this->exprLimit('status', Member::STATUS_REQUEST, $directMember),
13831353
$this->exprLimit('status', Member::STATUS_INVITED, $directMember)
1384-
));
1354+
);
13851355
}
13861356

13871357
if ($minimumLevel === 0 && $alias === self::CIRCLE) {
1388-
$orX->add($this->exprLimitBitwise('config', Circle::CFG_VISIBLE, $alias));
1358+
$orX[] = $this->exprLimitBitwise('config', Circle::CFG_VISIBLE, $alias);
13891359
}
13901360

13911361
if ($this->getBool('includeNonVisibleCircles', $options)) {
1392-
$andXNonVisible = $expr->andX();
1393-
$andXNonVisible->add($this->exprLimitBitwise('config', Circle::CFG_OPEN, $alias));
1394-
$andXNonVisible->add($this->exprFilterBitwise('config', Circle::CFG_VISIBLE, $alias));
1395-
$orX->add($andXNonVisible);
1362+
$orX[] = $expr->andX(
1363+
$this->exprLimitBitwise('config', Circle::CFG_OPEN, $alias),
1364+
$this->exprFilterBitwise('config', Circle::CFG_VISIBLE, $alias),
1365+
);
13961366
}
13971367

13981368
if ($this->getBool('visitingSingleCircles', $options, false)) {
1399-
$orX->add($this->exprLimitBitwise('config', Circle::CFG_SINGLE, $alias));
1369+
$orX[] = $this->exprLimitBitwise('config', Circle::CFG_SINGLE, $alias);
14001370
}
14011371

14021372
// if Member can be Visitor, we only filter access to Personal Circles
14031373
if ($this->getBool('viewableThroughKeyhole', $options, false)) {
1404-
$andOpen = $expr->andX();
1405-
$andOpen->add($this->exprLimitBitwise('config', Circle::CFG_OPEN, $alias));
1406-
$andOpen->add($this->exprLimitBitwise('config', Circle::CFG_VISIBLE, $alias));
1374+
$andOpen = [
1375+
$this->exprLimitBitwise('config', Circle::CFG_OPEN, $alias),
1376+
$this->exprLimitBitwise('config', Circle::CFG_VISIBLE, $alias),
1377+
];
14071378
if (!$this->configService->getAppValueBool(ConfigService::KEYHOLE_CFG_REQUEST)) {
1408-
$andOpen->add($this->exprFilterBitwise('config', Circle::CFG_REQUEST, $alias));
1379+
$andOpen[] = $this->exprFilterBitwise('config', Circle::CFG_REQUEST, $alias);
14091380
}
1410-
$orX->add($andOpen);
1381+
$orX[] = $expr->andX(...$andOpen);
14111382
}
14121383

1384+
$orX = $expr->orX(...$orX);
1385+
14131386
$this->andWhere($orX);
14141387

14151388
return $orX;
@@ -1437,29 +1410,18 @@ public function filterCircles(string $aliasCircle, CircleProbe $probe): void {
14371410
*/
14381411
private function limitRemoteVisibility_Sensitive_Members(string $alias): ICompositeExpression {
14391412
$expr = $this->expr();
1440-
$andPassive = $expr->andX();
1441-
$andPassive->add(
1442-
$expr->eq($alias . '.type', $this->createNamedParameter(RemoteInstance::TYPE_PASSIVE))
1443-
);
1444-
1445-
$orMemberOrLevel = $expr->orX();
1446-
$orMemberOrLevel->add(
1447-
$expr->eq($this->getDefaultSelectAlias() . '.instance', $alias . '.instance')
1448-
);
1449-
// TODO: do we need this ? (display members from the local instance)
1450-
$orMemberOrLevel->add(
1451-
$expr->emptyString($this->getDefaultSelectAlias() . '.instance')
1452-
);
1453-
1454-
$orMemberOrLevel->add(
1455-
$expr->eq(
1456-
$this->getDefaultSelectAlias() . '.level',
1457-
$this->createNamedParameter(Member::LEVEL_OWNER)
1458-
)
1413+
return $expr->andX(
1414+
$expr->eq($alias . '.type', $this->createNamedParameter(RemoteInstance::TYPE_PASSIVE)),
1415+
$expr->orX(
1416+
$expr->eq($this->getDefaultSelectAlias() . '.instance', $alias . '.instance'),
1417+
// TODO: do we need this ? (display members from the local instance)
1418+
$expr->emptyString($this->getDefaultSelectAlias() . '.instance'),
1419+
$expr->eq(
1420+
$this->getDefaultSelectAlias() . '.level',
1421+
$this->createNamedParameter(Member::LEVEL_OWNER)
1422+
),
1423+
),
14591424
);
1460-
$andPassive->add($orMemberOrLevel);
1461-
1462-
return $andPassive;
14631425
}
14641426

14651427

lib/Db/DeprecatedRequestBuilder.php

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -368,16 +368,16 @@ protected function limitToLevel(IQueryBuilder $qb, int $level, $pf = '') {
368368
*/
369369
private function generateLimitToLevelMultipleTableRequest(IQueryBuilder $qb, int $level, $pf) {
370370
$expr = $qb->expr();
371-
$orX = $expr->orX();
371+
$orX = [];
372372

373373
foreach ($pf as $p) {
374374
if ($p === 'g' && !$this->leftJoinedNCGroupAndUser) {
375375
continue;
376376
}
377-
$orX->add($expr->gte($p . '.level', $qb->createNamedParameter($level)));
377+
$orX[] = $expr->gte($p . '.level', $qb->createNamedParameter($level));
378378
}
379379

380-
return $orX;
380+
return $expr->orX(...$orX);
381381
}
382382

383383

@@ -391,12 +391,11 @@ protected function limitToMembersAndAlmost(IQueryBuilder $qb) {
391391

392392
$pf = ($qb->getType() === QueryBuilder::SELECT) ? $this->default_select_alias . '.' : '';
393393

394-
$orX = $expr->orX();
395-
$orX->add($expr->eq($pf . 'status', $qb->createNamedParameter(DeprecatedMember::STATUS_MEMBER)));
396-
$orX->add($expr->eq($pf . 'status', $qb->createNamedParameter(DeprecatedMember::STATUS_INVITED)));
397-
$orX->add($expr->eq($pf . 'status', $qb->createNamedParameter(DeprecatedMember::STATUS_REQUEST)));
398-
399-
$qb->andWhere($orX);
394+
$qb->andWhere($expr->orX(
395+
$expr->eq($pf . 'status', $qb->createNamedParameter(DeprecatedMember::STATUS_MEMBER)),
396+
$expr->eq($pf . 'status', $qb->createNamedParameter(DeprecatedMember::STATUS_INVITED)),
397+
$expr->eq($pf . 'status', $qb->createNamedParameter(DeprecatedMember::STATUS_REQUEST)),
398+
));
400399
}
401400

402401

0 commit comments

Comments
 (0)