Completed
Pull Request — master (#1640)
by Olivier
23:26 queued 21:41
created

AnnotationDriver::setShardKey()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 10
cts 10
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 7
nc 3
nop 2
crap 3
1
<?php
2
/*
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 *
15
 * This software consists of voluntary contributions made by many individuals
16
 * and is licensed under the MIT license. For more information, see
17
 * <http://www.doctrine-project.org>.
18
 */
19
20
namespace Doctrine\ODM\MongoDB\Mapping\Driver;
21
22
use Doctrine\Common\Annotations\AnnotationReader;
23
use Doctrine\Common\Annotations\AnnotationRegistry;
24
use Doctrine\Common\Annotations\Reader;
25
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
26
use Doctrine\Common\Persistence\Mapping\Driver\AnnotationDriver as AbstractAnnotationDriver;
27
use Doctrine\ODM\MongoDB\Events;
28
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
29
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata as MappingClassMetadata;
30
use Doctrine\ODM\MongoDB\Mapping\ClassMetadataInfo;
31
use Doctrine\ODM\MongoDB\Mapping\MappingException;
32
33
/**
34
 * The AnnotationDriver reads the mapping metadata from docblock annotations.
35
 *
36
 * @since       1.0
37
 */
38
class AnnotationDriver extends AbstractAnnotationDriver
39
{
40
    protected $entityAnnotationClasses = array(
41
        ODM\Document::class            => 1,
42
        ODM\MappedSuperclass::class    => 2,
43
        ODM\EmbeddedDocument::class    => 3,
44
        ODM\QueryResultDocument::class => 4,
45
    );
46
47
    /**
48
     * Registers annotation classes to the common registry.
49
     *
50
     * This method should be called when bootstrapping your application.
51
     *
52
     * @deprecated method was deprecated in 1.2 and will be removed in 2.0. Register class loader through AnnotationRegistry::registerLoader instead.
53
     */
54
    public static function registerAnnotationClasses()
55
    {
56
        @trigger_error(
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
57
            sprintf('%s is deprecated - register class loader through AnnotationRegistry::registerLoader instead.', __METHOD__),
58
            E_USER_DEPRECATED
59
        );
60
        AnnotationRegistry::registerFile(__DIR__ . '/../Annotations/DoctrineAnnotations.php');
0 ignored issues
show
Deprecated Code introduced by
The method Doctrine\Common\Annotati...egistry::registerFile() has been deprecated with message: this method is deprecated and will be removed in doctrine/annotations 2.0 autoloading should be deferred to the globally registered autoloader by then. For now, use @example AnnotationRegistry::registerLoader('class_exists')

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
61
    }
62
63
    /**
64
     * {@inheritdoc}
65
     */
66 915
    public function loadMetadataForClass($className, ClassMetadata $class)
67
    {
68
        /** @var $class ClassMetadataInfo */
69 915
        $reflClass = $class->getReflectionClass();
70
71 915
        $classAnnotations = $this->reader->getClassAnnotations($reflClass);
72
73 915
        $documentAnnots = array();
74 915
        foreach ($classAnnotations as $annot) {
75 913
            $classAnnotations[get_class($annot)] = $annot;
76
77 913
            foreach ($this->entityAnnotationClasses as $annotClass => $i) {
78 913
                if ($annot instanceof $annotClass) {
79 913
                    $documentAnnots[$i] = $annot;
80 913
                    continue 2;
81
                }
82 598
            }
83
84
            // non-document class annotations
85 406
            if ($annot instanceof ODM\AbstractIndex) {
86 13
                $this->addIndex($class, $annot);
87 13
            }
88 406
            if ($annot instanceof ODM\Indexes) {
89 65
                foreach (is_array($annot->value) ? $annot->value : array($annot->value) as $index) {
90 65
                    $this->addIndex($class, $index);
91 65
                }
92 406
            } elseif ($annot instanceof ODM\InheritanceType) {
93 313
                $class->setInheritanceType(constant(MappingClassMetadata::class . '::INHERITANCE_TYPE_'.$annot->value));
94 395
            } elseif ($annot instanceof ODM\DiscriminatorField) {
95
                // $fieldName property is deprecated, but fall back for BC
96 121
                if (isset($annot->value)) {
97 121
                    $class->setDiscriminatorField($annot->value);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type array; however, Doctrine\ODM\MongoDB\Map...setDiscriminatorField() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
98 121
                } elseif (isset($annot->name)) {
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...scriminatorField::$name has been deprecated with message: property was deprecated in 1.2 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
99
                    @trigger_error(
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
100
                        sprintf('Specifying discriminator\'s name through "name" is deprecated - use @DiscriminatorField("%s") instead', $annot->name),
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...scriminatorField::$name has been deprecated with message: property was deprecated in 1.2 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
101
                        E_USER_DEPRECATED
102
                    );
103
                    $class->setDiscriminatorField($annot->name);
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...scriminatorField::$name has been deprecated with message: property was deprecated in 1.2 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
104
                } elseif (isset($annot->fieldName)) {
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...inatorField::$fieldName has been deprecated with message: property was deprecated in 1.0.0-BETA10 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
105
                    @trigger_error(
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
106
                        sprintf('Specifying discriminator\'s name through "name" is deprecated - use @DiscriminatorField("%s") instead', $annot->fieldName),
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...inatorField::$fieldName has been deprecated with message: property was deprecated in 1.0.0-BETA10 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
107
                        E_USER_DEPRECATED
108
                    );
109
                    $class->setDiscriminatorField($annot->fieldName);
0 ignored issues
show
Deprecated Code introduced by
The property Doctrine\ODM\MongoDB\Map...inatorField::$fieldName has been deprecated with message: property was deprecated in 1.0.0-BETA10 and will be removed in 2.0

This property has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the property will be removed from the class and what other property to use instead.

Loading history...
110
                }
111 393
            } elseif ($annot instanceof ODM\DiscriminatorMap) {
112 121
                $class->setDiscriminatorMap($annot->value);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type null or string; however, Doctrine\ODM\MongoDB\Map...::setDiscriminatorMap() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
113 392
            } elseif ($annot instanceof ODM\DiscriminatorValue) {
114
                $class->setDiscriminatorValue($annot->value);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type array or null; however, Doctrine\ODM\MongoDB\Map...setDiscriminatorValue() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
115 330
            } elseif ($annot instanceof ODM\ChangeTrackingPolicy) {
116 57
                $class->setChangeTrackingPolicy(constant(MappingClassMetadata::class . '::CHANGETRACKING_'.$annot->value));
117 330
            } elseif ($annot instanceof ODM\DefaultDiscriminatorValue) {
118 57
                $class->setDefaultDiscriminatorValue($annot->value);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type array or null; however, Doctrine\ODM\MongoDB\Map...ultDiscriminatorValue() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
119 57
            }
120
121 915
        }
122
123 915
        if ( ! $documentAnnots) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $documentAnnots of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
124 3
            throw MappingException::classIsNotAValidDocument($className);
125
        }
126
127
        // find the winning document annotation
128 913
        ksort($documentAnnots);
129 913
        $documentAnnot = reset($documentAnnots);
130
131 913
        if ($documentAnnot instanceof ODM\MappedSuperclass) {
132 302
            $class->isMappedSuperclass = true;
133 913
        } elseif ($documentAnnot instanceof ODM\EmbeddedDocument) {
134 298
            $class->isEmbeddedDocument = true;
135 912
        } elseif ($documentAnnot instanceof ODM\QueryResultDocument) {
136 52
            $class->isQueryResultDocument = true;
137 52
        }
138 913
        if (isset($documentAnnot->db)) {
139 1
            $class->setDatabase($documentAnnot->db);
140 1
        }
141 913
        if (isset($documentAnnot->collection)) {
142 361
            $class->setCollection($documentAnnot->collection);
143 361
        }
144 913
        if (isset($documentAnnot->repositoryClass)) {
145 69
            $class->setCustomRepositoryClass($documentAnnot->repositoryClass);
146 69
        }
147 913
        if (isset($documentAnnot->writeConcern)) {
148 11
            $class->setWriteConcern($documentAnnot->writeConcern);
149 11
        }
150 913
        if (isset($documentAnnot->indexes)) {
151 912
            foreach ($documentAnnot->indexes as $index) {
152
                $this->addIndex($class, $index);
153 912
            }
154 912
        }
155 913
        if (isset($documentAnnot->requireIndexes)) {
156 905
            $class->setRequireIndexes($documentAnnot->requireIndexes);
0 ignored issues
show
Deprecated Code introduced by
The method Doctrine\ODM\MongoDB\Map...fo::setRequireIndexes() has been deprecated with message: method was deprecated in 1.2 and will be removed in 2.0

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
157 905
        }
158 913
        if (isset($documentAnnot->slaveOkay)) {
159 1
            $class->setSlaveOkay($documentAnnot->slaveOkay);
0 ignored issues
show
Deprecated Code introduced by
The method Doctrine\ODM\MongoDB\Map...ataInfo::setSlaveOkay() has been deprecated with message: in version 1.2 and will be removed in 2.0.

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
160 1
        }
161
162 913
        foreach ($reflClass->getProperties() as $property) {
163 912
            if (($class->isMappedSuperclass && ! $property->isPrivate())
164
                ||
165 912
                ($class->isInheritedField($property->name) && $property->getDeclaringClass()->name !== $class->name)) {
166 347
                continue;
167
            }
168
169 911
            $indexes = array();
170 911
            $mapping = array('fieldName' => $property->getName());
171 911
            $fieldAnnot = null;
172
173 911
            foreach ($this->reader->getPropertyAnnotations($property) as $annot) {
174 911
                if ($annot instanceof ODM\AbstractField) {
175 911
                    $fieldAnnot = $annot;
176 911
                    if ($annot->isDeprecated()) {
177
                        @trigger_error($annot->getDeprecationMessage(), E_USER_DEPRECATED);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
178
                    }
179 911
                }
180 911
                if ($annot instanceof ODM\AbstractIndex) {
181 198
                    $indexes[] = $annot;
182 198
                }
183 911
                if ($annot instanceof ODM\Indexes) {
184
                    foreach (is_array($annot->value) ? $annot->value : array($annot->value) as $index) {
185
                        $indexes[] = $index;
186
                    }
187 911
                } elseif ($annot instanceof ODM\AlsoLoad) {
188 15
                    $mapping['alsoLoadFields'] = (array) $annot->value;
189 911
                } elseif ($annot instanceof ODM\Version) {
190 99
                    $mapping['version'] = true;
191 911
                } elseif ($annot instanceof ODM\Lock) {
192 24
                    $mapping['lock'] = true;
193 24
                }
194 911
            }
195
196 911
            if ($fieldAnnot) {
197 911
                $mapping = array_replace($mapping, (array) $fieldAnnot);
198 911
                $class->mapField($mapping);
199 911
            }
200
201 911
            if ($indexes) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $indexes of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
202 198
                foreach ($indexes as $index) {
203 198
                    $name = isset($mapping['name']) ? $mapping['name'] : $mapping['fieldName'];
204 198
                    $keys = array($name => $index->order ?: 'asc');
205 198
                    $this->addIndex($class, $index, $keys);
206 198
                }
207 198
            }
208 913
        }
209
210
        // Set shard key after all fields to ensure we mapped all its keys
211 911
        if (isset($classAnnotations['Doctrine\ODM\MongoDB\Mapping\Annotations\ShardKey'])) {
212 72
            $this->setShardKey($class, $classAnnotations['Doctrine\ODM\MongoDB\Mapping\Annotations\ShardKey']);
213 71
        }
214
215
        /** @var $method \ReflectionMethod */
216 910
        foreach ($reflClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
217
            /* Filter for the declaring class only. Callbacks from parent
218
             * classes will already be registered.
219
             */
220 634
            if ($method->getDeclaringClass()->name !== $reflClass->name) {
221 314
                continue;
222
            }
223
224 634
            foreach ($this->reader->getMethodAnnotations($method) as $annot) {
225 307
                if ($annot instanceof ODM\AlsoLoad) {
226 13
                    $class->registerAlsoLoadMethod($method->getName(), $annot->value);
0 ignored issues
show
Bug introduced by
It seems like $annot->value can also be of type null; however, Doctrine\ODM\MongoDB\Map...egisterAlsoLoadMethod() does only seem to accept array|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
227 13
                }
228
229 307
                if ( ! isset($classAnnotations[ODM\HasLifecycleCallbacks::class])) {
230 72
                    continue;
231
                }
232
233 288
                if ($annot instanceof ODM\PrePersist) {
234 267
                    $class->addLifecycleCallback($method->getName(), Events::prePersist);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
235 288
                } elseif ($annot instanceof ODM\PostPersist) {
236 11
                    $class->addLifecycleCallback($method->getName(), Events::postPersist);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
237 86
                } elseif ($annot instanceof ODM\PreUpdate) {
238 15
                    $class->addLifecycleCallback($method->getName(), Events::preUpdate);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
239 85
                } elseif ($annot instanceof ODM\PostUpdate) {
240 67
                    $class->addLifecycleCallback($method->getName(), Events::postUpdate);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
241 80
                } elseif ($annot instanceof ODM\PreRemove) {
242 72
                    $class->addLifecycleCallback($method->getName(), Events::preRemove);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
243 74
                } elseif ($annot instanceof ODM\PostRemove) {
244 70
                    $class->addLifecycleCallback($method->getName(), Events::postRemove);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
245 74
                } elseif ($annot instanceof ODM\PreLoad) {
246 71
                    $class->addLifecycleCallback($method->getName(), Events::preLoad);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
247 74
                } elseif ($annot instanceof ODM\PostLoad) {
248 72
                    $class->addLifecycleCallback($method->getName(), Events::postLoad);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
249 73
                } elseif ($annot instanceof ODM\PreFlush) {
250 11
                    $class->addLifecycleCallback($method->getName(), Events::preFlush);
0 ignored issues
show
Bug introduced by
Consider using $method->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
251 11
                }
252 634
            }
253 910
        }
254 910
    }
255
256 222
    private function addIndex(ClassMetadataInfo $class, $index, array $keys = array())
257
    {
258 222
        $keys = array_merge($keys, $index->keys);
259 222
        $options = array();
260 222
        $allowed = array('name', 'dropDups', 'background', 'safe', 'unique', 'sparse', 'expireAfterSeconds');
261 222
        foreach ($allowed as $name) {
262 222
            if (isset($index->$name)) {
263 222
                $options[$name] = $index->$name;
264 222
            }
265 222
        }
266 222
        if (! empty($index->partialFilterExpression)) {
267 3
            $options['partialFilterExpression'] = $index->partialFilterExpression;
268 3
        }
269 222
        $options = array_merge($options, $index->options);
270 222
        $class->addIndex($keys, $options);
271 222
    }
272
273
    /**
274
     * @param ClassMetadataInfo $class
275
     * @param ODM\ShardKey      $shardKey
276
     *
277
     * @throws MappingException
278
     */
279 72
    private function setShardKey(ClassMetadataInfo $class, ODM\ShardKey $shardKey)
280
    {
281 72
        $options = array();
282 72
        $allowed = array('unique', 'numInitialChunks');
283 72
        foreach ($allowed as $name) {
284 72
            if (isset($shardKey->$name)) {
285 1
                $options[$name] = $shardKey->$name;
286 1
            }
287 72
        }
288
289 72
        $class->setShardKey($shardKey->keys, $options);
290 71
    }
291
292
    /**
293
     * Factory method for the Annotation Driver
294
     *
295
     * @param array|string $paths
296
     * @param Reader $reader
297
     * @return AnnotationDriver
298
     */
299 1149
    public static function create($paths = array(), Reader $reader = null)
300
    {
301 1149
        if ($reader === null) {
302 1149
            $reader = new AnnotationReader();
303 1149
        }
304 1149
        return new self($reader, $paths);
0 ignored issues
show
Compatibility introduced by
$reader of type object<Doctrine\Common\Annotations\Reader> is not a sub-type of object<Doctrine\Common\A...tions\AnnotationReader>. It seems like you assume a concrete implementation of the interface Doctrine\Common\Annotations\Reader to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
305
    }
306
}
307