/** * 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;*/ }