Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

DDC-2003 - DateTime conditions in Criteria objects result in errors #433

Merged
merged 5 commits into from

4 participants

@Josiah

No description provided.

@travisbot

This pull request fails (merged 783c53d into bc2476f).

@Josiah Josiah Fixed DDC-2003 using closures to reference the functionality of the c…
…alling entity persister from the SQL value visitor.
c7f5d9d
@travisbot

This pull request fails (merged c7f5d9d into bc2476f).

@travisbot

This pull request fails (merged a6b6b25 into bc2476f).

@Josiah

@beberlei it looks like implementing this using closures isn't going to work in PHP 5.3 as the methods needed are private in the BasicEntityPersister.

How would you like me to resolve this?

  1. Inject the persister in to the SqlValueVisitor and make the required methods public,
  2. Duplicate the functionality for these methods present in the BasicEntityPersister to the SqlValueVisitor, or
  3. Extract the functionality into a new helper class, then inject that into the value visitor.
...Tests/ORM/Functional/EntityRepositoryCriteriaTest.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Doctrine\Tests\ORM\Functional;
+
+use Doctrine\Tests\Models\Generic\DateTimeModel;
+use Doctrine\Common\Collections\Criteria;
+
+require_once __DIR__ . '/../../TestInit.php';
@stof
stof added a note

this line is useless since the refactoring of the phpunit setup months ago so you should remove it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@stof stof commented on the diff
...Tests/ORM/Functional/EntityRepositoryCriteriaTest.php
@@ -0,0 +1,71 @@
+<?php
+
@stof
stof added a note

the license header is missing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
...Tests/ORM/Functional/EntityRepositoryCriteriaTest.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Doctrine\Tests\ORM\Functional;
+
+use Doctrine\Tests\Models\Generic\DateTimeModel;
+use Doctrine\Common\Collections\Criteria;
+
+require_once __DIR__ . '/../../TestInit.php';
+
+/**
+ * @author Josiah <josiah@jjs.id.au>
+ */
+class EntityRepositoryCriteriaTest extends \Doctrine\Tests\OrmFunctionalTestCase
+{
+ protected function setUp() {
@stof
stof added a note

the curly brace should be on its own line

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@travisbot

This pull request fails (merged e0d1633 into bc2476f).

lib/Doctrine/ORM/Persisters/SqlValueVisitor.php
((7 lines not shown))
$value = $comparison->getValue()->getValue();
$field = $comparison->getField();
-
- $this->values[] = $value;
- $this->types[] = $this->getType($field, $value);
+
+ $this->values[] = $valueCallback($value);
@stof
stof added a note

this syntax will only work with closures in 5.3, not with any callable. but your constructor does not mandates using closures

@Josiah
Josiah added a note

You've got a good point there, however I won't be able to use closures at all because PHP 5.3 doesn't support executing in the defining classes scope. You'll notice that Travis bot is failing on PHP 5.3 because of this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@Josiah

@stof do you have any input as to how the SqlValueVistor should be refactored as per my comment

@travisbot

This pull request fails (merged 959c4f0 into bc2476f).

@Josiah

For some reason the @travisbot has the wrong version, the line of code it is referring to does not exist in commit 959c4f0

@stof

@Josiah Travis is not running the tests on your code, but on your code merged into master

@stof stof commented on the diff
lib/Doctrine/ORM/Persisters/BasicEntityPersister.php
@@ -808,10 +808,24 @@ private function expandCriteriaParameters(Criteria $criteria)
return array(array(), array());
}
- $valueVisitor = new SqlValueVisitor($this->_class);
+ $persister = $this;
@stof
stof added a note

this variable seems unused

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@beberlei beberlei merged commit 959c4f0 into from
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
This page is out of date. Refresh to see the latest.
View
18 lib/Doctrine/ORM/Persisters/BasicEntityPersister.php
@@ -808,10 +808,24 @@ private function expandCriteriaParameters(Criteria $criteria)
return array(array(), array());
}
- $valueVisitor = new SqlValueVisitor($this->_class);
+ $persister = $this;
@stof
stof added a note

this variable seems unused

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ $valueVisitor = new SqlValueVisitor();
$valueVisitor->dispatch($expression);
- return $valueVisitor->getParamsAndTypes();
+ list($values, $types) = $valueVisitor->getParamsAndTypes();
+
+ $sqlValues = array();
+ foreach ($values as $value) {
+ $sqlValues[] = $this->getValue($value);
+ }
+
+ $sqlTypes = array();
+ foreach ($types as $type) {
+ list($field, $value) = $type;
+ $sqlTypes[] = $this->getType($field, $value);
+ }
+
+ return array($sqlValues, $sqlTypes);
}
/**
View
30 lib/Doctrine/ORM/Persisters/SqlValueVisitor.php
@@ -47,19 +47,6 @@ class SqlValueVisitor extends ExpressionVisitor
private $types = array();
/**
- * @var \Doctrine\ORM\Mapping\ClassMetadata
- */
- private $class;
-
- /**
- * @param \Doctrine\ORM\Mapping\ClassMetadata
- */
- public function __construct(ClassMetadata $class)
- {
- $this->class = $class;
- }
-
- /**
* Convert a comparison expression into the target query language output
*
* @param \Doctrine\Common\Collections\Expr\Comparison $comparison
@@ -70,9 +57,9 @@ public function walkComparison(Comparison $comparison)
{
$value = $comparison->getValue()->getValue();
$field = $comparison->getField();
-
+
$this->values[] = $value;
- $this->types[] = $this->getType($field, $value);
+ $this->types[] = array($field, $value);
}
/**
@@ -110,17 +97,4 @@ public function getParamsAndTypes()
{
return array($this->values, $this->types);
}
-
- private function getType($field, $value)
- {
- $type = isset($this->class->fieldMappings[$field])
- ? Type::getType($this->class->fieldMappings[$field]['type'])->getBindingType()
- : \PDO::PARAM_STR;
-
- if (is_array($value)) {
- $type += Connection::ARRAY_PARAM_OFFSET;
- }
-
- return $type;
- }
}
View
87 tests/Doctrine/Tests/ORM/Functional/EntityRepositoryCriteriaTest.php
@@ -0,0 +1,87 @@
+<?php
+/*
@stof
stof added a note

the license header is missing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ * 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 MIT license. For more information, see
+ * <http://www.doctrine-project.org>.
+ */
+
+namespace Doctrine\Tests\ORM\Functional;
+
+use Doctrine\Tests\Models\Generic\DateTimeModel;
+use Doctrine\Common\Collections\Criteria;
+
+/**
+ * @author Josiah <josiah@jjs.id.au>
+ */
+class EntityRepositoryCriteriaTest extends \Doctrine\Tests\OrmFunctionalTestCase
+{
+ protected function setUp()
+ {
+ $this->useModelSet('generic');
+ parent::setUp();
+ }
+
+ public function tearDown()
+ {
+ if ($this->_em) {
+ $this->_em->getConfiguration()->setEntityNamespaces(array());
+ }
+ parent::tearDown();
+ }
+
+ public function loadFixture()
+ {
+ $today = new DateTimeModel();
+ $today->datetime =
+ $today->date =
+ $today->time =
+ new \DateTime('today');
+ $this->_em->persist($today);
+
+ $tomorrow = new DateTimeModel();
+ $tomorrow->datetime =
+ $tomorrow->date =
+ $tomorrow->time =
+ new \DateTime('tomorrow');
+ $this->_em->persist($tomorrow);
+
+ $yesterday = new DateTimeModel();
+ $yesterday->datetime =
+ $yesterday->date =
+ $yesterday->time =
+ new \DateTime('yesterday');
+ $this->_em->persist($yesterday);
+
+ $this->_em->flush();
+
+ unset($today);
+ unset($tomorrow);
+ unset($yesterday);
+
+ $this->_em->clear();
+ }
+
+ public function testLteDateComparison()
+ {
+ $this->loadFixture();
+
+ $repository = $this->_em->getRepository('Doctrine\Tests\Models\Generic\DateTimeModel');
+ $dates = $repository->matching(new Criteria(
+ Criteria::expr()->lte('datetime', new \DateTime('today'))
+ ));
+
+ $this->assertEquals(2, count($dates));
+ }
+}
Something went wrong with that request. Please try again.