1<?php
2
3/**
4 * @author Donald Ball
5 */
6class Doctrine_Ticket_941_TestCase extends Doctrine_UnitTestCase
7{
8
9  public function prepareTables()
10  {
11    $this->tables = array('Site', 'Variable', 'SiteVarvalue');
12    parent::prepareTables();
13  }
14
15  public function prepareData()
16  {
17      $site = new Site();
18      $site->site_id      = 1;
19      $site->site_domain  = 'site1';
20      $site->save();
21
22      $site = new Site();
23      $site->site_id      = 2;
24      $site->site_domain  = 'site2';
25      $site->save();
26
27      $var  = new Variable();
28      $var->variable_id   = 1;
29      $var->variable_name = 'var1';
30      $var->save();
31
32      $var  = new Variable();
33      $var->variable_id   = 2;
34      $var->variable_name = 'var2';
35      $var->save();
36
37      $varval = new SiteVarvalue();
38      $varval->site_id        = 1;
39      $varval->variable_id    = 1;
40      $varval->varvalue_value = 'val1 dom1 var1';
41      $varval->save();
42
43      $varval = new SiteVarvalue();
44      $varval->site_id        = 1;
45      $varval->variable_id    = 2;
46      $varval->varvalue_value = 'val2 dom1 var2';
47      $varval->save();
48
49      $varval = new SiteVarvalue();
50      $varval->site_id        = 2;
51      $varval->variable_id    = 1;
52      $varval->varvalue_value = 'val3 dom2 var1';
53      $varval->save();
54
55      $varval = new SiteVarvalue();
56      $varval->site_id        = 2;
57      $varval->variable_id    = 2;
58      $varval->varvalue_value = 'val4 dom2 var2';
59      $varval->save();
60  }
61
62  public function testTicket()
63  {
64      $query = new Doctrine_Query();
65      $query = $query->from('Site s LEFT JOIN s.Variables v LEFT JOIN v.Values vv WITH vv.site_id = s.site_id');
66
67      $sites = $query->execute();
68
69      $this->assertEqual('site1', $sites[0]->site_domain);
70      $this->assertEqual(2, count($sites));
71
72      // this is important for the understanding of the behavior
73      $this->assertIdentical($sites[0]->Variables[0], $sites[1]->Variables[0]);
74      $this->assertIdentical($sites[0]->Variables[1], $sites[1]->Variables[1]);
75      $this->assertEqual(2, count($sites[0]->Variables[0]->Values));
76      $this->assertEqual(2, count($sites[1]->Variables[0]->Values));
77      $this->assertEqual(2, count($sites[0]->Variables[1]->Values));
78      $this->assertEqual(2, count($sites[1]->Variables[1]->Values));
79      // Here we see that there can be only one Values on each Variable object. Hence
80      // they end up with 2 objects each.
81      $this->assertEqual('val1 dom1 var1', $sites[0]->Variables[0]->Values[0]->varvalue_value);
82      $this->assertEqual('val3 dom2 var1', $sites[0]->Variables[0]->Values[1]->varvalue_value);
83      $this->assertEqual('val2 dom1 var2', $sites[0]->Variables[1]->Values[0]->varvalue_value);
84      $this->assertEqual('val4 dom2 var2', $sites[0]->Variables[1]->Values[1]->varvalue_value);
85
86      $this->assertEqual('var1', $sites[0]->Variables[0]->variable_name);
87      $this->assertEqual('var1', $sites[1]->Variables[0]->variable_name);
88
89      $this->assertEqual('var2', $sites[0]->Variables[1]->variable_name);
90      $this->assertEqual('var2', $sites[1]->Variables[1]->variable_name);
91
92
93      // now array hydration
94
95      $sites = $query->fetchArray();
96
97      $this->assertEqual('site1', $sites[0]['site_domain']);
98      $this->assertEqual('site2', $sites[1]['site_domain']);
99      $this->assertEqual(2, count($sites));
100
101      // this is important for the understanding of the behavior
102      $this->assertEqual(1, count($sites[0]['Variables'][0]['Values']));
103      $this->assertEqual(1, count($sites[1]['Variables'][0]['Values']));
104      $this->assertEqual(1, count($sites[0]['Variables'][1]['Values']));
105      $this->assertEqual(1, count($sites[1]['Variables'][1]['Values']));
106      // Here we see that the Values collection of the *same* Variable object can have
107      // different contents when hydrating arrays
108      $this->assertEqual('val1 dom1 var1', $sites[0]['Variables'][0]['Values'][0]['varvalue_value']);
109      $this->assertEqual('val3 dom2 var1', $sites[1]['Variables'][0]['Values'][0]['varvalue_value']);
110      // Here we see that the Values collection of the *same* Variable object can have
111      // different contents when hydrating arrays
112      $this->assertEqual('val2 dom1 var2', $sites[0]['Variables'][1]['Values'][0]['varvalue_value']);
113      $this->assertEqual('val4 dom2 var2', $sites[1]['Variables'][1]['Values'][0]['varvalue_value']);
114
115      $this->assertEqual('var1', $sites[0]['Variables'][0]['variable_name']);
116      $this->assertEqual('var1', $sites[1]['Variables'][0]['variable_name']);
117
118      $this->assertEqual('var2', $sites[0]['Variables'][1]['variable_name']);
119      $this->assertEqual('var2', $sites[1]['Variables'][1]['variable_name']);
120
121  }
122
123}
124
125abstract class BaseSite extends Doctrine_Record
126{
127
128  public function setTableDefinition()
129  {
130    $this->setTableName('_site');
131    $this->hasColumn('site_id', 'integer', 4, array('notnull' => true, 'primary' => true, 'autoincrement' => true));
132    $this->hasColumn('site_domain', 'string', 255, array('notnull' => true));
133  }
134
135  public function setUp()
136  {
137    parent::setUp();
138    $this->hasMany('Variable as Variables', array('refClass' => 'SiteVarvalue',
139                                                  'local' => 'site_id',
140                                                  'foreign' => 'variable_id'));
141  }
142
143}
144abstract class BaseVariable extends Doctrine_Record
145{
146
147  public function setTableDefinition()
148  {
149    $this->setTableName('_variable');
150    $this->hasColumn('variable_id', 'integer', 4, array('notnull' => true, 'primary' => true, 'autoincrement' => true));
151    $this->hasColumn('variable_name', 'string', 100, array('notnull' => true));
152  }
153
154  public function setUp()
155  {
156    parent::setUp();
157    $this->hasMany('Site as Sites', array('refClass' => 'SiteVarvalue',
158                                          'local' => 'variable_id',
159                                          'foreign' => 'site_id'));
160
161    $this->hasMany('SiteVarvalue as Values', array('local' => 'variable_id',
162                                                    'foreign' => 'variable_id'));
163  }
164
165}
166abstract class BaseSiteVarvalue extends Doctrine_Record
167{
168
169  public function setTableDefinition()
170  {
171    $this->setTableName('_site_varvalue');
172    $this->hasColumn('varvalue_id', 'integer', 4, array('notnull' => true, 'primary' => true, 'autoincrement' => true));
173    $this->hasColumn('site_id', 'integer', 4, array('notnull' => true));
174    $this->hasColumn('variable_id', 'integer', 4, array('notnull' => true));
175    $this->hasColumn('varvalue_value', 'string', null, array('notnull' => true));
176  }
177
178  public function setUp()
179  {
180    parent::setUp();
181    $this->hasOne('Variable as Variables', array('local' => 'variable_id',
182                                                 'foreign' => 'variable_id'));
183  }
184
185}
186class Site extends BaseSite
187{
188}
189class Variable extends BaseVariable
190{
191}
192class SiteVarvalue extends BaseSiteVarvalue
193{
194}
195