Skip to content

Commit

Permalink
Optimize experiment stats (#54)
Browse files Browse the repository at this point in the history
  • Loading branch information
yatsenkolesh authored Jun 1, 2023
1 parent 8f3600c commit 68da114
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,17 @@ public function getUsersIdByBranchId(int $branchId): Collection
->get();
}

public function getUsersIdByExperimentId(int $experimentId): Collection
public function getUsersIdByExperimentId(int $experimentId, string $dateFrom, string $dateTo): Collection
{
/**
* @var Collection $collection
*/
return $this->query()
$query = $this->query()
->where('experiment_id', $experimentId)
->get();
->whereBetween('created_at', [$dateFrom, $dateTo]);

$collection = $query->get();
return $collection;
}

public function getExperimentBranchUserByExperimentIdAndExperimentUserId(int $experimentId, int $experimentUserId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public function getStatsByExperimentBranch(StatsQueryDTO $statsQueryDTO): StatsR
$displayEventsWithTypeIncrementalUnique = $this->getDisplayEventsWithTypeIncrementalUnique($allDisplayEvents);
$displayEventsWithTypeIncremental = $this->getDisplayEventsWithTypeIncremental($allDisplayEvents);
$uniqUsersIds = $this->getUniqUsersIds($allUserEvents);
$uniqRelatedUsersIds = $this->getUniqRelatedUsersIds(...$allRelatedUsers->all());
$uniqRelatedUsersIds = $this->getUniqRelatedUsersIds($allRelatedUsers);
$uniqUsers = $this->getFinalUniqUsers($uniqUsersIds, $uniqRelatedUsersIds);
$jointUsers = $this->getJointUsersFromEventsAndExperimentBranch(
$statsQueryDTO->getExperimentBranchId(),
Expand Down
87 changes: 66 additions & 21 deletions Modules/AbRouter/Services/Events/ExperimentStatsService.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
namespace Modules\AbRouter\Services\Events;

use Illuminate\Support\Collection;
use Modules\AbRouter\Models\Experiments\ExperimentUsers;
use Modules\AbRouter\Models\RelatedUsers\RelatedUser;
use Modules\AbRouter\Repositories\Events\EventsRepository;
use Modules\AbRouter\Repositories\Events\UserEventsRepository;
use Modules\AbRouter\Repositories\RelatedUser\RelatedUserRepository;
Expand Down Expand Up @@ -67,20 +69,22 @@ public function getStatsByExperiment(StatsQueryDTO $statsQueryDTO): StatsResults
$statsQueryDTO->getTag(),
$date['date_from'],
$date['date_to']
)
->load('relatedUsers');
);

$allRelatedUsers = RelatedUser::query()
->whereBetween('created_at', [$date['date_from'], $date['date_to']])
->where('owner_id', $statsQueryDTO->getOwnerId())
->get();

$totalUsers = $this->getTotalUsers(
$statsQueryDTO->getOwnerId(),
$statsQueryDTO->getExperimentId(),
$date['date_from'],
$date['date_to'],
$allUserEvents
$allUserEvents,
$allRelatedUsers
);

$allRelatedUsers = $allUserEvents
->pluck('relatedUsers')
->flatten();

$allDisplayEvents = $this->getDisplayEvents($statsQueryDTO->getOwnerId());
$displayEventsWithTypeSummarizable = $this->getDisplayEventsWithTypeSummarizable($allDisplayEvents);
Expand All @@ -89,7 +93,7 @@ public function getStatsByExperiment(StatsQueryDTO $statsQueryDTO): StatsResults
$uniqUsersIds = $this->getUniqUsersIds($allUserEvents);
$uniqRelatedUsersIds = $this
->getUniqRelatedUsersIds(
...$allRelatedUsers->all()
$allRelatedUsers
);

$uniqUsers = $this->getFinalUniqUsers($uniqUsersIds, $uniqRelatedUsersIds);
Expand All @@ -98,7 +102,12 @@ public function getStatsByExperiment(StatsQueryDTO $statsQueryDTO): StatsResults
$statsQueryDTO->getExperimentId()
);

$jointUsers = $this->getJointUsersFromEventsAndExperiment($experiment, $uniqUsers);
$jointUsers = $this->getJointUsersFromEventsAndExperiment(
$experiment,
$uniqUsers,
$date['date_from'],
$date['date_to']
);

$incrementalCounters = [];
$incrementalUniqueCounters = [];
Expand Down Expand Up @@ -179,9 +188,16 @@ public function getStatsByExperiment(StatsQueryDTO $statsQueryDTO): StatsResults
);
}

private function getExperimentUsersIdByExperimentId(int $experimentId): Collection
{
return $this->experimentBranchUserRepository->getUsersIdByExperimentId($experimentId);
private function getExperimentUsersIdByExperimentId(
int $experimentId,
string $dateFrom,
string $dateTo
): Collection {
return $this->experimentBranchUserRepository->getUsersIdByExperimentId(
$experimentId,
$dateFrom,
$dateTo
);
}

private function getExperimentIdById(string $experimentId , int $owner): Experiment
Expand All @@ -203,13 +219,29 @@ private function getExperiment(

private function getJointUsersFromEventsAndExperiment(
Experiment $experiment,
array $uniqUsers
array $uniqUsers,
string $dateFrom,
string $dateTo
): array {
$jointUsers = [];

$usersId = $this
->getExperimentUsersIdByExperimentId($experiment->id)
->load('experimentBranch', 'experimentUser');
->getExperimentUsersIdByExperimentId(
$experiment->id,
$dateFrom,
$dateTo
)
->load('experimentBranch');

$allExperimentUsers = ExperimentUsers::query()
->where('owner_id', $experiment->owner_id)
->get()
->keyBy('id');

foreach ($usersId as $key => $userId) {
$userId->experimentUser = $allExperimentUsers->get($userId->experiment_user_id);
$usersId[$key] = $userId;
}

$branchesNames = $usersId
->pluck('experimentBranch')
Expand Down Expand Up @@ -243,7 +275,8 @@ private function getTotalUsers(
$experimentId,
string $dateFrom,
string $dateTo,
?Collection $allUserEvents = null
?Collection $allUserEvents = null,
?Collection $allRelatedUsers = null
): int {
if ($allUserEvents === null) {
$allUserEvents = $this
Expand All @@ -257,23 +290,35 @@ private function getTotalUsers(
->load('relatedUsers');
}

$allRelatedUsers = $allUserEvents
->pluck('relatedUsers')
->flatten();
if ($allRelatedUsers === null) {
$allRelatedUsers = $allUserEvents
->pluck('relatedUsers')
->flatten();
}

$uniqUsersIds = $this->getUniqUsersIds($allUserEvents);

$uniqRelatedUsersIds = $this->getUniqRelatedUsersIds(
...$allRelatedUsers->all()
$allRelatedUsers
);

$experiment = $this->getExperiment(
$owner,
$experimentId
);
$uniqUsers = $this->getFinalUniqUsers($uniqUsersIds, $uniqRelatedUsersIds);

//using too much memory here
$jointUsers = $this->getJointUsersFromEventsAndExperiment($experiment, $uniqUsers);
$totalUsers = [];

// die('t');

$jointUsers = $this->getJointUsersFromEventsAndExperiment(
$experiment,
$uniqUsers,
$dateFrom,
$dateTo
);
$totalUsers = [];
foreach ($jointUsers as $branchName => $userSignatures) {
$totalUsers = array_merge($totalUsers, $userSignatures);
}
Expand Down
22 changes: 13 additions & 9 deletions Modules/AbRouter/Services/Events/SimpleStatsService.php
Original file line number Diff line number Diff line change
Expand Up @@ -150,11 +150,12 @@ public function getStats(StatsQueryDTO $statsQueryDTO): StatsResultsDTO

protected function getUniqUsersIds(Collection $allUserEvents): array
{
$users = $allUserEvents->reduce(function (array $acc, Event $event) {
$users = [];
foreach ($allUserEvents as $event) {
$userId = !empty($event->user_id) ? $event->user_id : $event->temporary_user_id;
$acc[] = $userId;
return $acc;
}, []);
$users[] = $userId;
}


$users = array_unique($users);
$usersFlip = array_flip($users);
Expand Down Expand Up @@ -319,13 +320,16 @@ protected function convertDateTime($dateFrom = null, $dateTo = null): array
return ['date_from' => $dateFrom, 'date_to' => $dateTo];
}

protected function getUniqRelatedUsersIds(RelatedUser...$relatedUsers): array
protected function getUniqRelatedUsersIds(Collection $relatedUsers): array
{
return array_reduce($relatedUsers, function (array $acc, RelatedUser $relatedUser) {
$acc = [];
foreach ($relatedUsers as $relatedUser) {
/**
* @var RelatedUser $relatedUser
*/
$acc[] = $relatedUser->user_id;
$acc[] = $relatedUser->related_user_id;

return $acc;
}, []);
}
return $acc;
}
}

0 comments on commit 68da114

Please sign in to comment.