public function testUpdateQueries()
{
$book = R::dispense('book');
$book->title = 'Eye of Wight';
$book->xownPageList = R::dispense('page', 10);
$book->sharedCategoryList = R::dispense('category', 2);
$n = 1;
foreach ($book->xownPageList as $page) {
$page->number = $n++;
}
$book->sharedCategory[0]->name = 'adventure';
$book->sharedCategory[1]->name = 'puzzle';
$book->author = R::dispense('author');
$book->author->name = 'John';
$book->map = R::dispense('map');
$book->map->name = 'Wight';
$book->map->xownLocationList = R::dispense('location', 3);
asrt($book->getMeta('tainted'), TRUE);
asrt($book->getMeta('changed'), TRUE);
R::store($book);
asrt($book->getMeta('tainted'), FALSE);
asrt($book->getMeta('changed'), FALSE);
$logger = R::debug(1, 1);
$book = $book->fresh();
asrt($book->getMeta('tainted'), FALSE);
asrt($book->getMeta('changed'), FALSE);
$book->author;
asrt($book->getMeta('tainted'), TRUE);
asrt($book->getMeta('changed'), FALSE);
$logger->clear();
R::store($book);
//read only, no updates
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 0);
$book->title = 'Spirit of the Stones';
R::store($book);
//changed title, 1 update
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 1);
$logger->clear();
//store again, no changes, no updates
R::store($book);
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 0);
$logger->clear();
$book = $book->fresh();
$book->xownPageList;
asrt($book->getMeta('tainted'), TRUE);
asrt($book->getMeta('changed'), FALSE);
R::store($book);
//access only, no update
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 0);
$logger->clear();
$book = $book->fresh();
$book->sharedCategoryList;
asrt($book->getMeta('tainted'), TRUE);
asrt($book->getMeta('changed'), FALSE);
R::store($book);
//access only, no update
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 0);
$logger->clear();
$book = $book->fresh();
unset($book->xownPageList[5]);
asrt($book->getMeta('tainted'), TRUE);
asrt($book->getMeta('changed'), FALSE);
R::store($book);
//remove only, no update, just 1 delete
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 0);
$numberOfUpdateQueries = $logger->grep('DELETE');
asrt(count($numberOfUpdateQueries), 1);
$book = $book->fresh();
asrt(count($book->xownPageList), 9);
$logger->clear();
$book = $book->fresh();
$book->xownPageList[] = R::dispense('page');
asrt($book->getMeta('tainted'), TRUE);
asrt($book->getMeta('changed'), FALSE);
R::store($book);
//no update, 1 insert, just adding
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 0);
$numberOfUpdateQueries = $logger->grep('INSERT');
asrt(count($numberOfUpdateQueries), 1);
$book = $book->fresh();
asrt(count($book->xownPageList), 10);
$logger->clear();
$book = $book->fresh();
$book->map->xownLocationList[1]->name = 'Horshoe Bay';
asrt($book->getMeta('tainted'), TRUE);
asrt($book->getMeta('changed'), FALSE);
asrt($book->map->getMeta('tainted'), TRUE);
asrt($book->map->getMeta('changed'), FALSE);
asrt($book->map->xownLocationList[1]->getMeta('tainted'), TRUE);
asrt($book->map->xownLocationList[1]->getMeta('changed'), TRUE);
R::store($book);
//1 update for child of parent, no other updates
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 1);
$book = $book->fresh();
asrt($book->map->xownLocationList[1]->name, 'Horshoe Bay');
$logger->clear();
R::store($book);
//just access, no updates
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 0);
$logger->clear();
$book = $book->fresh();
$book->ownPageList[2]->number = 99;
R::store($book);
//1 update, do not update rest of pages or book itself
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 1);
$book = $book->fresh();
$book->author->name = 'Worsley';
$logger->clear();
R::store($book);
//1 update for parent
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 1);
$author = R::dispense('author');
$author->name = 'J.W.';
R::store($author);
$book = $book->fresh();
$book->author = $author;
$author->name = 'JW';
$logger->clear();
R::store($book);
//2 updates, one for author, one for link field: author_id needs update.
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 2);
$author->country = R::dispense('country')->setAttr('name', 'England');
R::store($author);
$book = $book->fresh();
$book->author->country->name = 'Wight';
$logger->clear();
R::store($book);
//1 update, country only, dont update for intermediate parents: book -> author -> ...
$numberOfUpdateQueries = $logger->grep('UPDATE');
asrt(count($numberOfUpdateQueries), 1);
}