blob: e4d103d36adbc6e9f14459da9cd6c9f9d2ee3c40 [file] [log] [blame]
<?php
/**
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @version //autogentag//
* @filesource
* @package PersistentObject
* @subpackage Tests
*/
require_once dirname( __FILE__ ) . '/relation_prefetch_test.php';
/**
* Tests ezcPersistentManyToOneRelation class.
*
* @package PersistentObject
* @subpackage Tests
*/
class ezcPersistentSessionIdentityDecoratorRelationObjectExtractorTest extends ezcPersistentSessionIdentityDecoratorRelationPrefetchTest
{
protected $sesstion;
protected $idMap;
protected $extractor;
protected $options;
public static function suite()
{
return new PHPUnit_Framework_TestSuite( __CLASS__ );
}
public function setup()
{
parent::setup();
RelationTestPerson::setupTables( $this->db );
RelationTestPerson::insertData( $this->db );
$this->session = new ezcPersistentSession(
$this->db,
$this->defManager
);
$this->idMap = new ezcPersistentBasicIdentityMap(
$this->defManager
);
$this->options = new ezcPersistentSessionIdentityDecoratorOptions();
$this->extractor = new ezcPersistentIdentityRelationObjectExtractor(
$this->idMap,
$this->defManager,
$this->options
);
}
public function teardown()
{
RelationTestEmployer::cleanup( $this->db );
}
public function testLoadOneLevelOneRelation()
{
$relations = $this->getOneLevelOneRelationRelations();
$q = $this->getLoadQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$this->extractor->extractObjectWithRelatedObjects(
$stmt, 'RelationTestPerson', 2, $relations
);
$person = $this->idMap->getIdentity( 'RelationTestPerson', 2 );
$this->assertNotNull( $person );
$this->assertEquals(
$this->session->load( 'RelationTestPerson', 2 ),
$person
);
$employers = $this->idMap->getRelatedObjects(
$person, 'RelationTestEmployer'
);
$this->assertNotNull( $employers );
$this->assertEquals( 1, count( $employers ) );
$this->assertEquals(
current( $employers ),
current( $this->session->getRelatedObjects( $person, 'RelationTestEmployer' ) )
);
}
public function testFindOneLevelOneRelationNoRestrictions()
{
$relations = $this->getOneLevelOneRelationRelations();
$q = $this->getFindQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$persons = $this->extractor->extractObjectsWithRelatedObjects(
$stmt, $q
);
$fakeFind = $this->session->createFindQuery( 'RelationTestPerson' );
$fakeRes = $this->session->find( $fakeFind );
$this->assertEquals(
$fakeRes,
$persons,
'Returned extracted object set incorrect.'
);
foreach ( $persons as $person )
{
$this->assertEquals(
$this->session->getRelatedObjects( $person, 'RelationTestEmployer' ),
$this->idMap->getRelatedObjects( $person, 'RelationTestEmployer' )
);
}
}
public function testFindOneLevelOneRelationRestrictions()
{
$relations = $this->getOneLevelOneRelationRelations();
$q = $this->getFindQuery( $relations );
$q->where(
$q->expr->like(
$this->qi( 'employer' ) . '.' . $this->qi( 'name' ),
$q->bindValue( '%Web%' )
)
);
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$persons = $this->extractor->extractObjectsWithRelatedObjects(
$stmt, $q
);
$fakeFind = $this->session->createFindQuery( 'RelationTestPerson' );
$fakeRes = $this->session->find( $fakeFind );
$this->assertEquals(
$fakeRes,
$persons,
'Returned extracted object set incorrect.'
);
foreach ( $persons as $person )
{
$this->assertNull(
$this->idMap->getRelatedObjects( $person, 'RelationTestEmployer' )
);
$this->assertNotNull(
$this->idMap->getRelatedObjectSet( $person, 'employer' )
);
}
}
public function testNamedSetNotOverwritten()
{
// Create fake named related set
$person = $this->session->load( 'RelationTestPerson', 2 );
$this->idMap->setIdentity( $person );
$birthday = new RelationTestBirthday();
$birthday->person = 2;
$relatedObjectSet = array(
'2' => $birthday
);
$this->idMap->setRelatedObjectSet(
$person, $relatedObjectSet, 'foo'
);
// Perform query and extraction
$relations = $this->getOneLevelOneRelationRelations();
$q = $this->getLoadQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
$this->extractor->extractObjectWithRelatedObjects(
$stmt, 'RelationTestPerson', 2, $relations
);
$this->assertSame(
$person,
$this->idMap->getIdentity( 'RelationTestPerson', 2 )
);
$employers = $this->idMap->getRelatedObjects(
$person, 'RelationTestEmployer'
);
$this->assertNotNull( $employers );
$this->assertEquals( 1, count( $employers ) );
$this->assertEquals(
current( $employers ),
current( $this->session->getRelatedObjects( $person, 'RelationTestEmployer' ) )
);
$this->assertEquals(
$relatedObjectSet,
$this->idMap->getRelatedObjectSet( $person, 'foo' )
);
}
public function testNoRefetch()
{
$relations = $this->getOneLevelOneRelationRelations();
$q = $this->getLoadQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
$this->extractor->extractObjectWithRelatedObjects(
$stmt, 'RelationTestPerson', 2, $relations
);
$person = $this->idMap->getIdentity( 'RelationTestPerson', 2 );
$this->assertNotNull( $person );
$this->assertEquals(
$this->session->load( 'RelationTestPerson', 2 ),
$person
);
$employers = $this->idMap->getRelatedObjects(
$person, 'RelationTestEmployer'
);
$this->assertNotNull( $employers );
$this->assertEquals( 1, count( $employers ) );
$this->assertEquals(
current( $employers ),
current( $this->session->getRelatedObjects( $person, 'RelationTestEmployer' ) )
);
// $this->options->refetch = true;
$relations = $this->getOneLevelOneRelationRelations();
$q = $this->getLoadQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
$this->extractor->extractObjectWithRelatedObjects(
$stmt, 'RelationTestPerson', 2, $relations
);
$secPerson = $this->idMap->getIdentity( 'RelationTestPerson', 2 );
$this->assertNotNull( $secPerson );
$this->assertEquals(
$this->session->load( 'RelationTestPerson', 2 ),
$secPerson
);
$this->assertSame( $person, $secPerson );
$secEmployers = $this->idMap->getRelatedObjects(
$secPerson, 'RelationTestEmployer'
);
$this->assertNotNull( $secEmployers );
$this->assertEquals( 1, count( $secEmployers ) );
$this->assertEquals(
current( $secEmployers ),
current( $this->session->getRelatedObjects( $secPerson, 'RelationTestEmployer' ) )
);
foreach ( $employers as $id => $employer )
{
$this->assertSame(
$employer,
$secEmployers[$id]
);
}
}
public function testRefetch()
{
$relations = $this->getOneLevelOneRelationRelations();
$q = $this->getLoadQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
$this->extractor->extractObjectWithRelatedObjects(
$stmt, 'RelationTestPerson', 2, $relations
);
$person = $this->idMap->getIdentity( 'RelationTestPerson', 2 );
$this->assertNotNull( $person );
$this->assertEquals(
$this->session->load( 'RelationTestPerson', 2 ),
$person
);
$employers = $this->idMap->getRelatedObjects(
$person, 'RelationTestEmployer'
);
$this->assertNotNull( $employers );
$this->assertEquals( 1, count( $employers ) );
$this->assertEquals(
current( $employers ),
current( $this->session->getRelatedObjects( $person, 'RelationTestEmployer' ) )
);
$this->options->refetch = true;
$relations = $this->getOneLevelOneRelationRelations();
$q = $this->getLoadQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
$this->extractor->extractObjectWithRelatedObjects(
$stmt, 'RelationTestPerson', 2, $relations
);
$secPerson = $this->idMap->getIdentity( 'RelationTestPerson', 2 );
$this->assertNotNull( $secPerson );
$this->assertEquals(
$this->session->load( 'RelationTestPerson', 2 ),
$secPerson
);
$this->assertNotSame( $person, $secPerson );
$secEmployers = $this->idMap->getRelatedObjects(
$secPerson, 'RelationTestEmployer'
);
$this->assertNotNull( $secEmployers );
$this->assertEquals( 1, count( $secEmployers ) );
$this->assertEquals(
current( $secEmployers ),
current( $this->session->getRelatedObjects( $secPerson, 'RelationTestEmployer' ) )
);
foreach ( $employers as $id => $employer )
{
$this->assertNotSame(
$employer,
$secEmployers[$id]
);
}
}
public function testLoadOneLevelMultiRelation()
{
$relations = $this->getOneLevelMultiRelationRelations();
$q = $this->getLoadQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$this->extractor->extractObjectWithRelatedObjects(
$stmt, 'RelationTestPerson', 2, $relations
);
$person = $this->idMap->getIdentity( 'RelationTestPerson', 2 );
$this->assertNotNull( $person );
$this->assertEquals(
$this->session->load( 'RelationTestPerson', 2 ),
$person
);
$employers = $this->idMap->getRelatedObjects(
$person, 'RelationTestEmployer'
);
$this->assertNotNull( $employers );
$this->assertEquals( 1, count( $employers ) );
$this->assertEquals(
current( $employers ),
current( $this->session->getRelatedObjects( $person, 'RelationTestEmployer' ) )
);
$addresses = $this->idMap->getRelatedObjects(
$person, 'RelationTestAddress'
);
$this->assertNotNull( $addresses );
$this->assertEquals( 3, count( $addresses ) );
$this->assertEquals(
current( $addresses ),
current( $this->session->getRelatedObjects( $person, 'RelationTestAddress' ) )
);
}
public function testFindOneLevelMultiRelationNoRestrictions()
{
$relations = $this->getOneLevelMultiRelationRelations();
$q = $this->getFindQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$persons = $this->extractor->extractObjectsWithRelatedObjects(
$stmt, $q
);
$fakeFind = $this->session->createFindQuery( 'RelationTestPerson' );
$fakeRes = $this->session->find( $fakeFind );
$this->assertEquals(
$fakeRes,
$persons,
'Returned extracted object set incorrect.'
);
foreach ( $persons as $person )
{
$this->assertEquals(
$this->session->getRelatedObjects( $person, 'RelationTestEmployer' ),
$this->idMap->getRelatedObjects( $person, 'RelationTestEmployer' )
);
$this->assertEquals(
$this->session->getRelatedObjects( $person, 'RelationTestAddress' ),
$this->idMap->getRelatedObjects( $person, 'RelationTestAddress' )
);
}
}
public function testFindOneLevelMultiRelationRestrictions()
{
$relations = $this->getOneLevelMultiRelationRelations();
$q = $this->getFindQuery( $relations );
$q->where(
$q->expr->like(
$this->qi( 'employer' ) . '.' . $this->qi( 'name' ),
$q->bindValue( '%Web%' )
)
);
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$persons = $this->extractor->extractObjectsWithRelatedObjects(
$stmt, $q
);
$fakeFind = $this->session->createFindQuery( 'RelationTestPerson' );
$fakeRes = $this->session->find( $fakeFind );
$this->assertEquals(
$fakeRes,
$persons,
'Returned extracted object set incorrect.'
);
foreach ( $persons as $person )
{
$this->assertNull(
$this->idMap->getRelatedObjects( $person, 'RelationTestEmployer' )
);
$this->assertNotNull(
$this->idMap->getRelatedObjectSet( $person, 'employer' )
);
$this->assertNull(
$this->idMap->getRelatedObjects( $person, 'RelationTestAddress' )
);
$this->assertEquals(
$this->session->getRelatedObjects( $person, 'RelationTestAddress' ),
$this->idMap->getRelatedObjectSet( $person, 'address' )
);
}
}
public function testLoadMultiLevelSingleRelation()
{
$relations = $this->getMultiLevelSingleRelationRelations();
$q = $this->getLoadQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$this->extractor->extractObjectWithRelatedObjects(
$stmt, 'RelationTestPerson', 2, $relations
);
$person = $this->idMap->getIdentity( 'RelationTestPerson', 2 );
$this->assertNotNull( $person );
$this->assertEquals(
$this->session->load( 'RelationTestPerson', 2 ),
$person
);
$addresses = $this->idMap->getRelatedObjects(
$person, 'RelationTestAddress'
);
$this->assertNotNull( $addresses );
$this->assertEquals( 3, count( $addresses ) );
$realAddresses = $this->session->getRelatedObjects( $person, 'RelationTestAddress' );
$this->assertEquals( $realAddresses, $addresses );
foreach ( $addresses as $address )
{
$persons = $this->idMap->getRelatedObjects(
$address, 'RelationTestPerson'
);
$this->assertNotNull( $persons );
$realPersons = $this->session->getRelatedObjects(
$address, 'RelationTestPerson'
);
$this->assertEquals( $realPersons, $persons );
}
}
public function testFindMultiLevelSingleRelationNoRestrictions()
{
$relations = $this->getMultiLevelSingleRelationRelations();
$q = $this->getFindQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$persons = $this->extractor->extractObjectsWithRelatedObjects(
$stmt, $q
);
$fakeFind = $this->session->createFindQuery( 'RelationTestPerson' );
$fakeRes = $this->session->find( $fakeFind );
$this->assertEquals(
$fakeRes,
$persons,
'Returned extracted object set incorrect.'
);
foreach ( $persons as $person )
{
$addresses = $this->idMap->getRelatedObjects( $person, 'RelationTestAddress' );
$this->assertEquals(
$this->session->getRelatedObjects( $person, 'RelationTestAddress' ),
$addresses
);
foreach( $addresses as $address )
{
$this->assertEquals(
$this->session->getRelatedObjects( $address, 'RelationTestPerson' ),
$this->idMap->getRelatedObjects( $address, 'RelationTestPerson' )
);
}
}
}
public function testFindMultiLevelSingleRelationRestrictions()
{
$relations = $this->getMultiLevelSingleRelationRelations();
$q = $this->getFindQuery( $relations );
$q->where(
$q->expr->gt(
$this->qi( 'addresses' ) . '.' . $this->qi( 'id' ),
$q->bindValue( 2 )
)
);
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$persons = $this->extractor->extractObjectsWithRelatedObjects(
$stmt, $q
);
$fakeFind = $this->session->createFindQuery( 'RelationTestPerson' );
$fakeRes = $this->session->find( $fakeFind );
$this->assertEquals(
$fakeRes,
$persons,
'Returned extracted object set incorrect.'
);
foreach ( $persons as $person )
{
$this->assertNull(
$this->idMap->getRelatedObjects( $person, 'RelationTestAddress' )
);
$addresses = $this->idMap->getRelatedObjectSet( $person, 'addresses' );
$this->assertNotNull( $addresses );
foreach( $addresses as $address )
{
$this->assertNull( $this->idMap->getRelatedObjects( $address, 'RelationTestPerson' ) );
$this->assertEquals(
$this->session->getRelatedObjects( $address, 'RelationTestPerson' ),
$this->idMap->getRelatedObjectSet( $address, 'habitants' )
);
}
}
}
public function testLoadMultiLevelMultiRelation()
{
$relations = $this->getMultiLevelMultiRelationRelations();
$q = $this->getLoadQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$this->extractor->extractObjectWithRelatedObjects(
$stmt, 'RelationTestPerson', 2, $relations
);
$person = $this->idMap->getIdentity( 'RelationTestPerson', 2 );
$this->assertNotNull( $person );
$this->assertEquals(
$this->session->load( 'RelationTestPerson', 2 ),
$person
);
$addresses = $this->idMap->getRelatedObjects(
$person, 'RelationTestAddress'
);
$this->assertNotNull( $addresses );
$this->assertEquals( 3, count( $addresses ) );
$realAddresses = $this->session->getRelatedObjects( $person, 'RelationTestAddress' );
$this->assertEquals( $realAddresses, $addresses );
foreach ( $addresses as $address )
{
$persons = $this->idMap->getRelatedObjects(
$address, 'RelationTestPerson'
);
$this->assertNotNull( $persons );
$realPersons = $this->session->getRelatedObjects(
$address, 'RelationTestPerson'
);
$this->assertEquals( $realPersons, $persons );
foreach ( $persons as $relPerson )
{
$employers = $this->idMap->getRelatedObjects( $relPerson, 'RelationTestEmployer' );
$this->assertNotNull( $employers );
$realEmployers = $this->session->getRelatedObjects( $relPerson, 'RelationTestEmployer' );
$this->assertEquals( $realEmployers, $employers );
$birthdays = $this->idMap->getRelatedObjects( $relPerson, 'RelationTestBirthday' );
if ( $relPerson->id == 3 )
{
// Person with ID 3 has no birthday assigned
$this->assertEquals( array(), $birthdays );
}
else
{
$this->assertNotNull( $birthdays );
$realBirthdays = $this->session->getRelatedObjects( $relPerson, 'RelationTestBirthday' );
$this->assertEquals( $realBirthdays, $birthdays );
}
}
}
$employers = $this->idMap->getRelatedObjects( $person, 'RelationTestEmployer' );
$this->assertNotNull( $employers );
$realEmployers = $this->session->getRelatedObjects( $person, 'RelationTestEmployer' );
$this->assertEquals( $realEmployers, $employers );
$birthdays = $this->idMap->getRelatedObjects( $person, 'RelationTestBirthday' );
$this->assertNotNull( $birthdays );
$realBirthdays = $this->session->getRelatedObjects( $person, 'RelationTestBirthday' );
$this->assertEquals( $realBirthdays, $birthdays );
}
public function testFindMultiLevelMultiRelationNoRestrictions()
{
$relations = $this->getMultiLevelMultiRelationRelations();
$q = $this->getFindQuery( $relations );
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$persons = $this->extractor->extractObjectsWithRelatedObjects(
$stmt, $q
);
$fakeFind = $this->session->createFindQuery( 'RelationTestPerson' );
$fakeRes = $this->session->find( $fakeFind );
$this->assertEquals(
$fakeRes,
$persons,
'Returned extracted object set incorrect.'
);
foreach ( $persons as $person )
{
$addresses = $this->idMap->getRelatedObjects( $person, 'RelationTestAddress' );
$this->assertEquals(
$this->session->getRelatedObjects( $person, 'RelationTestAddress' ),
$addresses
);
foreach ( $addresses as $address )
{
$habitants = $this->idMap->getRelatedObjects( $address, 'RelationTestPerson' );
$this->assertEquals(
$this->session->getRelatedObjects( $address, 'RelationTestPerson' ),
$habitants
);
foreach ( $habitants as $habitant )
{
$habitantEmployers = $this->idMap->getRelatedObjects( $habitant, 'RelationTestEmployer' );
$this->assertEquals(
$this->session->getRelatedObjects( $habitant, 'RelationTestEmployer' ),
$habitantEmployers
);
$habitantBirthdays = $this->idMap->getRelatedObjects( $habitant, 'RelationTestBirthday' );
$this->assertEquals(
$this->session->getRelatedObjects( $habitant, 'RelationTestBirthday' ),
$habitantBirthdays
);
}
}
$this->assertEquals(
$this->session->getRelatedObjects( $person, 'RelationTestEmployer' ),
$this->idMap->getRelatedObjects( $person, 'RelationTestEmployer' )
);
$this->assertEquals(
$this->session->getRelatedObjects( $person, 'RelationTestBirthday' ),
$this->idMap->getRelatedObjects( $person, 'RelationTestBirthday' )
);
}
}
public function testFindMultiLevelMultiRelationRestrictions()
{
$relations = $this->getMultiLevelMultiRelationRelations();
$q = $this->getFindQuery( $relations );
$q->where(
$q->expr->like(
$this->qi( 'habitant_employer' ) . '.' . $this->qi( 'name' ),
$q->bindValue( '%Web%' )
),
$q->expr->lt(
$this->qi( 'birthday' ) . '.' . $this->qi( 'birthday' ),
$q->bindValue( 0 )
)
);
$stmt = $q->prepare();
$stmt->execute();
// Actual test
$persons = $this->extractor->extractObjectsWithRelatedObjects(
$stmt, $q
);
$fakeFind = $this->session->createFindQuery( 'RelationTestPerson' );
$fakeFind->where(
$fakeFind->expr->eq(
'id',
$fakeFind->bindValue( 2 )
)
);
$fakeRes = $this->session->find( $fakeFind );
$this->assertEquals(
$fakeRes,
$persons,
'Returned extracted object set incorrect.'
);
foreach ( $persons as $person )
{
$this->assertNull( $this->idMap->getRelatedObjects( $person, 'RelationTestAddress' ) );
$addresses = $this->idMap->getRelatedObjectSet( $person, 'addresses' );
$this->assertEquals(
$this->session->getRelatedObjects( $person, 'RelationTestAddress' ),
$addresses
);
foreach ( $addresses as $address )
{
$this->assertNull( $this->idMap->getRelatedObjects( $address, 'RelationTestPerson' ) );
$habitants = $this->idMap->getRelatedObjectSet( $address, 'habitants' );
$this->assertEquals(
$this->session->getRelatedObjects( $address, 'RelationTestPerson' ),
$habitants
);
foreach ( $habitants as $habitant )
{
$this->assertNull(
$this->idMap->getRelatedObjects( $habitant, 'RelationTestEmployer' )
);
$habitantEmployers = $this->idMap->getRelatedObjectSet( $habitant, 'habitant_employer' );
$this->assertNotNull(
$habitantEmployers
);
$this->assertNull( $this->idMap->getRelatedObjects( $habitant, 'RelationTestBirthday' ) );
$habitantBirthdays = $this->idMap->getRelatedObjectSet( $habitant, 'habitant_birthday' );
$this->assertEquals(
$this->session->getRelatedObjects( $habitant, 'RelationTestBirthday' ),
$habitantBirthdays
);
}
}
$this->assertNull( $this->idMap->getRelatedObjects( $person, 'RelationTestEmployer' ) );
$this->assertEquals(
$this->session->getRelatedObjects( $person, 'RelationTestEmployer' ),
$this->idMap->getRelatedObjectSet( $person, 'employer' )
);
$this->assertNull(
$this->idMap->getRelatedObjects( $person, 'RelationTestBirthday' )
);
$this->assertNotNull(
$this->idMap->getRelatedObjectSet( $person, 'birthday' )
);
}
}
}
?>