Skip to content

Commit

Permalink
Adding tests for #1079 and fixing some formatting.
Browse files Browse the repository at this point in the history
  • Loading branch information
markstory committed Sep 7, 2010
1 parent c60edfa commit e150697
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 1 deletion.
2 changes: 1 addition & 1 deletion cake/libs/model/datasources/dbo_source.php
Expand Up @@ -1923,7 +1923,7 @@ function _constructVirtualFields(&$model, $alias, $fields) {
foreach ($fields as $field) {
$virtualField = $this->name($alias . $this->virtualFieldSeparator . $field);
$expression = $this->__quoteFields($model->getVirtualField($field));
$virtual[] = '(' .$expression . ") {$this->alias} {$virtualField}";
$virtual[] = '(' . $expression . ") {$this->alias} {$virtualField}";
}
return $virtual;
}
Expand Down
51 changes: 51 additions & 0 deletions cake/tests/cases/libs/model/datasources/dbo_source.test.php
Expand Up @@ -4359,6 +4359,30 @@ function testVirtualFieldsInConditions() {
$this->assertEqual($expected, $result);
}

/**
* test that virtualFields with complex functions and aliases work.
*
* @return void
*/
function testConditionsWithComplexVirtualFields() {
$Article =& ClassRegistry::init('Article');
$Article->virtualFields = array(
'distance' => 'ACOS(SIN(20 * PI() / 180)
* SIN(Article.latitude * PI() / 180)
+ COS(20 * PI() / 180)
* COS(Article.latitude * PI() / 180)
* COS((50 - Article.longitude) * PI() / 180)
) * 180 / PI() * 60 * 1.1515 * 1.609344'
);

$conditions = array('distance >=' => 20);
$result = $this->db->conditions($conditions, true, true, $Article);

$this->assertPattern('/\) >= 20/', $result);
$this->assertPattern('/[`\'"]Article[`\'"].[`\'"]latitude[`\'"]/', $result);
$this->assertPattern('/[`\'"]Article[`\'"].[`\'"]longitude[`\'"]/', $result);
}

/**
* test order to generate query order clause for virtual fields
*
Expand Down Expand Up @@ -4432,6 +4456,33 @@ function testVirtualFieldsFetch() {
$this->assertEqual($expected, $result);
}

/**
* test that virtualFields with complex functions and aliases work.
*
* @return void
*/
function testFieldsWithComplexVirtualFields() {
$Article =& new Article();
$Article->virtualFields = array(
'distance' => 'ACOS(SIN(20 * PI() / 180)
* SIN(Article.latitude * PI() / 180)
+ COS(20 * PI() / 180)
* COS(Article.latitude * PI() / 180)
* COS((50 - Article.longitude) * PI() / 180)
) * 180 / PI() * 60 * 1.1515 * 1.609344'
);

$fields = array('id', 'distance');
$result = $this->db->fields($Article, null, $fields);
$qs = $this->db->startQuote;
$qe = $this->db->endQuote;

$this->assertEqual($result[0], "{$qs}Article{$qe}.{$qs}id{$qe}");
$this->assertPattern('/Article__distance/', $result[1]);
$this->assertPattern('/[`\'"]Article[`\'"].[`\'"]latitude[`\'"]/', $result[1]);
$this->assertPattern('/[`\'"]Article[`\'"].[`\'"]longitude[`\'"]/', $result[1]);
}

/**
* test group to generate GROUP BY statements on virtual fields
*
Expand Down

0 comments on commit e150697

Please sign in to comment.