public function process($fh) { // skip und check header $line = trim(fgets($fh)); if ($line != "rating,name,locality,url,country,name_alt,address,lat,lng,postal,address_ext") { $this->logError("Wrong fingerprint \n"); echo $this->getHelp(); Yii::app()->end(); } while (!feof($fh)) { $data = fgetcsv($fh); if ($data !== false) { $rating = $this->parseRating($data[0]); //! Use english for canonical names $name = $data[5] == "" ? $data[1] : $data[5]; //mihan007: just minor thing.. what is 5 and 1? don't like magic numbers. $cityName = $data[2]; $city = City::model()->guess($cityName); if (count($city) == 0) { $this->logError("Problem mapping city " . $data[2]); continue; } $city = $city[0]; $canonicalName = UtilsHelper::canonizeHotelName($name, $city->localEn); $this->saveRow($city->id, $canonicalName, $rating, $name); } } }
/** * Method to find rating for given hotels in given city * * @param array $hotel_names Names of hotels we want to lookup rating for * @param City $city City model instance for given hotel * @return array HotelName => rating */ public function findByNames($hotel_names, $city) { $canonized_names = array(); foreach ($hotel_names as $name) { $canonical_name = UtilsHelper::canonizeHotelName($name, $city->localEn); $canonized_names[$name] = $canonical_name; } $criteria = new CDbCriteria(); $criteria->addInCondition("canonical_name", $canonized_names); $criteria->addColumnCondition(array("city_id" => $city->id)); $rows = $this->findAll($criteria); $canonical_name_to_rating = array(); foreach ($rows as $row) { $canonical_name_to_rating[$row->canonical_name] = $row->rating; } $name_to_rating = array(); foreach ($canonized_names as $name => $canonical_name) { if (isset($canonical_name_to_rating[$canonical_name])) { $name_to_rating[$name] = $canonical_name_to_rating[$canonical_name]; } } return $name_to_rating; }