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