mongoObj = new MongoClient(); } else { // if (!preg_match("~^mongo[:][/][/]\w+[:].+$~",$connectionString)){ // throw new CoreException("Invalid connectionString parameter passed to 'GenericDao::__construct()' ('".print_r($connectionString,true)."')"); // } $this->mongoObj = new MongoClient($connectionString); } $this->dbName = $dbName; $this->database = $this->mongoObj->$dbName; } /** * Restituisce il nome del database attualmente in uso * @return string */ public function getDbName(){ return $this->dbName; } /** * Ritorna un array di model * @param string $modelClass classe da ritornare (DaoSaveable) * @param array $filter array associativo della select formato mongo * @param array $options (al momento supporta limit e sort) * @param string $customReturnClass * @throws CoreException se la CustomReturnClass non è valida * @return DaoSaveable[] */ public function query($modelClass, array $filter = array(), array $options = array()){ if (!is_null($modelClass)){ if (!is_subclass_of($modelClass, "DaoSaveable", true)){ throw new CoreException("Invalid return class passed to GenericDao::query ($modelClass)"); } } $collectionName = $modelClass::getCollectionName(); $collection = $this->database->$collectionName; $useFilter = $filter; if (!array_key_exists("deleted",$useFilter)){ $useFilter["deleted"] = false; } if (array_key_exists("id",$useFilter)){ $useFilter["_id"] = $useFilter["id"]; unset($useFilter["id"]); } if (array_key_exists("_id",$useFilter) && is_string($useFilter["_id"])){ $useFilter["_id"] = new MongoId($useFilter["_id"]); } $cursor = $collection->find($useFilter); if (array_key_exists("sort",$options)){ $cursor->sort($options["sort"]); } if (array_key_exists("skip",$options)){ $cursor->skip($options["skip"]); } if (array_key_exists("limit",$options)){ $cursor->limit($options["limit"]); } $rval = array(); foreach ($cursor as $element){ $rval[] = $modelClass::buildFromSaveableObj($element); } return $rval; } public function count($modelClass, array $filter = array(), array $options = array()){ if (!is_null($modelClass)){ if (!is_subclass_of($modelClass, "DaoSaveable", true)){ throw new CoreException("Invalid return class passed to GenericDao::query ($modelClass)"); } } $collectionName = $modelClass::getCollectionName(); $collection = $this->database->$collectionName; $useFilter = $filter; if (!array_key_exists("deleted",$useFilter)){ $useFilter["deleted"] = false; } if (array_key_exists("id",$useFilter)){ $useFilter["_id"] = $useFilter["id"]; unset($useFilter["id"]); } if (array_key_exists("_id",$useFilter) && is_string($useFilter["_id"])){ $useFilter["_id"] = new MongoId($useFilter["_id"]); } $cursor = $collection->find($useFilter); return $cursor->count(true); } /** * Come query ma ritorna il primo o null se non ci sono risultati * @param string $modelClass * @param array $filter * @param array $options * @return DaoSaveable */ public function getFirst($modelClass, array $filter = array(), array $options = array()){ $rval = $this->query($modelClass,$filter,$options); if (sizeof($rval)>0){ $rval = reset($rval); } else { $rval = null; } return $rval; } /** * Salva... * @param DaoSaveable $model */ public function save(DaoSaveable $model){ $collectionName = $model->getCollectionName(); $collection = $this->database->$collectionName; $saveObj = $model->getSaveableObj(); if ( array_key_exists("_id", $saveObj) && !is_null($saveObj["_id"]) ){ $collection->update( array("_id"=>$saveObj["_id"] ), $saveObj ); } else { $saveObj["_id"] = new MongoId(); $collection->insert($saveObj); $model->updateFromSaveableObj($saveObj); } } /** * Cancella... la cancellazione non è reale, viene solo settato il campo deleted a true. * @param DaoSaveable $model */ public function delete(DaoSaveable $model){ $collectionName = $model->getCollectionName(); $collection = $this->database->$collectionName; $saveObj = $model->getSaveableObj(); if ( array_key_exists("_id", $saveObj) && !is_null($saveObj["_id"]) ){ $saveObj["deleted"] = true; $collection->update( array("_id"=>$saveObj["_id"] ), $saveObj ); $model->updateFromSaveableObj($saveObj); } } /** * Ritorna un array di model * @param string $modelClass classe da ritornare (DaoSaveable) * @param array $filter array associativo della select formato mongo * @param array $options (al momento supporta limit e sort) * @param string $customReturnClass * @throws CoreException se la CustomReturnClass non è valida * @return DaoSaveable[] */ public function aggregate($modelClass, array $pipeline = array(), array $options = array()){ if (!is_null($modelClass)){ if (!is_subclass_of($modelClass, "DaoSaveable", true)){ throw new CoreException("Invalid return class passed to GenericDao::aggregate ($modelClass)"); } } $collectionName = $modelClass::getCollectionName(); $collection = $this->database->$collectionName; $addDeleteMatch = true; if (sizeof($pipeline)>0){ foreach ($pipeline as $ele){ if (is_array($ele)){ // Check se esistono match su deleted if (array_key_exists('$match', $ele) && array_key_exists("deleted", $ele['$match'])){ $addDeleteMatch = false; } if (array_key_exists('$groupBy', $ele)){ // Sostituzione di id con _id foreach ($ele as $key=>$val){ if (array_key_exists("id",$val)){ $val["_id"] = $val["id"]; unset($val["id"]); } } // Sostituzione di _id stringa con MongoId if (array_key_exists("_id",$val) && is_string($val["_id"])){ $val["_id"] = new MongoId($val["_id"]); } } } } } if ($addDeleteMatch){ if (array_key_exists('$match', $pipeline[0])){ $pipeline[0]['$match']["deleted"] = false; // array_unshift($pipeline[0]['$match'], array("deleted"=>false)); } else { array_unshift($pipeline, array('$match'=>array("deleted"=>false))); } } $rval = array(); $resultArray = $collection->aggregate($pipeline); if (array_key_exists("result", $resultArray)){ $rval = $resultArray["result"]; } // var_dump($resultArray); return $rval; } /** * Ritorna la lista dei notizia model ordinati per pertinenza * @param string $modelClass * @param string $searchWord * @param array $filter * @param array $options * @throws CoreException * @return DaoSaveable[] */ public function search($modelClass, $searchWord, array $filter = array(), array $options = array()){ if (!is_null($modelClass)){ if (!is_subclass_of($modelClass, "DaoSaveable", true)){ throw new CoreException("Invalid return class passed to GenericDao::query ($modelClass)"); } } $collectionName = $modelClass::getCollectionName(); $collection = $this->database->$collectionName; $useFilter = $filter; $useFilter['$text'] = array('$search'=>$searchWord); if (!array_key_exists("deleted",$useFilter)){ $useFilter["deleted"] = false; } if (array_key_exists("id",$useFilter)){ $useFilter["_id"] = $useFilter["id"]; unset($useFilter["id"]); } if (array_key_exists("_id",$useFilter) && is_string($useFilter["_id"])){ $useFilter["_id"] = new MongoId($useFilter["_id"]); } $cursor = $collection->find($useFilter,array('score' => array('$meta' => 'textScore'))); $sortArray = array(); if (array_key_exists("sort",$options)){ $sortArray = $options["sort"]; } $sortArray = array_merge($sortArray,array('score' => array('$meta' => 'textScore')) ); $cursor->sort($sortArray); if (array_key_exists("skip",$options)){ $cursor->skip($options["skip"]); } if (array_key_exists("limit",$options)){ $cursor->limit($options["limit"]); } $rval = array(); foreach ($cursor as $element){ unset($element->score); $rval[] = $modelClass::buildFromSaveableObj($element); } return $rval; } public function searchCount($modelClass, $searchWord, array $filter = array(), array $options = array()){ if (!is_null($modelClass)){ if (!is_subclass_of($modelClass, "DaoSaveable", true)){ throw new CoreException("Invalid return class passed to GenericDao::query ($modelClass)"); } } $collectionName = $modelClass::getCollectionName(); $collection = $this->database->$collectionName; $useFilter = $filter; $useFilter['$text'] = array('$search'=>$searchWord); if (!array_key_exists("deleted",$useFilter)){ $useFilter["deleted"] = false; } if (array_key_exists("id",$useFilter)){ $useFilter["_id"] = $useFilter["id"]; unset($useFilter["id"]); } if (array_key_exists("_id",$useFilter) && is_string($useFilter["_id"])){ $useFilter["_id"] = new MongoId($useFilter["_id"]); } $cursor = $collection->find($useFilter,array('score' => array('$meta' => 'textScore'))); return $cursor->count(true); } } ?>