Просмотр исходного кода

Do not extend EVALSHA for ScriptCommand class.

Daniele Alessandri 9 лет назад
Родитель
Сommit
d72a1b5550
3 измененных файлов с 101 добавлено и 32 удалено
  1. 1 4
      src/Client.php
  2. 32 4
      src/Command/ScriptCommand.php
  3. 68 24
      tests/Predis/Command/ScriptCommandTest.php

+ 1 - 4
src/Client.php

@@ -373,10 +373,7 @@ class Client implements ClientInterface, \IteratorAggregate
     protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $response)
     {
         if ($command instanceof ScriptCommand && $response->getErrorType() === 'NOSCRIPT') {
-            $eval = $this->createCommand('EVAL');
-            $eval->setRawArguments($command->getEvalArguments());
-
-            $response = $this->executeCommand($eval);
+            $response = $this->executeCommand($command->getEvalCommand());
 
             if (!$response instanceof ResponseInterface) {
                 $response = $command->parseResponse($response);

+ 32 - 4
src/Command/ScriptCommand.php

@@ -11,8 +11,6 @@
 
 namespace Predis\Command;
 
-use Predis\Command\Redis\EVALSHA;
-
 /**
  * Base class used to implement an higher level abstraction for commands based
  * on Lua scripting with EVAL and EVALSHA.
@@ -21,8 +19,16 @@ use Predis\Command\Redis\EVALSHA;
  *
  * @author Daniele Alessandri <suppakilla@gmail.com>
  */
-abstract class ScriptCommand extends EVALSHA
+abstract class ScriptCommand extends Command
 {
+    /**
+     * {@inheritdoc}
+     */
+    public function getId()
+    {
+        return 'EVALSHA';
+    }
+
     /**
      * Gets the body of a Lua script.
      *
@@ -30,6 +36,16 @@ abstract class ScriptCommand extends EVALSHA
      */
     abstract public function getScript();
 
+    /**
+     * Calculates the SHA1 hash of the body of the script.
+     *
+     * @return string SHA1 hash.
+     */
+    public function getScriptHash()
+    {
+        return sha1($this->getScript());
+    }
+
     /**
      * Specifies the number of arguments that should be considered as keys.
      *
@@ -63,12 +79,14 @@ abstract class ScriptCommand extends EVALSHA
             $numkeys = count($arguments) + $numkeys;
         }
 
-        $arguments = array_merge(array(sha1($this->getScript()), (int) $numkeys), $arguments);
+        $arguments = array_merge(array($this->getScriptHash(), (int) $numkeys), $arguments);
 
         parent::setArguments($arguments);
     }
 
     /**
+     * Returns arguments for EVAL command.
+     *
      * @return array
      */
     public function getEvalArguments()
@@ -78,4 +96,14 @@ abstract class ScriptCommand extends EVALSHA
 
         return $arguments;
     }
+
+    /**
+     * Returns the equivalent EVAL command as a raw command instance.
+     *
+     * @return RawCommand
+     */
+    public function getEvalCommand()
+    {
+        return new RawCommand('EVAL', $this->getEvalArguments());
+    }
 }

+ 68 - 24
tests/Predis/Command/ScriptCommandTest.php

@@ -24,12 +24,22 @@ class ScriptCommandTest extends PredisTestCase
     /**
      * @group disconnected
      */
-    public function testGetArguments()
+    public function testGetId()
+    {
+        $command = $this->getMock('Predis\Command\ScriptCommand', array('getScript'));
+
+        $this->assertSame('EVALSHA', $command->getId());
+    }
+
+    /**
+     * @group disconnected
+     */
+    public function testGetScriptHash()
     {
         $arguments = array('key1', 'key2', 'value1', 'value2');
 
         $command = $this->getMock('Predis\Command\ScriptCommand', array('getScript', 'getKeysCount'));
-        $command->expects($this->once())
+        $command->expects($this->exactly(2))
                 ->method('getScript')
                 ->will($this->returnValue(self::LUA_SCRIPT));
         $command->expects($this->once())
@@ -37,13 +47,13 @@ class ScriptCommandTest extends PredisTestCase
                 ->will($this->returnValue(2));
         $command->setArguments($arguments);
 
-        $this->assertSame(array_merge(array(self::LUA_SCRIPT_SHA1, 2), $arguments), $command->getArguments());
+        $this->assertSame(self::LUA_SCRIPT_SHA1, $command->getScriptHash());
     }
 
     /**
      * @group disconnected
      */
-    public function testGetArgumentsWithNegativeKeysCount()
+    public function testGetKeys()
     {
         $arguments = array('key1', 'key2', 'value1', 'value2');
 
@@ -51,37 +61,53 @@ class ScriptCommandTest extends PredisTestCase
         $command->expects($this->once())
                 ->method('getScript')
                 ->will($this->returnValue(self::LUA_SCRIPT));
-        $command->expects($this->once())
+        $command->expects($this->exactly(2))
                 ->method('getKeysCount')
-                ->will($this->returnValue(-2));
+                ->will($this->returnValue(2));
         $command->setArguments($arguments);
 
-        $this->assertSame(array_merge(array(self::LUA_SCRIPT_SHA1, 2), $arguments), $command->getArguments());
+        $this->assertSame(array('key1', 'key2'), $command->getKeys());
     }
 
     /**
      * @group disconnected
      */
-    public function testGetArgumentsWithZeroKeysCount()
+    public function testGetKeysWithZeroKeysCount()
     {
         $arguments = array('value1', 'value2', 'value3');
 
-        $command = $this->getMock('Predis\Command\ScriptCommand', array('getScript', 'getKeysCount'));
+        $command = $this->getMock('Predis\Command\ScriptCommand', array('getScript'));
         $command->expects($this->once())
                 ->method('getScript')
                 ->will($this->returnValue(self::LUA_SCRIPT));
+        $command->setArguments($arguments);
+
+        $this->assertSame(array(), $command->getKeys());
+    }
+
+    /**
+     * @group disconnected
+     */
+    public function testGetKeysWithNegativeKeysCount()
+    {
+        $arguments = array('key1', 'key2', 'value1', 'value2');
+
+        $command = $this->getMock('Predis\Command\ScriptCommand', array('getScript', 'getKeysCount'));
         $command->expects($this->once())
+                ->method('getScript')
+                ->will($this->returnValue(self::LUA_SCRIPT));
+        $command->expects($this->exactly(2))
                 ->method('getKeysCount')
-                ->will($this->returnValue(0));
+                ->will($this->returnValue(-2));
         $command->setArguments($arguments);
 
-        $this->assertSame(array_merge(array(self::LUA_SCRIPT_SHA1, 0), $arguments), $command->getArguments());
+        $this->assertSame(array('key1', 'key2'), $command->getKeys());
     }
 
     /**
      * @group disconnected
      */
-    public function testGetKeys()
+    public function testGetArguments()
     {
         $arguments = array('key1', 'key2', 'value1', 'value2');
 
@@ -89,18 +115,18 @@ class ScriptCommandTest extends PredisTestCase
         $command->expects($this->once())
                 ->method('getScript')
                 ->will($this->returnValue(self::LUA_SCRIPT));
-        $command->expects($this->exactly(2))
+        $command->expects($this->once())
                 ->method('getKeysCount')
                 ->will($this->returnValue(2));
         $command->setArguments($arguments);
 
-        $this->assertSame(array('key1', 'key2'), $command->getKeys());
+        $this->assertSame(array_merge(array(self::LUA_SCRIPT_SHA1, 2), $arguments), $command->getArguments());
     }
 
     /**
      * @group disconnected
      */
-    public function testGetKeysWithZeroKeysCount()
+    public function testGetArgumentsWithZeroKeysCount()
     {
         $arguments = array('value1', 'value2', 'value3');
 
@@ -108,18 +134,15 @@ class ScriptCommandTest extends PredisTestCase
         $command->expects($this->once())
                 ->method('getScript')
                 ->will($this->returnValue(self::LUA_SCRIPT));
-        $command->expects($this->exactly(2))
-                ->method('getKeysCount')
-                ->will($this->returnValue(0));
         $command->setArguments($arguments);
 
-        $this->assertSame(array(), $command->getKeys());
+        $this->assertSame(array_merge(array(self::LUA_SCRIPT_SHA1, 0), $arguments), $command->getArguments());
     }
 
     /**
      * @group disconnected
      */
-    public function testGetKeysWithNegativeKeysCount()
+    public function testGetArgumentsWithNegativeKeysCount()
     {
         $arguments = array('key1', 'key2', 'value1', 'value2');
 
@@ -127,23 +150,42 @@ class ScriptCommandTest extends PredisTestCase
         $command->expects($this->once())
                 ->method('getScript')
                 ->will($this->returnValue(self::LUA_SCRIPT));
-        $command->expects($this->exactly(2))
+        $command->expects($this->once())
                 ->method('getKeysCount')
                 ->will($this->returnValue(-2));
         $command->setArguments($arguments);
 
-        $this->assertSame(array('key1', 'key2'), $command->getKeys());
+        $this->assertSame(array_merge(array(self::LUA_SCRIPT_SHA1, 2), $arguments), $command->getArguments());
     }
 
     /**
      * @group disconnected
      */
-    public function testGetScriptHash()
+    public function testGetEvalArguments()
     {
         $arguments = array('key1', 'key2', 'value1', 'value2');
 
         $command = $this->getMock('Predis\Command\ScriptCommand', array('getScript', 'getKeysCount'));
+        $command->expects($this->exactly(2))
+                ->method('getScript')
+                ->will($this->returnValue(self::LUA_SCRIPT));
         $command->expects($this->once())
+                ->method('getKeysCount')
+                ->will($this->returnValue(2));
+        $command->setArguments($arguments);
+
+        $this->assertSame(array_merge(array(self::LUA_SCRIPT, 2), $arguments), $command->getEvalArguments());
+    }
+
+    /**
+     * @group disconnected
+     */
+    public function testGetEvalCommand()
+    {
+        $arguments = array('key1', 'key2', 'value1', 'value2');
+
+        $command = $this->getMock('Predis\Command\ScriptCommand', array('getScript', 'getKeysCount'));
+        $command->expects($this->exactly(2))
                 ->method('getScript')
                 ->will($this->returnValue(self::LUA_SCRIPT));
         $command->expects($this->once())
@@ -151,6 +193,8 @@ class ScriptCommandTest extends PredisTestCase
                 ->will($this->returnValue(2));
         $command->setArguments($arguments);
 
-        $this->assertSame(self::LUA_SCRIPT_SHA1, $command->getScriptHash());
+        $evalCMD = new RawCommand('EVAL', array_merge(array(self::LUA_SCRIPT, 2), $arguments));
+
+        $this->assertRedisCommand($evalCMD, $command->getEvalCommand());
     }
 }