From 114b27079e3df8a0c960070b278476b345462340 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 25 Nov 2014 22:04:50 +0100 Subject: [PATCH] Added a routine that will cache stuff that costs a lot of queries. --- app/controllers/AccountController.php | 17 +++++---- app/controllers/TransactionController.php | 23 +++++++++++++ app/lib/FireflyIII/Event/Transaction.php | 38 +++++++++++++++++++++ app/lib/FireflyIII/Shared/Toolkit/Steam.php | 17 +++++++-- bootstrap/start.php | 1 + 5 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 app/lib/FireflyIII/Event/Transaction.php diff --git a/app/controllers/AccountController.php b/app/controllers/AccountController.php index 8401bde5d5..bf1e65585c 100644 --- a/app/controllers/AccountController.php +++ b/app/controllers/AccountController.php @@ -198,13 +198,18 @@ class AccountController extends BaseController $accounts->each( function (Account $account) { - //$transaction = $account->transactions()->orderBy('updated_at', 'DESC')->first(); - $transaction = null; - - if (is_null($transaction)) { - $account->lastActionDate = null; + if (Cache::has('account.' . $account->id . '.lastActivityDate')) { + \Log::debug('Cache has latest activity date for ' . $account->name . ', and it is: ' . \Cache::get('account.' . $account->id . '.lastActivityDate')); + $account->lastActionDate = Cache::get('account.' . $account->id . '.lastActivityDate'); } else { - $account->lastActionDate = $transaction->updated_at; + $transaction = $account->transactions()->orderBy('updated_at', 'DESC')->first(); + if (is_null($transaction)) { + $account->lastActionDate = null; + Cache::forever('account.' . $account->id . '.lastActivityDate', 0); + } else { + $account->lastActionDate = $transaction->updated_at; + Cache::forever('account.' . $account->id . '.lastActivityDate', $transaction->updated_at); + } } } diff --git a/app/controllers/TransactionController.php b/app/controllers/TransactionController.php index 2f87824de2..c0c21ee36c 100644 --- a/app/controllers/TransactionController.php +++ b/app/controllers/TransactionController.php @@ -106,6 +106,14 @@ class TransactionController extends BaseController * Trigger creation of new piggy bank event */ Event::fire('transactionJournal.destroy', [$transactionJournal]); // new and used. + /* + * Since this event will also destroy both transactions, trigger on those as + * well because we might want to update some caches and what-not. + */ + /** @var Transaction $transaction */ + foreach ($transactionJournal->transactions as $transaction) { + Event::fire('transaction.destroy', [$transaction]); + } /** @var \FireflyIII\Database\TransactionJournal $repository */ $repository = App::make('FireflyIII\Database\TransactionJournal'); @@ -363,6 +371,13 @@ class TransactionController extends BaseController $piggyID = intval(Input::get('piggybank_id')); } Event::fire('transactionJournal.store', [$journal, $piggyID]); // new and used. + /* + * Also trigger on both transactions. + */ + /** @var Transaction $transaction */ + foreach ($journal->transactions as $transaction) { + Event::fire('transaction.store', [$transaction]); + } if ($data['post_submit_action'] == 'create_another') { return Redirect::route('transactions.create', $what)->withInput(); @@ -406,6 +421,14 @@ class TransactionController extends BaseController Session::flash('success', 'Transaction updated!'); Event::fire('transactionJournal.update', [$journal]); // new and used. + /* + * Also trigger on both transactions. + */ + /** @var Transaction $transaction */ + foreach ($journal->transactions as $transaction) { + Event::fire('transaction.update', [$transaction]); + } + if (Input::get('post_submit_action') == 'return_to_edit') { return Redirect::route('transactions.edit', $journal->id)->withInput(); } else { diff --git a/app/lib/FireflyIII/Event/Transaction.php b/app/lib/FireflyIII/Event/Transaction.php new file mode 100644 index 0000000000..285e942875 --- /dev/null +++ b/app/lib/FireflyIII/Event/Transaction.php @@ -0,0 +1,38 @@ +account_id . '.latestBalance'); + \Cache::forget('account.' . $transaction->account_id . '.lastActivityDate'); + } + + public function store(\Transaction $transaction) + { + \Cache::forget('account.' . $transaction->account_id . '.latestBalance'); + \Cache::forget('account.' . $transaction->account_id . '.lastActivityDate'); + } + + /** + * @param Dispatcher $events + */ + public function subscribe(Dispatcher $events) + { + // triggers when others are updated. + $events->listen('transaction.store', 'FireflyIII\Event\Transaction@store'); + $events->listen('transaction.update', 'FireflyIII\Event\Transaction@update'); + $events->listen('transaction.destroy', 'FireflyIII\Event\Transaction@destroy'); + } + + public function update(\Transaction $transaction) + { + \Cache::forget('account.' . $transaction->account_id . '.latestBalance'); + \Cache::forget('account.' . $transaction->account_id . '.lastActivityDate'); + } +} \ No newline at end of file diff --git a/app/lib/FireflyIII/Shared/Toolkit/Steam.php b/app/lib/FireflyIII/Shared/Toolkit/Steam.php index 3b52592a6b..b8e79ef4a1 100644 --- a/app/lib/FireflyIII/Shared/Toolkit/Steam.php +++ b/app/lib/FireflyIII/Shared/Toolkit/Steam.php @@ -23,13 +23,26 @@ class Steam */ public function balance(\Account $account, Carbon $date = null) { - $date = is_null($date) ? Carbon::now() : $date; + $latest = false; + if (is_null($date)) { + $latest = true; + if (\Cache::has('account.' . $account->id . '.latestBalance')) { + \Log::debug('Cache has latest balance for ' . $account->name . ', and it is: ' . \Cache::get('account.' . $account->id . '.latestBalance')); - return floatval( + return \Cache::get('account.' . $account->id . '.latestBalance'); + } + } + $date = is_null($date) ? Carbon::now() : $date; + $balance = floatval( $account->transactions()->leftJoin( 'transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id' )->where('transaction_journals.date', '<=', $date->format('Y-m-d'))->sum('transactions.amount') ); + if ($latest === true) { + \Cache::forever('account.' . $account->id . '.latestBalance', $balance); + } + + return $balance; } /** diff --git a/bootstrap/start.php b/bootstrap/start.php index e05212f1db..cb529a7664 100644 --- a/bootstrap/start.php +++ b/bootstrap/start.php @@ -91,6 +91,7 @@ require $framework . '/Illuminate/Foundation/start.php'; Event::subscribe('FireflyIII\Event\Piggybank'); Event::subscribe('FireflyIII\Event\Budget'); Event::subscribe('FireflyIII\Event\TransactionJournal'); +Event::subscribe('FireflyIII\Event\Transaction'); // event that creates a relationship between transaction journals and recurring events when created. // event that updates the relationship between transaction journals and recurring events when edited.