public function testWorkingWithCache()
 {
     foreach (DBTestPool::me()->getPool() as $db) {
         DBPool::me()->setDefault($db);
         $item = TestItem::create()->setName('testItem1');
         TestItem::dao()->add($item);
         $encapsulant = TestEncapsulant::create()->setName('testEncapsulant1');
         TestEncapsulant::dao()->add($encapsulant);
         $subItem1 = TestSubItem::create()->setName('testSubItem1')->setEncapsulant($encapsulant)->setItem($item);
         $subItem2 = TestSubItem::create()->setName('testSubItem2')->setEncapsulant($encapsulant)->setItem($item);
         TestSubItem::dao()->add($subItem1);
         TestSubItem::dao()->add($subItem2);
         $items = Criteria::create(TestItem::dao())->getList();
         foreach ($items as $item) {
             foreach ($item->getSubItems()->getList() as $subItem) {
                 $this->assertEquals($subItem->getEncapsulant()->getName(), 'testEncapsulant1');
             }
         }
         $encapsulant = TestEncapsulant::dao()->getById(1);
         $encapsulant->setName('testEncapsulant1_changed');
         TestEncapsulant::dao()->save($encapsulant);
         // drop identityMap
         TestEncapsulant::dao()->dropIdentityMap();
         TestSubItem::dao()->dropIdentityMap();
         TestItem::dao()->dropIdentityMap();
         $items = Criteria::create(TestItem::dao())->getList();
         foreach ($items as $item) {
             foreach ($item->getSubItems()->getList() as $subItem) {
                 $this->assertEquals($subItem->getEncapsulant()->getName(), 'testEncapsulant1_changed');
             }
         }
         // drop identityMap
         TestEncapsulant::dao()->dropIdentityMap();
         TestSubItem::dao()->dropIdentityMap();
         TestItem::dao()->dropIdentityMap();
         $subItem = TestSubItem::dao()->getById(1);
         $this->assertEquals($subItem->getEncapsulant()->getName(), 'testEncapsulant1_changed');
         // drop identityMap
         TestEncapsulant::dao()->dropIdentityMap();
         TestSubItem::dao()->dropIdentityMap();
         TestItem::dao()->dropIdentityMap();
         $subItems = Criteria::create(TestSubItem::dao())->getList();
         foreach ($subItems as $subItem) {
             $this->assertEquals($subItem->getEncapsulant()->getName(), 'testEncapsulant1_changed');
         }
     }
 }
 public function unified()
 {
     $user = TestUser::dao()->getById(1);
     $encapsulant = TestEncapsulant::dao()->getPlainList();
     $collectionDao = $user->getEncapsulants();
     $collectionDao->fetch()->setList($encapsulant);
     $collectionDao->save();
     unset($collectionDao);
     // fetch
     $encapsulantsList = $user->getEncapsulants()->getList();
     $piter = TestCity::dao()->getById(1);
     $moscow = TestCity::dao()->getById(2);
     for ($i = 0; $i < 10; $i++) {
         $this->assertEquals($encapsulantsList[$i]->getId(), $i + 1);
         $this->assertEquals($encapsulantsList[$i]->getName(), $i);
         $cityList = $encapsulantsList[$i]->getCities()->getList();
         $this->assertEquals($cityList[0], $piter);
         $this->assertEquals($cityList[1], $moscow);
     }
     unset($encapsulantsList);
     // lazy fetch
     $encapsulantsList = $user->getEncapsulants(true)->getList();
     for ($i = 1; $i < 11; $i++) {
         $this->assertEquals($encapsulantsList[$i], $i);
     }
     // count
     $user->getEncapsulants()->clean();
     $this->assertEquals($user->getEncapsulants()->getCount(), 10);
     $criteria = Criteria::create(TestEncapsulant::dao())->add(Expression::in('cities.id', array($piter->getId(), $moscow->getId())));
     $user->getEncapsulants()->setCriteria($criteria);
     $this->assertEquals($user->getEncapsulants()->getCount(), 20);
     // distinct count
     $user->getEncapsulants()->clean();
     $user->getEncapsulants()->setCriteria($criteria->setDistinct(true));
     if (DBPool::me()->getLink() instanceof SQLite) {
         // TODO: sqlite does not support such queries yet
         return null;
     }
     $this->assertEquals($user->getEncapsulants()->getCount(), 10);
 }
 /**
  * @param TestCase $test
  * @return DBTestCreator
  */
 public function fillDB(TestCase $test = null)
 {
     $moscow = TestCity::create()->setName('Moscow');
     $piter = TestCity::create()->setName('Saint-Peterburg');
     $mysqler = TestUser::create()->setCity($moscow)->setCredentials(Credentials::create()->setNickname('mysqler')->setPassword(sha1('mysqler')))->setLastLogin(Timestamp::create(time()))->setRegistered(Timestamp::create(time())->modify('-1 day'));
     $postgreser = clone $mysqler;
     $postgreser->setCredentials(Credentials::create()->setNickName('postgreser')->setPassword(sha1('postgreser')))->setCity($piter)->setUrl(HttpUrl::create()->parse('http://postgresql.org/'));
     $piter = TestCity::dao()->add($piter);
     $moscow = TestCity::dao()->add($moscow);
     if ($test) {
         $test->assertEquals($piter->getId(), 1);
         $test->assertEquals($moscow->getId(), 2);
     }
     $postgreser = TestUser::dao()->add($postgreser);
     for ($i = 0; $i < 10; $i++) {
         $encapsulant = TestEncapsulant::dao()->add(TestEncapsulant::create()->setName($i));
         $encapsulant->getCities()->fetch()->setList(array($piter, $moscow))->save();
     }
     $mysqler = TestUser::dao()->add($mysqler);
     if ($test) {
         $test->assertEquals($postgreser->getId(), 1);
         $test->assertEquals($mysqler->getId(), 2);
     }
     if ($test) {
         // put them in cache now
         TestUser::dao()->dropIdentityMap();
         TestUser::dao()->getById(1);
         TestUser::dao()->getById(2);
         if ($test instanceof DBDataTest) {
             $test->getListByIdsTest();
         }
         Cache::me()->clean();
         $test->assertTrue($postgreser == TestUser::dao()->getById(1));
         $test->assertTrue($mysqler == TestUser::dao()->getById(2));
     }
     $firstClone = clone $postgreser;
     $secondClone = clone $mysqler;
     $firstCount = TestUser::dao()->dropById($postgreser->getId());
     $secondCount = TestUser::dao()->dropByIds(array($mysqler->getId()));
     if ($test) {
         $test->assertEquals($firstCount, 1);
         $test->assertEquals($secondCount, 1);
         try {
             TestUser::dao()->getById(1);
             $test->fail();
         } catch (ObjectNotFoundException $e) {
             /* pass */
         }
         $result = Criteria::create(TestUser::dao())->add(Expression::eq(1, 2))->getResult();
         $test->assertEquals($result->getCount(), 0);
         $test->assertEquals($result->getList(), array());
     }
     TestUser::dao()->import($firstClone);
     TestUser::dao()->import($secondClone);
     if ($test && $test instanceof DBDataTest) {
         // cache multi-get
         $test->getListByIdsTest();
         $test->getListByIdsTest();
     }
     return $this;
 }