[CssSelector] Added cache on top of CssSelectorConverter

This commit is contained in:
Grégoire Pineau 2020-01-21 18:16:03 +01:00
parent 07818f2747
commit ed11d526d9
3 changed files with 21 additions and 1 deletions

View File

@ -27,6 +27,10 @@ use Symfony\Component\CssSelector\XPath\Translator;
class CssSelectorConverter
{
private $translator;
private $cache;
private static $xmlCache = [];
private static $htmlCache = [];
/**
* @param bool $html Whether HTML support should be enabled. Disable it for XML documents
@ -37,6 +41,9 @@ class CssSelectorConverter
if ($html) {
$this->translator->registerExtension(new HtmlExtension($this->translator));
$this->cache = &self::$htmlCache;
} else {
$this->cache = &self::$xmlCache;
}
$this->translator
@ -57,6 +64,6 @@ class CssSelectorConverter
*/
public function toXPath(string $cssExpr, string $prefix = 'descendant-or-self::')
{
return $this->translator->cssToXPath($cssExpr, $prefix);
return $this->cache[$prefix][$cssExpr] ?? $this->cache[$prefix][$cssExpr] = $this->translator->cssToXPath($cssExpr, $prefix);
}
}

View File

@ -26,6 +26,10 @@ class CssSelectorConverterTest extends TestCase
$this->assertEquals("descendant-or-self::h1[@class and contains(concat(' ', normalize-space(@class), ' '), ' foo ')]", $converter->toXPath('h1.foo'));
$this->assertEquals('descendant-or-self::foo:h1', $converter->toXPath('foo|h1'));
$this->assertEquals('descendant-or-self::h1', $converter->toXPath('H1'));
// Test the cache layer
$converter = new CssSelectorConverter();
$this->assertEquals('descendant-or-self::h1', $converter->toXPath('H1'));
}
public function testCssToXPathXml()
@ -33,6 +37,10 @@ class CssSelectorConverterTest extends TestCase
$converter = new CssSelectorConverter(false);
$this->assertEquals('descendant-or-self::H1', $converter->toXPath('H1'));
$converter = new CssSelectorConverter(false);
// Test the cache layer
$this->assertEquals('descendant-or-self::H1', $converter->toXPath('H1'));
}
public function testParseExceptions()

View File

@ -1,6 +1,11 @@
CHANGELOG
=========
5.1.0
-----
* Added an internal cache layer on top of the CssSelectorConverter
5.0.0
-----