Пример #1
0
 /**
  * 
  * @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;
 }
Пример #2
0
 /**
  * 
  * @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;
 }