[ExpressionLanguage] optimized serialization of nodes and expressions

This commit is contained in:
Adrien Brault 2013-09-19 22:14:47 -07:00 committed by Fabien Potencier
parent 60b9f856fd
commit 5076ec7e90
6 changed files with 69 additions and 10 deletions

View File

@ -15,13 +15,13 @@ use Symfony\Component\ExpressionLanguage\Compiler;
class BinaryNode extends Node
{
private $operators = array(
private static $operators = array(
'~' => '.',
'and' => '&&',
'or' => '||',
);
private $functions = array(
private static $functions = array(
'**' => 'pow',
'..' => 'range',
'in' => 'in_array',
@ -50,9 +50,9 @@ class BinaryNode extends Node
return;
}
if (isset($this->functions[$operator])) {
if (isset(self::$functions[$operator])) {
$compiler
->raw(sprintf('%s(', $this->functions[$operator]))
->raw(sprintf('%s(', self::$functions[$operator]))
->compile($this->nodes['left'])
->raw(', ')
->compile($this->nodes['right'])
@ -62,8 +62,8 @@ class BinaryNode extends Node
return;
}
if (isset($this->operators[$operator])) {
$operator = $this->operators[$operator];
if (isset(self::$operators[$operator])) {
$operator = self::$operators[$operator];
}
$compiler
@ -83,12 +83,12 @@ class BinaryNode extends Node
$left = $this->nodes['left']->evaluate($functions, $values);
$right = $this->nodes['right']->evaluate($functions, $values);
if (isset($this->functions[$operator])) {
if (isset(self::$functions[$operator])) {
if ('not in' == $operator) {
return !call_user_func('in_array', $left, $right);
}
return call_user_func($this->functions[$operator], $left, $right);
return call_user_func(self::$functions[$operator], $left, $right);
}
switch ($operator) {

View File

@ -15,7 +15,7 @@ use Symfony\Component\ExpressionLanguage\Compiler;
class UnaryNode extends Node
{
private $operators = array(
private static $operators = array(
'!' => '!',
'not' => '!',
'+' => '+',
@ -32,7 +32,7 @@ class UnaryNode extends Node
{
$compiler
->raw('(')
->raw($this->operators[$this->attributes['operator']])
->raw(self::$operators[$this->attributes['operator']])
->compile($this->nodes['node'])
->raw(')')
;

View File

@ -0,0 +1,18 @@
<?php
namespace Symfony\Component\ExpressionLanguage\Tests;
use Symfony\Component\ExpressionLanguage\Expression;
class ExpressionTest extends \PHPUnit_Framework_TestCase
{
public function testSerialization()
{
$expression = new Expression('kernel.boot()');
$serializedExpression = serialize($expression);
$unserializedExpression = unserialize($serializedExpression);
$this->assertEquals($expression, $unserializedExpression);
}
}

View File

@ -16,6 +16,18 @@ use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
class ArrayNodeTest extends AbstractNodeTest
{
public function testSerialization()
{
$node = $this->createArrayNode();
$node->addElement(new ConstantNode('foo'));
$serializedNode = serialize($node);
$unserializedNode = unserialize($serializedNode);
$this->assertEquals($node, $unserializedNode);
$this->assertNotEquals($this->createArrayNode(), $unserializedNode);
}
public function getEvaluateData()
{
return array(

View File

@ -27,4 +27,14 @@ Node(
EOF
, (string) $node);
}
public function testSerialization()
{
$node = new Node(array('foo' => 'bar'), array('bar' => 'foo'));
$serializedNode = serialize($node);
$unserializedNode = unserialize($serializedNode);
$this->assertEquals($node, $unserializedNode);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace Symfony\Component\ExpressionLanguage\Tests;
use Symfony\Component\ExpressionLanguage\Node\ConstantNode;
use Symfony\Component\ExpressionLanguage\ParsedExpression;
class ParsedExpressionTest extends \PHPUnit_Framework_TestCase
{
public function testSerialization()
{
$expression = new ParsedExpression('25', new ConstantNode('25'));
$serializedExpression = serialize($expression);
$unserializedExpression = unserialize($serializedExpression);
$this->assertEquals($expression, $unserializedExpression);
}
}