/** * * @param mixed $collection string as collection name or core\Model * * * It must be last operation so this does not return reference * @todo use collection name from model */ public function out($collection) { if ($collection instanceof core\Model) { $mongomap = new mongom\MongOM($model); $collection = $mongomap->getEntity(); } $this->pipeline[]['$out'] = $collection; }
/** * * @param \com\bazaar\core\mongom\MongOM $map * @param array $data * @param bool $fromNonDB generate object from Model directly or Database using map * @return \com\bazaar\core\mongom\className * @throws \RuntimeException */ public static function loadObject(MongOM $map, $data, $fromNonDB = true) { $classMeta = $map->getEntity(); $className = $classMeta[MongOM::IDF_DOCUMENT_REF]; $setterName = $getterName = ''; /* * @todo will be removed when unitofwork workflow will be changed * * _id is mandatory but some documents like embeded document may not have * _id */ $id = $fromNonDB ? 'id' : '_id'; $modelID = !empty($data[$id]) ? $data[$id] : null; $model = new $className($modelID); //xdebug_var_dump($data); /* * Loop through all fields that does not belongs to database or persitence storage * these fields are usually generated from calculated field or mostly * Aggregated data. * * Currently it handles only scalar values */ foreach ($map->getPropertiesNonDBMapped($data) as $nondbfield) { $setterName = "set{$nondbfield}"; if (!method_exists($model, $setterName)) { throw new \RuntimeException("Setter method is not available for {$nondbfield}"); } /* * @todo id mapping * Skip ID field */ //xdebug_var_dump($nondbfield); $model->{$setterName}($data[$nondbfield]); } /* * Loop through all property */ //xdebug_var_dump($map->getPropertiesDBMapped()); foreach ($map->getPropertiesDBMapped() as $propertyNameModel => $propertyNameDB) { if ($fromNonDB) { $propertyNameDB = $propertyNameModel; } //xdebug_var_dump($data); $propertyMap = $map->getProperties()[$propertyNameModel]; /* * @important * use this setter getter name later in code for setter and getter * $propertyName matches with model property name so it matches with DEFAYLT setter name */ $setterName = isset($propertyMap['setter']) ? $propertyMap['setter'] : "set{$propertyNameModel}"; $getterName = isset($propertyMap['getter']) ? $propertyMap['getter'] : "get{$propertyNameModel}"; //xdebug_var_dump($setterName); if (!method_exists($model, $setterName)) { throw new \RuntimeException("Setter method is not available for {$propertyNameModel} in {$className}"); } //$propertyName = (isset($propertyMap['name'])) ? $propertyMap['name'] : $propertyName; // xdebug_var_dump($propertyNameDB); /* * 'reference' means it can be embeded or it can be referenced */ if (isset($propertyMap['reference'])) { //Get map for object $className = $propertyMap['reference']; $refPropMap = new MongOM(new $className()); /* * Handle many documents */ if (isset($propertyMap['hasMany']) && $propertyMap['hasMany']) { /** * @internal Get the list and update it instead of creating new * that way it dont need to look for list type and use * ArrayAccess interface to manipulate its data * Also it will by pass need of setter method for list * * create new map for heterogenous collecion otherwise use same * map */ $list = $model->{$getterName}(); assert('$list instanceof ArrayAccess'); foreach ($data[$propertyNameDB] as $listItemModelData) { //xdebug_var_dump("listdata",$listItemModelData); if (isset($propertyMap['isEmbeded']) && $propertyMap['isEmbeded']) { $list[] = MongOMDatastore::loadObject($refPropMap, $listItemModelData, false); } else { /* * only id reference is stored in list. so just get the id * Create object with only id */ $className = $propertyMap['reference']; $list[] = new $className($listItemModelData); } } } else { //xdebug_var_dump($fkFlag); /* * Handle embeded data */ if (isset($propertyMap['isEmbeded']) && $propertyMap['isEmbeded']) { $model->{$setterName}(MongOMDatastore::loadObject($refPropMap, $data[$propertyNameDB], false)); } else { if (isset($propertyMap['isReference']) && $propertyMap['isReference']) { //xdebug_var_dump("Reference"); /* * explicit FK * Dont iterate. initialize the model and set its properties */ if (isset($propertyMap['fk'])) { //xdebug_var_dump($model); $fkModel = new $propertyMap['reference'](); /* * @todo setter existance valdiation * @todo mark incomplete or ghost object marking for lazy loading */ $fkModel->{"set{$propertyMap['fk']}"}($data[$propertyNameDB]); $model->{$setterName}($fkModel); } else { $model->{$setterName}(MongOMDatastore::loadObject($refPropMap, $data[$propertyNameDB], false)); } } } } } else { /* $propertyData = (isset($data[$propertyName])) ? $data[$propertyName] : ''; $model->{$setterName}($propertyData); * */ //xdebug_var_dump($propertyMap); /* * If data is not available use default data stored in property init * In models */ if (isset($data[$propertyNameDB])) { //xdebug_var_dump("$setterName setting data "); /* * @todo will be removed when unitofwork workflow will be changed */ if (isset($propertyMap['id']) && $propertyMap['id']) { break; } $model->{$setterName}($data[$propertyNameDB]); } } } /** * @internal If object is loaded from DB it is clean and complete. So it should be marked as clean * @todo Will be removed in future */ if (!$fromNonDB) { UnitOfWork::getInstance()->registerclean($model); } return $model; }