Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
lighten select for single circle
Signed-off-by: Maxence Lange <[email protected]>
  • Loading branch information
ArtificialOwl authored and backportbot[bot] committed Dec 16, 2021
commit cdac7f257510927bd5dd2d32fb40fa7a44a4f32a
2 changes: 1 addition & 1 deletion lib/Db/CircleRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ public function getFederatedUserBySingleId(string $singleId): FederatedUser {
* @throws RequestBuilderException
*/
public function getSingleCircle(IFederatedUser $initiator): Circle {
$qb = $this->getCircleSelectSql(CoreQueryBuilder::SINGLE);
$qb = $this->getCircleSelectSql(CoreQueryBuilder::SINGLE, true);

if ($initiator instanceof FederatedUser) {
$member = new Member();
Expand Down
15 changes: 11 additions & 4 deletions lib/Db/CircleRequestBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,21 @@ protected function getCircleUpdateSql(): CoreQueryBuilder {

/**
* @param string $alias
* @param bool $single
*
* @return CoreQueryBuilder
*/
protected function getCircleSelectSql(string $alias = CoreQueryBuilder::CIRCLE): CoreQueryBuilder {
protected function getCircleSelectSql(
string $alias = CoreQueryBuilder::CIRCLE,
bool $single = false
): CoreQueryBuilder {
$qb = $this->getQueryBuilder();
$qb->generateSelect(self::TABLE_CIRCLE, self::$tables[self::TABLE_CIRCLE], $alias, true)
->generateGroupBy(self::$tables[self::TABLE_CIRCLE], $alias)
->orderBy($alias . '.creation', 'asc');
$qb->generateSelect(self::TABLE_CIRCLE, self::$tables[self::TABLE_CIRCLE], $alias, !$single)
->generateGroupBy(self::$tables[self::TABLE_CIRCLE], $alias);

if (!$single) {
$qb->orderBy($alias . '.creation', 'asc');
}

return $qb;
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Db/CoreQueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,7 @@ public function limitToDirectMembership(string $alias, Member $member): void {
if ($getData) {
$this->generateMemberSelectAlias($aliasMember);
}
$this->leftJoin(
$this->innerJoin(
$this->getDefaultSelectAlias(), CoreRequestBuilder::TABLE_MEMBER, $aliasMember,
$expr->eq($aliasMember . '.circle_id', $alias . '.unique_id')
);
Expand Down
71 changes: 69 additions & 2 deletions lib/Service/FederatedUserService.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@

namespace OCA\Circles\Service;

use ArtificialOwl\MySmallPhpTools\Exceptions\InvalidItemException;
use ArtificialOwl\MySmallPhpTools\Traits\Nextcloud\nc22\TNC22Deserialize;
use ArtificialOwl\MySmallPhpTools\Traits\Nextcloud\nc22\TNC22Logger;
use ArtificialOwl\MySmallPhpTools\Traits\TArrayTools;
use ArtificialOwl\MySmallPhpTools\Traits\TStringTools;
Expand Down Expand Up @@ -69,6 +71,8 @@
use OCA\Circles\Model\ManagedModel;
use OCA\Circles\Model\Member;
use OCA\Circles\Model\Probes\CircleProbe;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IGroupManager;
use OCP\IUser;
use OCP\IUserManager;
Expand All @@ -83,8 +87,12 @@ class FederatedUserService {
use TArrayTools;
use TStringTools;
use TNC22Logger;
use TNC22Deserialize;


public const CACHE_SINGLE_CIRCLE = 'circles/singleCircle';
public const CACHE_SINGLE_CIRCLE_TTL = 900;

public const CONFLICT_001 = 1;
public const CONFLICT_002 = 2;
public const CONFLICT_003 = 3;
Expand Down Expand Up @@ -129,6 +137,9 @@ class FederatedUserService {
private $configService;


/** @var ICache */
private $cache;

/** @var FederatedUser */
private $currentUser = null;

Expand All @@ -154,6 +165,7 @@ class FederatedUserService {
* @param IUserSession $userSession
* @param IUserManager $userManager
* @param IGroupManager $groupManager
* @param ICacheFactory $cacheFactory
* @param FederatedEventService $federatedEventService
* @param MembershipService $membershipService
* @param CircleRequest $circleRequest
Expand All @@ -168,6 +180,7 @@ public function __construct(
IUserSession $userSession,
IUserManager $userManager,
IGroupManager $groupManager,
ICacheFactory $cacheFactory,
FederatedEventService $federatedEventService,
MembershipService $membershipService,
CircleRequest $circleRequest,
Expand All @@ -191,6 +204,8 @@ public function __construct(
$this->interfaceService = $interfaceService;
$this->configService = $configService;

$this->cache = $cacheFactory->createDistributed(self::CACHE_SINGLE_CIRCLE);

if (OC::$CLI) {
$this->setInitiatedByOcc(true);
}
Expand Down Expand Up @@ -908,7 +923,12 @@ private function getSingleCircle(FederatedUser $federatedUser, bool $generate =
}

try {
return $this->circleRequest->getSingleCircle($federatedUser);
return $this->getCachedSingleCircle($federatedUser);
} catch (SingleCircleNotFoundException $e) {
}

try {
$singleCircle = $this->circleRequest->getSingleCircle($federatedUser);
} catch (SingleCircleNotFoundException $e) {
if (!$generate) {
throw new SingleCircleNotFoundException();
Expand Down Expand Up @@ -959,9 +979,13 @@ private function getSingleCircle(FederatedUser $federatedUser, bool $generate =

$this->memberRequest->save($owner);
$this->membershipService->onUpdate($id);

$singleCircle = $this->circleRequest->getSingleCircle($federatedUser);
}

return $this->circleRequest->getSingleCircle($federatedUser);
$this->cacheSingleCircle($federatedUser, $singleCircle);

return $singleCircle;
}


Expand Down Expand Up @@ -1153,4 +1177,47 @@ public function getGroupCircle(string $groupId): Circle {

return $circle;
}


/**
* @param FederatedUser $federatedUser
*
* @return Circle
* @throws SingleCircleNotFoundException
*/
private function getCachedSingleCircle(FederatedUser $federatedUser): Circle {
$key = $this->generateCacheKey($federatedUser);
if (!$this->cache->hasKey($key)) {
throw new SingleCircleNotFoundException();
}

try {
/** @var Circle $singleCircle */
$singleCircle = $this->deserializeJson($this->cache->get($key), Circle::class);
} catch (InvalidItemException $e) {
throw new SingleCircleNotFoundException();
}

return $singleCircle;
}

/**
* @param FederatedUser $federatedUser
* @param Circle $singleCircle
*/
private function cacheSingleCircle(FederatedUser $federatedUser, Circle $singleCircle): void {
$key = $this->generateCacheKey($federatedUser);
$this->cache->set($key, json_encode($singleCircle), self::CACHE_SINGLE_CIRCLE_TTL);
}

/**
* @param FederatedUser $federatedUser
*
* @return string
*/
private function generateCacheKey(FederatedUser $federatedUser): string {
return $federatedUser->getInstance() . '#'
. $federatedUser->getUserType() . '#'
. $federatedUser->getUserId();
}
}