Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
doctrine-dbal
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Tomáš Trávníček
doctrine-dbal
Commits
e6768b4f
Commit
e6768b4f
authored
Nov 30, 2007
by
Jonathan.Wage
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Initial entry of Geographical template.
parent
e8bb04a6
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
153 additions
and
0 deletions
+153
-0
Driver.php
lib/Doctrine/Expression/Driver.php
+33
-0
Geographical.php
lib/Doctrine/Template/Geographical.php
+120
-0
No files found.
lib/Doctrine/Expression/Driver.php
View file @
e6768b4f
...
@@ -714,6 +714,39 @@ class Doctrine_Expression_Driver extends Doctrine_Connection_Module
...
@@ -714,6 +714,39 @@ class Doctrine_Expression_Driver extends Doctrine_Connection_Module
return
'ACOS('
.
$value
.
')'
;
return
'ACOS('
.
$value
.
')'
;
}
}
/**
* sin
*
* @param string $value
* @return void
*/
public
function
sin
(
$value
)
{
return
'SIN('
.
$value
.
')'
;
}
/**
* pi
*
* @return void
*/
public
function
pi
()
{
return
'PI()'
;
}
/**
* cos
*
* @param string $value
* @return void
* @author Jonathan H. Wage
*/
public
function
cos
(
$value
)
{
return
'COS('
.
$value
.
')'
;
}
/**
/**
* __call
* __call
*
*
...
...
lib/Doctrine/Template/Geographical.php
0 → 100644
View file @
e6768b4f
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
/**
* Doctrine_Template_Geographical
*
* Easily add created and updated at timestamps to your doctrine records
*
* @package Doctrine
* @subpackage Template
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.phpdoctrine.com
* @since 1.0
* @version $Revision$
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
*/
class
Doctrine_Template_Geographical
extends
Doctrine_Template
{
/**
* Array of timestampable options
*
* @var string
*/
protected
$_options
=
array
(
'latitude'
=>
array
(
'name'
=>
'latitude'
,
'type'
=>
'float'
,
'size'
=>
4
,
'options'
=>
array
()),
'longitude'
=>
array
(
'name'
=>
'longitude'
,
'type'
=>
'float'
,
'size'
=>
4
,
'options'
=>
array
()));
/**
* __construct
*
* @param string $array
* @return void
*/
public
function
__construct
(
array
$options
)
{
$this
->
_options
=
Doctrine_Lib
::
arrayDeepMerge
(
$this
->
_options
,
$options
);
}
/**
* setTableDefinition
*
* @return void
*/
public
function
setTableDefinition
()
{
$this
->
hasColumn
(
$this
->
_options
[
'latitude'
][
'name'
],
$this
->
_options
[
'latitude'
][
'type'
],
$this
->
_options
[
'latitude'
][
'size'
],
$this
->
_options
[
'latitude'
][
'options'
]);
$this
->
hasColumn
(
$this
->
_options
[
'longitude'
][
'name'
],
$this
->
_options
[
'longitude'
][
'type'
],
$this
->
_options
[
'longitude'
][
'size'
],
$this
->
_options
[
'longitude'
][
'options'
]);
}
public
function
getDistanceQuery
()
{
$invoker
=
$this
->
getInvoker
();
$query
=
$invoker
->
getTable
()
->
createQuery
();
$rootAlias
=
$query
->
getRootAlias
();
$latName
=
$this
->
_options
[
'latitude'
][
'name'
];
$longName
=
$this
->
_options
[
'longitude'
][
'name'
];
$query
->
addSelect
(
$rootAlias
.
'.*'
);
$sql
=
"((ACOS(SIN(%s * PI() / 180) * SIN("
.
$rootAlias
.
"."
.
$latName
.
" * PI() / 180) + COS(%s * PI() / 180) * COS("
.
$rootAlias
.
"."
.
$latName
.
" * PI() / 180) * COS((%s - "
.
$rootAlias
.
"."
.
$longName
.
") * PI() / 180)) * 180 / PI()) * 60 * %s) as %s"
;
$milesSql
=
sprintf
(
$sql
,
number_format
(
$invoker
->
get
(
'latitude'
),
1
),
$invoker
->
get
(
'latitude'
),
$invoker
->
get
(
'longitude'
),
'1.1515'
,
'miles'
);
$query
->
addSelect
(
$milesSql
);
$kilometersSql
=
sprintf
(
$sql
,
number_format
(
$invoker
->
get
(
'latitude'
),
1
),
$invoker
->
get
(
'latitude'
),
$invoker
->
get
(
'longitude'
),
'1.1515 * 1.609344'
,
'kilometers'
);
$query
->
addSelect
(
$kilometersSql
);
return
$query
;
}
public
function
getDistance
(
Doctrine_Record
$record
,
$kilometers
=
false
)
{
$query
=
$this
->
getDistanceQuery
(
$kilometers
);
$conditions
=
array
();
$values
=
array
();
foreach
((
array
)
$record
->
getTable
()
->
getIdentifier
()
as
$id
)
{
$conditions
[]
=
$query
->
getRootAlias
()
.
'.'
.
$id
.
' = ?'
;
$values
[]
=
$record
->
get
(
$id
);
}
$where
=
implode
(
' AND '
,
$conditions
);
$query
->
addWhere
(
$where
,
$values
);
$query
->
limit
(
1
);
$result
=
$query
->
execute
()
->
getFirst
();
if
(
isset
(
$result
[
'kilometers'
])
&&
$result
[
'miles'
])
{
return
$kilometers
?
$result
->
get
(
'kilometers'
)
:
$result
->
get
(
'miles'
);
}
else
{
return
0
;
}
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment