/**
  * Reset sphinx client and apply the options
  *
  * Only apply filters and group by
  *
  * @param  SearchEngineOptions $options
  * @return SphinxSearch
  */
 protected function applyOptions(SearchEngineOptions $options)
 {
     $this->resetSphinx();
     $filters = [];
     foreach ($options->getCollections() as $collection) {
         $filters[] = sprintf("%u", crc32($collection->get_databox()->get_sbas_id() . '_' . $collection->get_coll_id()));
     }
     $this->sphinx->SetFilter('crc_sbas_coll', $filters);
     $this->sphinx->SetFilter('deleted', [0]);
     $this->sphinx->SetFilter('parent_record_id', [$options->getSearchType()]);
     if ($options->getDateFields() && ($options->getMaxDate() || $options->getMinDate())) {
         foreach (array_unique(array_map(function (\databox_field $field) {
             return $field->get_name();
         }, $options->getDateFields())) as $field) {
             $min = $options->getMinDate() ? $options->getMinDate()->format('U') : 0;
             $max = $options->getMaxDate() ? $options->getMaxDate()->format('U') : pow(2, 32);
             $this->sphinx->SetFilterRange(ConfigurationPanel::DATE_FIELD_PREFIX . $field, $min, $max);
         }
     }
     if ($options->getFields()) {
         $filters = [];
         foreach ($options->getFields() as $field) {
             $filters[] = sprintf("%u", crc32($field->get_databox()->get_sbas_id() . '_' . $field->get_id()));
         }
         $this->sphinx->SetFilter('crc_struct_id', $filters);
     }
     if ($options->getBusinessFieldsOn()) {
         $crc_coll_business = [];
         foreach ($options->getBusinessFieldsOn() as $collection) {
             $crc_coll_business[] = sprintf("%u", crc32($collection->get_coll_id() . '_1'));
             $crc_coll_business[] = sprintf("%u", crc32($collection->get_coll_id() . '_0'));
         }
         $non_business = [];
         foreach ($options->getCollections() as $collection) {
             foreach ($options->getBusinessFieldsOn() as $BFcollection) {
                 if ($collection->get_base_id() == $BFcollection->get_base_id()) {
                     continue 2;
                 }
             }
             $non_business[] = $collection;
         }
         foreach ($non_business as $collection) {
             $crc_coll_business[] = sprintf("%u", crc32($collection->get_coll_id() . '_0'));
         }
         $this->sphinx->SetFilter('crc_coll_business', $crc_coll_business);
     } elseif ($options->getFields()) {
         $this->sphinx->SetFilter('business', [0]);
     }
     /**
      * @todo : enhance : check status in a better way
      */
     $status_opts = $options->getStatus();
     foreach ($options->getDataboxes() as $databox) {
         foreach ($databox->get_statusbits() as $n => $status) {
             if (!array_key_exists($n, $status_opts)) {
                 continue;
             }
             if (!array_key_exists($databox->get_sbas_id(), $status_opts[$n])) {
                 continue;
             }
             $crc = sprintf("%u", crc32($databox->get_sbas_id() . '_' . $n));
             $this->sphinx->SetFilter('status', [$crc], $status_opts[$n][$databox->get_sbas_id()] == '0');
         }
     }
     if ($options->getRecordType()) {
         $this->sphinx->SetFilter('crc_type', [sprintf("%u", crc32($options->getRecordType()))]);
     }
     $order = '';
     switch ($options->getSortOrder()) {
         case SearchEngineOptions::SORT_MODE_ASC:
             $order = 'ASC';
             break;
         case SearchEngineOptions::SORT_MODE_DESC:
         default:
             $order = 'DESC';
             break;
     }
     switch ($options->getSortBy()) {
         case SearchEngineOptions::SORT_RANDOM:
             $sort = '@random';
             break;
         case SearchEngineOptions::SORT_RELEVANCE:
         default:
             $sort = '@relevance ' . $order . ', created_on ' . $order;
             break;
         case SearchEngineOptions::SORT_CREATED_ON:
             $sort = 'created_on ' . $order;
             break;
     }
     $this->sphinx->SetGroupBy('crc_sbas_record', SPH_GROUPBY_ATTR, $sort);
     return $this;
 }
Exemplo n.º 2
0
 /**
  * Executes the Phrasea query
  *
  * @param  string        $query
  * @return PhraseaEngine
  */
 private function executeQuery($query, SearchEngineOptions $options)
 {
     $nbanswers = $total_time = 0;
     $sort = '';
     if ($options->getSortBy()) {
         switch ($options->getSortOrder()) {
             case SearchEngineOptions::SORT_MODE_ASC:
                 $sort = '+';
                 break;
             case SearchEngineOptions::SORT_MODE_DESC:
             default:
                 $sort = '-';
                 break;
         }
         $sort .= '0' . $options->getSortBy();
     }
     foreach ($this->queries as $sbas_id => $qry) {
         $BF = [];
         foreach ($options->getBusinessFieldsOn() as $collection) {
             // limit business field query to databox local collection
             if ($sbas_id === $collection->get_sbas_id()) {
                 $BF[] = $collection->get_base_id();
             }
         }
         $results = phrasea_query2($this->app['session']->get('phrasea_session_id'), $sbas_id, $this->colls[$sbas_id], $this->arrayq[$sbas_id], $this->app['conf']->get(['main', 'key']), $this->app['session']->get('usr_id'), false, $options->getSearchType() == SearchEngineOptions::RECORD_GROUPING ? PHRASEA_MULTIDOC_REGONLY : PHRASEA_MULTIDOC_DOCONLY, $sort, $BF, $options->isStemmed() ? $options->getLocale() : null);
         if ($results) {
             $total_time += $results['time_all'];
             $nbanswers += $results["nbanswers"];
         }
     }
     $sql = 'UPDATE cache
             SET query = :query, query_time = NOW(), duration = :duration, total = :total
             WHERE session_id = :ses_id';
     $params = ['query' => $query, ':ses_id' => $this->app['session']->get('phrasea_session_id'), ':duration' => $total_time, ':total' => $nbanswers];
     $stmt = $this->app['phraseanet.appbox']->get_connection()->prepare($sql);
     $stmt->execute($params);
     $stmt->closeCursor();
     return $this;
 }
Exemplo n.º 3
0
 private function createSortQueryParams(SearchEngineOptions $options)
 {
     $sort = [];
     if ($options->getSortBy() === 'score') {
         $sort['_score'] = $options->getSortOrder();
     }
     $sort['created_on'] = $options->getSortOrder();
     return $sort;
 }
Exemplo n.º 4
0
 private function createSortQueryParams(SearchEngineOptions $options)
 {
     $sort = [];
     if ($options->getSortBy() === null || $options->getSortBy() === SearchEngineOptions::SORT_RELEVANCE) {
         $sort['_score'] = $options->getSortOrder();
     } elseif ($options->getSortBy() === SearchEngineOptions::SORT_CREATED_ON) {
         $sort['created_on'] = $options->getSortOrder();
     } else {
         $sort[sprintf('caption.%s', $options->getSortBy())] = $options->getSortOrder();
     }
     return $sort;
 }