Last active
September 28, 2016 09:21
-
-
Save ubermuda/29d1dcfa18f3c172fa5534eaa4d69a00 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace AppBundle\Command; | |
use Doctrine\ORM\EntityManager; | |
use Symfony\Component\Console\Command\Command; | |
use Symfony\Component\Console\Input\InputInterface; | |
use Symfony\Component\Console\Output\OutputInterface; | |
class DatabaseInstallLevenshteinCommand extends Command | |
{ | |
private $manager; | |
public function __construct(EntityManager $manager) | |
{ | |
parent::__construct(); | |
$this->manager = $manager; | |
} | |
public function configure() | |
{ | |
$this | |
->setName('database:install-levenshtein') | |
->setDescription('Creates the LEVENSHTEIN command'); | |
} | |
public function execute(InputInterface $input, OutputInterface $output) | |
{ | |
$conn = $this->manager->getConnection(); | |
$conn->query($this->getQuery()); | |
} | |
public function getQuery() | |
{ | |
$fp = fopen(__FILE__, 'r'); | |
fseek($fp, __COMPILER_HALT_OFFSET__); | |
$query = trim(stream_get_contents($fp)); | |
fclose($fp); | |
return $query; | |
} | |
} | |
__halt_compiler(); | |
CREATE FUNCTION LEVENSHTEIN(s1 VARCHAR(255), s2 VARCHAR(255)) RETURNS int(11) DETERMINISTIC | |
BEGIN | |
DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT; | |
DECLARE s1_char CHAR; | |
DECLARE cv0, cv1 VARBINARY(256); | |
SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0; | |
IF s1 = s2 THEN | |
RETURN 0; | |
ELSEIF s1_len = 0 THEN | |
RETURN s2_len; | |
ELSEIF s2_len = 0 THEN | |
RETURN s1_len; | |
ELSE | |
WHILE j <= s2_len DO | |
SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1; | |
END WHILE; | |
WHILE i <= s1_len DO | |
SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1; | |
WHILE j <= s2_len DO | |
SET c = c + 1; | |
IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF; | |
SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost; | |
IF c > c_temp THEN SET c = c_temp; END IF; | |
SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1; | |
IF c > c_temp THEN SET c = c_temp; END IF; | |
SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1; | |
END WHILE; | |
SET cv1 = cv0, i = i + 1; | |
END WHILE; | |
END IF; | |
RETURN c; | |
END |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment