From 5076ec7e90d46609684c618cfe9e5a04aca59061 Mon Sep 17 00:00:00 2001 From: Adrien Brault Date: Thu, 19 Sep 2013 22:14:47 -0700 Subject: [PATCH] [ExpressionLanguage] optimized serialization of nodes and expressions --- .../ExpressionLanguage/Node/BinaryNode.php | 16 ++++++++-------- .../ExpressionLanguage/Node/UnaryNode.php | 4 ++-- .../Tests/ExpressionTest.php | 18 ++++++++++++++++++ .../Tests/Node/ArrayNodeTest.php | 12 ++++++++++++ .../Tests/Node/NodeTest.php | 10 ++++++++++ .../Tests/ParsedExpressionTest.php | 19 +++++++++++++++++++ 6 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 src/Symfony/Component/ExpressionLanguage/Tests/ExpressionTest.php create mode 100644 src/Symfony/Component/ExpressionLanguage/Tests/ParsedExpressionTest.php diff --git a/src/Symfony/Component/ExpressionLanguage/Node/BinaryNode.php b/src/Symfony/Component/ExpressionLanguage/Node/BinaryNode.php index c2bd58df73..54e1f88107 100644 --- a/src/Symfony/Component/ExpressionLanguage/Node/BinaryNode.php +++ b/src/Symfony/Component/ExpressionLanguage/Node/BinaryNode.php @@ -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) { diff --git a/src/Symfony/Component/ExpressionLanguage/Node/UnaryNode.php b/src/Symfony/Component/ExpressionLanguage/Node/UnaryNode.php index 3ec88d1179..73aef144af 100644 --- a/src/Symfony/Component/ExpressionLanguage/Node/UnaryNode.php +++ b/src/Symfony/Component/ExpressionLanguage/Node/UnaryNode.php @@ -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(')') ; diff --git a/src/Symfony/Component/ExpressionLanguage/Tests/ExpressionTest.php b/src/Symfony/Component/ExpressionLanguage/Tests/ExpressionTest.php new file mode 100644 index 0000000000..be87321fd3 --- /dev/null +++ b/src/Symfony/Component/ExpressionLanguage/Tests/ExpressionTest.php @@ -0,0 +1,18 @@ +assertEquals($expression, $unserializedExpression); + } +} diff --git a/src/Symfony/Component/ExpressionLanguage/Tests/Node/ArrayNodeTest.php b/src/Symfony/Component/ExpressionLanguage/Tests/Node/ArrayNodeTest.php index 24d1bb06fb..f2342f2850 100644 --- a/src/Symfony/Component/ExpressionLanguage/Tests/Node/ArrayNodeTest.php +++ b/src/Symfony/Component/ExpressionLanguage/Tests/Node/ArrayNodeTest.php @@ -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( diff --git a/src/Symfony/Component/ExpressionLanguage/Tests/Node/NodeTest.php b/src/Symfony/Component/ExpressionLanguage/Tests/Node/NodeTest.php index 4365e8a1f6..6063c27ba4 100644 --- a/src/Symfony/Component/ExpressionLanguage/Tests/Node/NodeTest.php +++ b/src/Symfony/Component/ExpressionLanguage/Tests/Node/NodeTest.php @@ -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); + } } diff --git a/src/Symfony/Component/ExpressionLanguage/Tests/ParsedExpressionTest.php b/src/Symfony/Component/ExpressionLanguage/Tests/ParsedExpressionTest.php new file mode 100644 index 0000000000..c91b9ef666 --- /dev/null +++ b/src/Symfony/Component/ExpressionLanguage/Tests/ParsedExpressionTest.php @@ -0,0 +1,19 @@ +assertEquals($expression, $unserializedExpression); + } +}