Added a routine that will cache stuff that costs a lot of queries.

This commit is contained in:
James Cole 2014-11-25 22:04:50 +01:00
parent 6e19bc01f5
commit 114b27079e
5 changed files with 88 additions and 8 deletions

View File

@ -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);
}
}
}

View File

@ -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 {

View File

@ -0,0 +1,38 @@
<?php
namespace FireflyIII\Event;
use Illuminate\Events\Dispatcher;
class Transaction
{
public function destroy(\Transaction $transaction)
{
\Cache::forget('account.' . $transaction->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');
}
}

View File

@ -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;
}
/**

View File

@ -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.