Skip to content

Commit

Permalink
Merge pull request #44 from moufmouf/cache_build
Browse files Browse the repository at this point in the history
Improving performance
  • Loading branch information
moufmouf committed Apr 24, 2019
2 parents a6efcac + f41860a commit 18b9848
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
15 changes: 13 additions & 2 deletions src/Mouf/Database/MagicQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Mouf\Database;

use Doctrine\Common\Cache\VoidCache;
use function hash;
use Mouf\Database\MagicQuery\Twig\SqlTwigEnvironmentFactory;
use Mouf\Database\SchemaAnalyzer\SchemaAnalyzer;
use PHPSQLParser\PHPSQLParser;
Expand Down Expand Up @@ -83,9 +84,19 @@ public function build($sql, array $parameters = array())
if ($this->enableTwig) {
$sql = $this->getTwigEnvironment()->render($sql, $parameters);
}
$select = $this->parse($sql);

return $this->toSql($select, $parameters);
$availableParameterKeys = array_keys(array_filter($parameters, static function($param) { return $param !== null;}));
// We choose md4 because it is fast.
$cacheKey = 'request_build_'.hash('md4', $sql.'__'.implode('_/_', $availableParameterKeys));
$newSql = $this->cache->fetch($cacheKey);
if ($newSql === false) {
$select = $this->parse($sql);
$newSql = $this->toSql($select, $parameters);

$this->cache->save($cacheKey, $newSql);
}

return $newSql;
}

/**
Expand Down
2 changes: 2 additions & 0 deletions tests/Mouf/Database/MagicQueryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public function testStandardSelect()

$sql = 'SELECT id FROM users WHERE name LIKE :name LIMIT 2, :limit';
$this->assertEquals("SELECT id FROM users WHERE name LIKE 'foo' LIMIT 2, 10", self::simplifySql($magicQuery->build($sql, ['name' => 'foo', 'limit' => 10])));
// Test cache
$this->assertEquals("SELECT id FROM users WHERE name LIKE 'bar' LIMIT 2, 10", self::simplifySql($magicQuery->build($sql, ['name' => 'bar', 'limit' => 10])));

try {
$exceptionOccurred = false;
Expand Down

0 comments on commit 18b9848

Please sign in to comment.