Skip to content

Commit

Permalink
lighten select for single circle
Browse files Browse the repository at this point in the history
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
  • Loading branch information
ArtificialOwl committed Dec 14, 2021
1 parent 0f103be commit 50eddb3
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 8 deletions.
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 @@ -915,7 +930,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 @@ -966,9 +986,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 @@ -1160,4 +1184,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();
}
}

0 comments on commit 50eddb3

Please sign in to comment.