/** * Adds discriminator criteria to an already-prepared query. * * This method should be used once for query criteria and not be used for * nested expressions. It should be called before * {@link DocumentPerister::addFilterToPreparedQuery()}. * * @param array $preparedQuery * @return array */ public function addDiscriminatorToPreparedQuery(array $preparedQuery) { /* If the class has a discriminator field, which is not already in the * criteria, inject it now. The field/values need no preparation. */ if ($this->class->hasDiscriminator() && !isset($preparedQuery[$this->class->discriminatorField])) { $discriminatorValues = $this->getClassDiscriminatorValues($this->class); $preparedQuery[$this->class->discriminatorField] = array('$in' => $discriminatorValues); } return $preparedQuery; }
/** * Prepares insert data for document * * @param mixed $document * @return array */ public function prepareInsertData($document) { $oid = spl_object_hash($document); $changeset = $this->uow->getDocumentChangeSet($document); $insertData = array(); foreach ($this->class->fieldMappings as $mapping) { if (isset($mapping['notSaved']) && $mapping['notSaved'] === true) { continue; } $new = isset($changeset[$mapping['fieldName']][1]) ? $changeset[$mapping['fieldName']][1] : null; if ($new === null && $mapping['nullable'] === false) { continue; } if ($this->class->isIdentifier($mapping['fieldName'])) { $insertData['_id'] = $this->prepareValue($mapping, $new); continue; } $value = $this->prepareValue($mapping, $new); if ($value === null && $mapping['nullable'] === false) { continue; } $insertData[$mapping['name']] = $value; if (isset($mapping['reference'])) { $scheduleForUpdate = false; if ($mapping['type'] === 'one') { if (!isset($insertData[$mapping['name']][$this->cmd . 'id'])) { $scheduleForUpdate = true; } } elseif ($mapping['type'] === 'many') { foreach ($insertData[$mapping['name']] as $ref) { if (!isset($ref[$this->cmd . 'id'])) { $scheduleForUpdate = true; break; } } } if ($scheduleForUpdate) { unset($insertData[$mapping['name']]); $id = spl_object_hash($document); $this->documentsToUpdate[$id] = $document; $this->fieldsToUpdate[$id][$mapping['fieldName']] = array($mapping, $new); } } } // add discriminator if the class has one if ($this->class->hasDiscriminator()) { $insertData[$this->class->discriminatorField['name']] = $this->class->discriminatorValue; } return $insertData; }
/** * Prepares a query and converts values to the types mongodb expects. * * @param string|array $query * @return array $query */ public function prepareQuery($query) { if (is_scalar($query)) { $query = array('_id' => $query); } if ($this->class->hasDiscriminator() && !isset($query[$this->class->discriminatorField['name']])) { $discriminatorValues = $this->getClassDiscriminatorValues($this->class); $query[$this->class->discriminatorField['name']] = array('$in' => $discriminatorValues); } $newQuery = array(); foreach ($query as $key => $value) { $value = $this->prepareQueryValue($key, $value); $newQuery[$key] = $value; } return $newQuery; }
/** * Prepares a query array by converting the portable Doctrine types to the types mongodb expects. * * @param string|array $query * @return array $newQuery */ public function prepareQuery($query) { if (is_scalar($query) || $query instanceof \MongoId) { $query = array('_id' => $query); } if ($this->class->hasDiscriminator() && !isset($query[$this->class->discriminatorField['name']])) { $discriminatorValues = $this->getClassDiscriminatorValues($this->class); $query[$this->class->discriminatorField['name']] = array('$in' => $discriminatorValues); } $newQuery = array(); if ($query) { foreach ($query as $key => $value) { if (isset($key[0]) && $key[0] === $this->cmd && is_array($value)) { $newQuery[$key] = $this->prepareSubQuery($value); } else { $newQuery[$key] = $this->prepareQueryElement($key, $value, null, true); } } $newQuery = $this->convertTypes($newQuery); } return $newQuery; }
protected function serializeClassNameAndDiscriminator(ClassMetadata $metadata) { $return = array(); if (isset($metadata->serializer['className']) && $metadata->serializer['className']) { $return[$this->classNameField] = $metadata->name; } if (isset($metadata->serializer['discriminator']) && $metadata->serializer['discriminator'] && $metadata->hasDiscriminator()) { $return[$metadata->discriminatorField['name']] = $metadata->discriminatorValue; } return $return; }