From 1b3592d9596033e542098889002cf58d3b9745c9 Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 31 Dec 2015 07:49:19 +0100 Subject: [PATCH] Optimise chart. --- .../Controllers/Chart/CategoryController.php | 43 +++++++++++++++++-- .../Category/SingleCategoryRepository.php | 8 +--- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Chart/CategoryController.php b/app/Http/Controllers/Chart/CategoryController.php index bc37dc0517..2271330061 100644 --- a/app/Http/Controllers/Chart/CategoryController.php +++ b/app/Http/Controllers/Chart/CategoryController.php @@ -63,12 +63,18 @@ class CategoryController extends Controller if ($cache->has()) { return Response::json($cache->get()); // @codeCoverageIgnore } + $spentArray = $repository->spentPerDay($category, $start, $end); + $earnedArray = $repository->earnedPerDay($category, $start, $end); + while ($start <= $end) { $currentEnd = Navigation::endOfPeriod($start, $range); - $spent = $repository->spentInPeriod($category, $start, $currentEnd); - $earned = $repository->earnedInPeriod($category, $start, $currentEnd); - $date = Navigation::periodShow($start, $range); + + // get the sum from $spentArray and $earnedArray: + $spent = $this->getSumOfRange($start, $currentEnd, $spentArray); + $earned = $this->getSumOfRange($start, $currentEnd, $earnedArray); + + $date = Navigation::periodShow($start, $range); $entries->push([clone $start, $date, $spent, $earned]); $start = Navigation::addPeriod($start, $range, 0); } @@ -85,6 +91,7 @@ class CategoryController extends Controller } + /** * Show this month's category overview. * @@ -251,9 +258,9 @@ class CategoryController extends Controller $entries = new Collection; // get amount earned in period, grouped by day. + // get amount spent in period, grouped by day. $spentArray = $repository->spentPerDay($category, $start, $end); $earnedArray = $repository->earnedPerDay($category, $start, $end); - // get amount spent in period, grouped by day. while ($start <= $end) { $str = $start->format('Y-m-d'); @@ -453,4 +460,32 @@ class CategoryController extends Controller return $data; } + /** + * Take the array as returned by SingleCategoryRepositoryInterface::spentPerDay and SingleCategoryRepositoryInterface::earnedByDay + * and sum up everything in the array in the given range. + * + * @param Carbon $start + * @param Carbon $end + * @param array $array + * + * @return string + */ + protected function getSumOfRange(Carbon $start, Carbon $end, array $array) + { + bcscale(2); + $sum = '0'; + $currentStart = clone $start; // to not mess with the original one + $currentEnd = clone $end; // to not mess with the original one + + while ($currentStart <= $currentEnd) { + $date = $currentStart->format('Y-m-d'); + if (isset($array[$date])) { + $sum = bcadd($sum, $array[$date]); + } + $currentStart->addDay(); + } + + return $sum; + } + } diff --git a/app/Repositories/Category/SingleCategoryRepository.php b/app/Repositories/Category/SingleCategoryRepository.php index eca6aafec8..41b237a07f 100644 --- a/app/Repositories/Category/SingleCategoryRepository.php +++ b/app/Repositories/Category/SingleCategoryRepository.php @@ -107,14 +107,12 @@ class SingleCategoryRepository extends ComponentRepository implements SingleCate public function earnedPerDay(Category $category, Carbon $start, Carbon $end) { /** @var Collection $query */ - $query = Auth::user()->transactionJournals() + $query = $category->transactionJournals() ->transactionTypes([TransactionType::DEPOSIT]) - ->leftJoin('category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') ->where('transactions.amount', '>', 0) ->before($end) ->after($start) - ->where('category_transaction_journal.category_id', $category->id) ->groupBy('date')->get(['transaction_journals.date as dateFormatted', DB::Raw('SUM(`transactions`.`amount`) AS `sum`')]); $return = []; @@ -245,14 +243,12 @@ class SingleCategoryRepository extends ComponentRepository implements SingleCate public function spentPerDay(Category $category, Carbon $start, Carbon $end) { /** @var Collection $query */ - $query = Auth::user()->transactionJournals() + $query = $category->transactionJournals() ->transactionTypes([TransactionType::WITHDRAWAL]) - ->leftJoin('category_transaction_journal', 'category_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') ->where('transactions.amount', '<', 0) ->before($end) ->after($start) - ->where('category_transaction_journal.category_id', $category->id) ->groupBy('date')->get(['transaction_journals.date as dateFormatted', DB::Raw('SUM(`transactions`.`amount`) AS `sum`')]); $return = [];