Skip to content

Commit e669957

Browse files
authored
Merge pull request #1978 from doctrine/revert-1962-fix-wrong-discriminator-inheritance
Revert "Fix wrong usage of discriminator map in complex document inheritance chains"
2 parents 3706105 + 69c266d commit e669957

4 files changed

Lines changed: 20 additions & 146 deletions

File tree

lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadataInfo.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -784,10 +784,6 @@ public function setDiscriminatorField($discriminatorField)
784784
*/
785785
public function setDiscriminatorMap(array $map)
786786
{
787-
$this->subClasses = [];
788-
$this->discriminatorMap = [];
789-
$this->discriminatorValue = null;
790-
791787
foreach ($map as $value => $className) {
792788
if (strpos($className, '\\') === false && strlen($this->namespace)) {
793789
$className = $this->namespace . '\\' . $className;

lib/Doctrine/ODM/MongoDB/Persisters/DocumentPersister.php

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -944,35 +944,27 @@ public function prepareFieldName($fieldName)
944944
}
945945

946946
/**
947-
* Adds a discriminator criteria to an already-prepared query if necessary.
948-
*
949-
* If the class we're querying has a discriminator field set, we add all
950-
* possible discriminator values to the query. The list of possible
951-
* discriminator values is based on the discriminatorValue of the class
952-
* itself as well as those of all its subclasses.
947+
* Adds discriminator criteria to an already-prepared query.
953948
*
954949
* This method should be used once for query criteria and not be used for
955950
* nested expressions. It should be called before
956951
* {@link DocumentPerister::addFilterToPreparedQuery()}.
957952
*
953+
* @param array $preparedQuery
958954
* @return array
959955
*/
960956
public function addDiscriminatorToPreparedQuery(array $preparedQuery)
961957
{
962-
if (isset($preparedQuery[$this->class->discriminatorField]) || $this->class->discriminatorField === null) {
963-
return $preparedQuery;
964-
}
965-
966-
$discriminatorValues = $this->getClassDiscriminatorValues($this->class);
967-
968-
if ($discriminatorValues === []) {
969-
return $preparedQuery;
970-
}
971-
972-
if (count($discriminatorValues) === 1) {
973-
$preparedQuery[$this->class->discriminatorField] = $discriminatorValues[0];
974-
} else {
975-
$preparedQuery[$this->class->discriminatorField] = ['$in' => $discriminatorValues];
958+
/* If the class has a discriminator field, which is not already in the
959+
* criteria, inject it now. The field/values need no preparation.
960+
*/
961+
if ($this->class->hasDiscriminator() && ! isset($preparedQuery[$this->class->discriminatorField])) {
962+
$discriminatorValues = $this->getClassDiscriminatorValues($this->class);
963+
if (count($discriminatorValues) === 1) {
964+
$preparedQuery[$this->class->discriminatorField] = $discriminatorValues[0];
965+
} else {
966+
$preparedQuery[$this->class->discriminatorField] = array('$in' => $discriminatorValues);
967+
}
976968
}
977969

978970
return $preparedQuery;
@@ -1341,19 +1333,14 @@ private function hasQueryOperators($value)
13411333
}
13421334

13431335
/**
1344-
* Returns the list of discriminator values for the given ClassMetadata
1336+
* Gets the array of discriminator values for the given ClassMetadata
13451337
*
13461338
* @param ClassMetadata $metadata
13471339
* @return array
13481340
*/
13491341
private function getClassDiscriminatorValues(ClassMetadata $metadata)
13501342
{
1351-
$discriminatorValues = [];
1352-
1353-
if ($metadata->discriminatorValue !== null) {
1354-
$discriminatorValues[] = $metadata->discriminatorValue;
1355-
}
1356-
1343+
$discriminatorValues = array($metadata->discriminatorValue);
13571344
foreach ($metadata->subClasses as $className) {
13581345
if ($key = array_search($className, $metadata->discriminatorMap)) {
13591346
$discriminatorValues[] = $key;

tests/Doctrine/ODM/MongoDB/Tests/Functional/Ticket/GH1962Test.php

Lines changed: 0 additions & 81 deletions
This file was deleted.

tests/Doctrine/ODM/MongoDB/Tests/Query/BuilderTest.php

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,13 @@ public function testReferencesGoesThroughDiscriminatorMap()
2525
->field('featureFull')->references($f)
2626
->getQuery()->debug();
2727

28-
$this->assertEquals(
29-
[
30-
'featureFull.$id' => new \MongoId($f->id),
31-
'type' => ['$in' => ['ca', 'cb', 'cc']],
32-
],
33-
$q1['query']
34-
);
28+
$this->assertEquals([ 'featureFull.$id' => new \MongoId($f->id) ], $q1['query']);
3529

3630
$q2 = $this->dm->createQueryBuilder(ParentClass::class)
3731
->field('featureSimple')->references($f)
3832
->getQuery()->debug();
3933

40-
$this->assertEquals(
41-
[
42-
'featureSimple' => new \MongoId($f->id),
43-
'type' => ['$in' => ['ca', 'cb', 'cc']],
44-
],
45-
$q2['query']
46-
);
34+
$this->assertEquals([ 'featureSimple' => new \MongoId($f->id) ], $q2['query']);
4735

4836
$q3 = $this->dm->createQueryBuilder(ParentClass::class)
4937
->field('featurePartial')->references($f)
@@ -53,7 +41,6 @@ public function testReferencesGoesThroughDiscriminatorMap()
5341
[
5442
'featurePartial.$id' => new \MongoId($f->id),
5543
'featurePartial.$ref' => 'Feature',
56-
'type' => ['$in' => ['ca', 'cb', 'cc']],
5744
],
5845
$q3['query']
5946
);
@@ -96,27 +83,13 @@ public function testIncludesReferenceToGoesThroughDiscriminatorMap()
9683
->field('featureFullMany')->includesReferenceTo($f)
9784
->getQuery()->debug();
9885

99-
$this->assertEquals(
100-
[
101-
'featureFullMany' => [
102-
'$elemMatch' => ['$id' => new \MongoId($f->id)],
103-
],
104-
'type' => ['$in' => ['ca', 'cb', 'cc']],
105-
],
106-
$q1['query']
107-
);
86+
$this->assertEquals([ 'featureFullMany' => [ '$elemMatch' => [ '$id' => new \MongoId($f->id) ] ] ], $q1['query']);
10887

10988
$q2 = $this->dm->createQueryBuilder(ParentClass::class)
11089
->field('featureSimpleMany')->includesReferenceTo($f)
11190
->getQuery()->debug();
11291

113-
$this->assertEquals(
114-
[
115-
'featureSimpleMany' => new \MongoId($f->id),
116-
'type' => ['$in' => ['ca', 'cb', 'cc']],
117-
],
118-
$q2['query']
119-
);
92+
$this->assertEquals([ 'featureSimpleMany' => new \MongoId($f->id) ], $q2['query']);
12093

12194
$q3 = $this->dm->createQueryBuilder(ParentClass::class)
12295
->field('featurePartialMany')->includesReferenceTo($f)
@@ -128,9 +101,8 @@ public function testIncludesReferenceToGoesThroughDiscriminatorMap()
128101
'$elemMatch' => [
129102
'$id' => new \MongoId($f->id),
130103
'$ref' => 'Feature',
131-
],
132-
],
133-
'type' => ['$in' => ['ca', 'cb', 'cc']],
104+
]
105+
]
134106
],
135107
$q3['query']
136108
);

0 commit comments

Comments
 (0)