diff --git a/application/.DS_Store b/application/.DS_Store new file mode 100644 index 0000000..3b598e6 Binary files /dev/null and b/application/.DS_Store differ diff --git a/application/configs/application.ini b/application/configs/application.ini index 0495c65..6d890ac 100644 --- a/application/configs/application.ini +++ b/application/configs/application.ini @@ -63,6 +63,8 @@ resources.doctrine.dbal.connections.default.parameters.port = 3306 resources.doctrine.dbal.connections.default.parameters.user = "root" resources.doctrine.dbal.connections.default.parameters.password = "password" +resources.doctrine.dbal.connections.default.type.point = "Wantlet\ORM\PointType" + ; ------------------------------------------------------------------------------ ; Doctrine ORM Configuration @@ -82,6 +84,9 @@ resources.doctrine.orm.entityManagers.default.metadataDrivers.0.mappingDirs[] resources.doctrine.orm.entityManagers.default.metadataDrivers.0.annotationReaderClass = "Doctrine\Common\Annotations\AnnotationReader" resources.doctrine.orm.entityManagers.default.metadataDrivers.0.annotationReaderCache = default +resources.doctrine.orm.entityManagers.default.DQLFunctions.numeric.DISTANCE = "Wantlet\ORM\Distance" +resources.doctrine.orm.entityManagers.default.DQLFunctions.numeric.POINT_STR = "Wantlet\ORM\PointStr" +resources.doctrine.orm.entityManagers.default.mappings.Point = "point" diff --git a/library/.DS_Store b/library/.DS_Store new file mode 100644 index 0000000..5f02ee3 Binary files /dev/null and b/library/.DS_Store differ diff --git a/library/Bisna/.DS_Store b/library/Bisna/.DS_Store new file mode 100644 index 0000000..1d7bb42 Binary files /dev/null and b/library/Bisna/.DS_Store differ diff --git a/library/Bisna/Application/.DS_Store b/library/Bisna/Application/.DS_Store new file mode 100644 index 0000000..980221e Binary files /dev/null and b/library/Bisna/Application/.DS_Store differ diff --git a/library/Bisna/Application/Container/DoctrineContainer.php b/library/Bisna/Application/Container/DoctrineContainer.php index 50c28de..46f87bb 100644 --- a/library/Bisna/Application/Container/DoctrineContainer.php +++ b/library/Bisna/Application/Container/DoctrineContainer.php @@ -129,6 +129,7 @@ private function prepareDBALConfiguration(array $config = array()) 'eventSubscribers' => array(), 'configurationClass' => 'Doctrine\DBAL\Configuration', 'sqlLoggerClass' => null, + 'type' => array(), 'parameters' => array( 'wrapperClass' => null, 'driver' => 'pdo_mysql', @@ -231,6 +232,7 @@ private function prepareORMConfiguration(array $config = array()) 'queryCache' => $this->defaultCacheInstance, 'resultCache' => $this->defaultCacheInstance, 'metadataCache' => $this->defaultCacheInstance, + 'mappings' => array(), 'metadataDrivers' => array(), 'DQLFunctions' => array( 'numeric' => array(), @@ -383,6 +385,11 @@ private function startDBALConfiguration(array $config = array()) $sqlLoggerClass = $config['sqlLoggerClass']; $configuration->setSQLLogger(new $sqlLoggerClass()); } + + // Custom type configuration + foreach($config['type'] as $key => $value){ + \Doctrine\DBAL\Types\Type::addType($key, $value); + } return $configuration; } @@ -528,6 +535,10 @@ private function startORMConfiguration(array $config = array()) $configuration->addCustomStringFunction($name, $className); } + foreach($config['mappings'] as $key => $value){ + $this->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping($key, $value); + } + return $configuration; } diff --git a/library/Wantlet/.DS_Store b/library/Wantlet/.DS_Store new file mode 100644 index 0000000..cb2e73b Binary files /dev/null and b/library/Wantlet/.DS_Store differ diff --git a/library/Wantlet/ORM/Distance.php b/library/Wantlet/ORM/Distance.php new file mode 100644 index 0000000..1454217 --- /dev/null +++ b/library/Wantlet/ORM/Distance.php @@ -0,0 +1,34 @@ +firstArg->dispatch($sqlWalker) . + ', ' . + $this->secondArg->dispatch($sqlWalker) . + '))'; + } + + public function parse(\Doctrine\ORM\Query\Parser $parser) { + $parser->match(Lexer::T_IDENTIFIER); + $parser->match(Lexer::T_OPEN_PARENTHESIS); + $this->firstArg = $parser->ArithmeticPrimary(); + $parser->match(Lexer::T_COMMA); + $this->secondArg = $parser->ArithmeticPrimary(); + $parser->match(Lexer::T_CLOSE_PARENTHESIS); + } +} diff --git a/library/Wantlet/ORM/Point.php b/library/Wantlet/ORM/Point.php new file mode 100644 index 0000000..4d1b370 --- /dev/null +++ b/library/Wantlet/ORM/Point.php @@ -0,0 +1,36 @@ +latitude = $latitude; + $this->longitude = $longitude; + } + + public function setLatitude($x) { + $this->latitude = $x; + } + + public function getLatitude() { + return $this->latitude; + } + + public function setLongitude($y) { + $this->longitude = $y; + } + + public function getLongitude() { + return $this->longitude; + } + + public function __toString() { + //Output from this is used with POINT_STR in DQL so must be in specific format + return sprintf('POINT(%f %f)', $this->latitude, $this->longitude); + } +} diff --git a/library/Wantlet/ORM/PointStr.php b/library/Wantlet/ORM/PointStr.php new file mode 100644 index 0000000..b585fc5 --- /dev/null +++ b/library/Wantlet/ORM/PointStr.php @@ -0,0 +1,27 @@ +arg->dispatch($sqlWalker) . ')'; + } + + public function parse(\Doctrine\ORM\Query\Parser $parser) { + $parser->match(Lexer::T_IDENTIFIER); + $parser->match(Lexer::T_OPEN_PARENTHESIS); + $this->arg = $parser->ArithmeticPrimary(); + $parser->match(Lexer::T_CLOSE_PARENTHESIS); + } + +} diff --git a/library/Wantlet/ORM/PointType.php b/library/Wantlet/ORM/PointType.php new file mode 100644 index 0000000..aa251bf --- /dev/null +++ b/library/Wantlet/ORM/PointType.php @@ -0,0 +1,47 @@ +getLatitude(), $value->getLongitude()); + } +}