Example #1
0
 /**
  *
  * @param \frontend\modules\search\models\SearchForm $model
  * @return \yii\data\ArrayDataProvider
  */
 public static function getTorrentDataProvider(SearchForm $model)
 {
     $query = new ActiveQuery('\\frontend\\modules\\torrent\\models\\Torrent');
     $query->from(static::indexName());
     $query->with('scrapes');
     // Keywords
     $searchPattern = '';
     if (!empty($model->words)) {
         if (is_array($model->words)) {
             $wordQuery = $model->words;
             foreach ($wordQuery as $key => $word) {
                 $wordQuery[$key] = Yii::$app->sphinx->escapeMatchValue($word);
             }
             $exact = '"' . implode(' ', $wordQuery) . '"';
             $approximite = $exact . '/5';
             usort($wordQuery, function ($a, $b) {
                 $a = mb_strlen($a, 'utf-8');
                 $b = mb_strlen($b, 'utf-8');
                 if ($a === $b) {
                     return 0;
                 }
                 return $a > $b ? -1 : 1;
             });
             $tmp = array();
             $tmp[] = $exact;
             foreach ($wordQuery as $word) {
                 if (mb_strlen($word, 'utf-8') > 3) {
                     $tmp[] = $word;
                 }
             }
             $tmp[] = $approximite;
             $search = join(' | ', $tmp);
         } else {
             $search = Yii::$app->sphinx->escapeMatchValue($model->words);
         }
         $searchPattern .= '@name ' . $search;
         $query->addOptions(['ranker' => new Expression('expr(\'' . 'sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*user_weight)*1000+bm25 + ' . '(created_at - 1000000000) / (NOW() - 1000000000) * 100 + if(torrent_status=1,100,0)\')')]);
     }
     // Tag
     if (!empty($model->tags)) {
         $searchPattern .= ' @tags "=' . $model->tags . '"';
     }
     // Sortable
     $isSortable = \Yii::$app->request->get('sort');
     if (empty($isSortable)) {
         $query->addOrderBy(['weight()' => SORT_DESC, 'id' => SORT_DESC]);
     }
     if (!empty($searchPattern)) {
         $query->match(new Expression(':match', [':match' => $searchPattern]));
     }
     // Filter torrents by age
     if (!empty($model->age)) {
         $query->where("created_at >= " . (time() - $model->age * 86400));
     }
     $query->andWhere(['deleted' => 0]);
     $query->addOptions(['max_matches' => 10000]);
     return new SphinxActiveDataProvider(['query' => $query, 'sort' => ['attributes' => ['seeders', 'leechers']], 'db' => Yii::$app->sphinx, 'sort' => ['attributes' => ['name' => ['default' => SORT_DESC], 'created_at' => ['default' => SORT_DESC], 'size' => ['default' => SORT_DESC], 'seeders' => ['default' => SORT_DESC], 'leechers' => ['default' => SORT_DESC]]], 'pagination' => ['pageSize' => 35]]);
 }