Esempio n. 1
0
 /**
  * Returns a singleton instance of Yadda_Solr.
  * 
  * @return Yadda_Solr
  */
 public static function getInstance()
 {
     if (self::$_instance === null) {
         self::$_instance = new self();
     }
     return self::$_instance;
 }
Esempio n. 2
0
 /**
  * Returns a paginated list of deals matching the given parameters.
  *
  * @param array $params
  * @return array
  */
 public static function search(array $params)
 {
     $return = array('description' => 'All deals', 'total' => 0, 'results' => array());
     $solrParams = array('q' => '*:*', 'fq' => array(), 'wt' => 'json', 'sort' => 'display_date desc', 'omitHeader' => 'true');
     // query
     if (isset($params['query']) && !empty($params['query'])) {
         $query = trim($params['query']);
         $return['description'] .= ' matching "' . $query . '"';
         $solrParams['q'] = '_text:' . $query;
     }
     // region
     if (isset($params['region'])) {
         $region = Yadda_Model_Region::find($params['region']);
         $return['description'] .= ' in ' . $region['name'];
         $solrParams['fq'][] = 'region_id:' . $region['id'];
     }
     // price
     if (isset($params['price'])) {
         if (!isset(self::$priceRanges[$params['price']])) {
             throw new Yadda_Model_Exception('Invalid price range "' . $params['price'] . '"');
         }
         $range = self::$priceRanges[$params['price']];
         $return['description'] .= ' priced R' . $range[0] . ' -';
         if (sizeof($range) > 1) {
             $return['description'] .= ' R' . $range[1];
         }
         $solrParams['fq'][] = 'price:[' . $range[0] . ' TO ' . (sizeof($range) > 1 ? $range[1] : '*') . ']';
     }
     // since
     if (isset($params['since'])) {
         $solrParams['fq'][] = 'display_date:[' . $params['since'] . ' TO *]';
     }
     // count
     $count = 10;
     if (isset($params['count'])) {
         $count = (int) $params['count'];
     }
     $params['count'] = $count;
     $solrParams['rows'] = $count;
     // page
     $page = 1;
     if (isset($params['page'])) {
         $page = (int) $params['page'];
     }
     $params['page'] = $page;
     $solrParams['start'] = ($page - 1) * $count;
     $return['params'] = $params;
     $solr = Yadda_Solr::getInstance();
     $body = $solr->get('/select', $solrParams);
     $data = Zend_Json::decode($body);
     $return['total'] = (int) $data['response']['numFound'];
     $return['pages'] = (int) ceil($return['total'] / $count);
     $start = (int) $data['response']['start'];
     $return['page'] = (int) floor($start / $count) + 1;
     foreach ($data['response']['docs'] as $doc) {
         $return['results'][] = self::toArray((object) $doc);
     }
     return $return;
     /*$description = 'All deals';
     		
     		$dealDb = Yadda_Db_Table::getInstance('deal');
     		$select = $dealDb
     			->select()
     			->setIntegrityCheck(false)
     			->from('deal')
     			->joinLeft('site', 'deal.site_id = site.id', array(
     				'site_name' => 'name'
     			))
     			->joinLeft('region', 'deal.region_id = region.id', array(
     				'region_name' => 'name',
     				'region_country_code' => 'country_code'
     			))
     			->where('deal.status != ?', 'deleted')
     			->order(array('deal.display_date DESC', 'deal.id DESC'))
     			->group('deal.id');
     			
     		// check parameters
     		
     		if (isset($params['region'])) {
     			$region = Yadda_Model_Region::find($params['region']);
     			$description .= ' in '.$region['name'];
     			//$select->where('region.id = ?', $region['id']);
     		}
     		
     		if (isset($params['price'])) {
     			foreach (self::$priceRanges as $key => $range) {
     				if ($params['price'] == $key) {
     					$description .= ' priced ';
     					$description .= 'R'.$range[0].' -';
     					if (sizeof($range) > 1) {
     						$description .= ' R'.$range[1];
     					}
     					$select->where('price IS NOT NULL');
     					$select->where('price >= ?', $range[0]);
     					if (sizeof($range) > 1) {
     						$select->where('price <= ?', $range[1]);
     					}
     				}
     			}
     		}
     		
     		// fetch
     		
     		/*$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbSelect($select));
     		$paginator->setCurrentPageNumber(isset($params['page']) ? (int) $params['page'] : 1);
     		$paginator->setItemCountPerPage(isset($params['count']) ? (int) $params['count'] : 10);
     		
     		$return = array(
     			'description' => $description,
     			'params' => $params,
     			'total' => $paginator->getTotalItemCount(),
     			'page' => $paginator->getCurrentPageNumber(),
     			'pages' => $paginator->count(),
     			'results' => array()
     		);
     		
     		$deals = new Zend_Db_Table_Rowset(array(
     			'table' => $dealDb,
     			'data' => (array) $paginator->getCurrentItems()
     		));
     		
     		foreach ($deals as $deal) {
     			$return['results'][] = self::toArray($deal);
     		}
     		
     		return $return;*/
 }