RawSqlTestCase.php 8.5 KB
Newer Older
1
<?php
zYne's avatar
zYne committed
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
/*
 *  $Id: RawSqlTestCase.php 1181 2007-03-20 23:22:51Z gnat $
 *
 * 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_RawSql_TestCase
 * This class tests the functinality of Doctrine_RawSql component
 *
 * @package     Doctrine
 * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @category    Object Relational Mapping
 * @link        www.phpdoctrine.com
 * @since       1.0
 * @version     $Revision: 1181 $
 * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
 */
class Doctrine_RawSql_TestCase extends Doctrine_UnitTestCase 
{
36
    public function testQueryParser()
zYne's avatar
zYne committed
37
    {
38
        $sql = 'SELECT {p.*} FROM photos p';
zYne's avatar
zYne committed
39
        $query = new Doctrine_RawSql($this->connection);
zYne's avatar
zYne committed
40 41
        $query->parseQuery($sql);
        
42
        $this->assertEqual($query->getQueryPart('from'), array('photos p'));
zYne's avatar
zYne committed
43 44


45
        $sql = 'SELECT {p.*} FROM (SELECT p.* FROM photos p LEFT JOIN photos_tags t ON t.photo_id = p.id WHERE t.tag_id = 65) p LEFT JOIN photos_tags t ON t.photo_id = p.id WHERE p.can_see = -1 AND t.tag_id = 62 LIMIT 200';
zYne's avatar
zYne committed
46 47
        $query->parseQuery($sql);

48 49 50
        $this->assertEqual($query->getQueryPart('from'), array('(SELECT p.* FROM photos p LEFT JOIN photos_tags t ON t.photo_id = p.id WHERE t.tag_id = 65) p LEFT JOIN photos_tags t ON t.photo_id = p.id'));
        $this->assertEqual($query->getQueryPart('where'), array('p.can_see = -1 AND t.tag_id = 62'));
        $this->assertEqual($query->getQueryPart('limit'), array(200));
zYne's avatar
zYne committed
51
    }
zYne's avatar
zYne committed
52 53
    public function testAsteriskOperator() 
    {
54 55
        // Selecting with *

zYne's avatar
zYne committed
56
        $query = new Doctrine_RawSql($this->connection);
57
        $query->parseQuery('SELECT {entity.*} FROM entity');
58 59
        $fields = $query->getFields();

60
        $this->assertEqual($fields, array('entity.*'));
61

62
        $query->addComponent('entity', 'Entity');
63 64 65 66 67

        $coll = $query->execute();

        $this->assertEqual($coll->count(), 11);
    }
zYne's avatar
zYne committed
68 69
    public function testLazyPropertyLoading() 
    {
zYne's avatar
zYne committed
70 71
        $query = new Doctrine_RawSql($this->connection);
        $this->connection->clear();
72 73 74

        // selecting proxy objects (lazy property loading)

75
        $query->parseQuery('SELECT {entity.name}, {entity.id} FROM entity');
76 77
        $fields = $query->getFields();

78 79
        $this->assertEqual($fields, array('entity.name', 'entity.id'));
        $query->addComponent('entity', 'Entity');
80 81 82 83 84

        $coll = $query->execute();

        $this->assertEqual($coll->count(), 11);

zYne's avatar
zYne committed
85 86
        $this->assertEqual($coll[0]->state(), Doctrine_Record::STATE_PROXY);
        $this->assertEqual($coll[3]->state(), Doctrine_Record::STATE_PROXY); 
87
    }
zYne's avatar
zYne committed
88 89
    public function testSmartMapping() 
    {
zYne's avatar
zYne committed
90
        $query = new Doctrine_RawSql($this->connection);
91 92
        // smart component mapping (no need for additional addComponent call
        
93
        $query->parseQuery('SELECT {entity.name}, {entity.id} FROM entity');
94 95
        $fields = $query->getFields();

96
        $this->assertEqual($fields, array('entity.name', 'entity.id'));
97 98 99 100 101

        $coll = $query->execute();

        $this->assertEqual($coll->count(), 11);

zYne's avatar
zYne committed
102 103
        $this->assertEqual($coll[0]->state(), Doctrine_Record::STATE_PROXY);
        $this->assertEqual($coll[3]->state(), Doctrine_Record::STATE_PROXY);
104 105
    }

zYne's avatar
zYne committed
106 107
    public function testMultipleComponents() 
    {
zYne's avatar
zYne committed
108
        $query = new Doctrine_RawSql($this->connection);
109 110
        // multi component fetching

111
        $query->parseQuery('SELECT {entity.name}, {entity.id}, {phonenumber.*} FROM entity LEFT JOIN phonenumber ON phonenumber.entity_id = entity.id');
112

113 114 115 116 117 118 119 120
        $query->addComponent('entity', 'Entity');

        $query->addComponent('phonenumber', 'Entity.Phonenumber');

        $coll = $query->execute();
        $this->assertEqual($coll->count(), 11);

        $count = $this->dbh->count();
doctrine's avatar
doctrine committed
121
        
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
        $coll[4]->Phonenumber[0]->phonenumber;
        $this->assertEqual($count, $this->dbh->count());

        $coll[5]->Phonenumber[0]->phonenumber;
        $this->assertEqual($count, $this->dbh->count());
    }
    public function testAliasesAreSupportedInAddComponent()
    {
        $query = new Doctrine_RawSql();
        $query->parseQuery('SELECT {entity.name}, {entity.id}, {phonenumber.*} FROM entity LEFT JOIN phonenumber ON phonenumber.entity_id = entity.id');

        $query->addComponent('entity', 'Entity e');
        $query->addComponent('phonenumber', 'e.Phonenumber');

        $this->assertEqual(array_keys($query->getAliasMap()), array('e', 'e.Phonenumber'));

138 139
        $coll = $query->execute();
        $this->assertEqual($coll->count(), 11);
doctrine's avatar
doctrine committed
140

141 142 143 144 145 146 147 148
        $count = $this->dbh->count();
        
        $coll[4]->Phonenumber[0]->phonenumber;
        $this->assertEqual($count, $this->dbh->count());

        $coll[5]->Phonenumber[0]->phonenumber;
        $this->assertEqual($count, $this->dbh->count());
    }
149
    public function testPrimaryKeySelectForcing()
zYne's avatar
zYne committed
150
    {
151 152
        // forcing the select of primary key fields
        
zYne's avatar
zYne committed
153
        $query = new Doctrine_RawSql($this->connection);
154

155
        $query->parseQuery('SELECT {entity.name} FROM entity');
156 157 158 159 160 161 162 163
        
        $coll = $query->execute();
        
        $this->assertEqual($coll->count(), 11);
        $this->assertTrue(is_numeric($coll[0]->id));
        $this->assertTrue(is_numeric($coll[3]->id));
        $this->assertTrue(is_numeric($coll[7]->id));
    }
zYne's avatar
zYne committed
164
    public function testConvenienceMethods() 
zYne's avatar
zYne committed
165
    {
zYne's avatar
zYne committed
166
        $query = new Doctrine_RawSql($this->connection);
167
        $query->select('{entity.name}')->from('entity');
168
        $query->addComponent('entity', 'User');
zYne's avatar
zYne committed
169

170 171 172 173 174 175 176
        $coll = $query->execute();

        $this->assertEqual($coll->count(), 8);
        $this->assertTrue(is_numeric($coll[0]->id));
        $this->assertTrue(is_numeric($coll[3]->id));
        $this->assertTrue(is_numeric($coll[7]->id));
    }
177

zYne's avatar
zYne committed
178 179
    public function testColumnAggregationInheritance() 
    {
180
        // forcing the select of primary key fields
181

zYne's avatar
zYne committed
182
        $query = new Doctrine_RawSql($this->connection);
183

184 185
        $query->parseQuery('SELECT {entity.name} FROM entity');
        $query->addComponent('entity', 'User');
186 187 188 189 190 191 192
        $coll = $query->execute();

        $this->assertEqual($coll->count(), 8);
        $this->assertTrue(is_numeric($coll[0]->id));
        $this->assertTrue(is_numeric($coll[3]->id));
        $this->assertTrue(is_numeric($coll[7]->id));
    }
193

zYne's avatar
zYne committed
194 195
    public function testColumnAggregationInheritanceWithOrderBy() 
    {
196 197 198 199
        // forcing the select of primary key fields

        $query = new Doctrine_RawSql($this->connection);

200 201
        $query->parseQuery('SELECT {entity.name} FROM entity ORDER BY entity.name');
        $query->addComponent('entity', 'User');
202 203 204 205 206 207 208 209 210 211 212 213

        $this->assertEqual($query->getQuery(), "SELECT entity.name AS entity__name, entity.id AS entity__id FROM entity WHERE entity.type = 0 ORDER BY entity.name");


        $coll = $query->execute();

        $this->assertEqual($coll->count(), 8);
        $this->assertTrue(is_numeric($coll[0]->id));
        $this->assertTrue(is_numeric($coll[3]->id));
        $this->assertTrue(is_numeric($coll[7]->id));

    }
214

zYne's avatar
zYne committed
215 216
    public function testQueryParser2() 
    {
217 218 219 220 221 222 223
        $query = new Doctrine_RawSql();
        
        $query->parseQuery("SELECT {entity.name} FROM (SELECT entity.name FROM entity WHERE entity.name = 'something') WHERE entity.id = 2 ORDER BY entity.name");

        $this->assertEqual($query->getQuery(),
        "SELECT entity.name AS entity__name, entity.id AS entity__id FROM (SELECT entity.name FROM entity WHERE entity.name = 'something') WHERE entity.id = 2 ORDER BY entity.name");
    }
224 225
}
?>