diff --git a/classes/format.class.php b/classes/format.class.php index f3931e6d..b7885e39 100644 --- a/classes/format.class.php +++ b/classes/format.class.php @@ -404,11 +404,11 @@ public static function form($Index, $Return = false) { /** * Convenience function to echo out selected="selected" and checked="checked" so you don't have to. * - * @param $Name the name of the option in the select (or field in $Array) - * @param $Value the value that the option must be for the option to be marked as selected or checked - * @param $Attribute The value returned/echoed is $Attribute="$Attribute" with a leading space - * @param $Array The array the option is in, defaults to GET. - * @return + * @param string $Name the name of the option in the select (or field in $Array) + * @param mixed $Value the value that the option must be for the option to be marked as selected or checked + * @param string $Attribute The value returned/echoed is $Attribute="$Attribute" with a leading space + * @param array $Array The array the option is in, defaults to GET. + * @return void */ public static function selected($Name, $Value, $Attribute = 'selected', $Array = array()) { if (empty($Array)) { diff --git a/classes/misc.class.php b/classes/misc.class.php index f01938b4..fb104ef4 100644 --- a/classes/misc.class.php +++ b/classes/misc.class.php @@ -367,7 +367,7 @@ public static function assert_isset_request($Request, $Keys = null, $AllowEmpty /** * Given an array of tags, return an array of their IDs. * - * @param arary $TagNames + * @param array $TagNames * @return array IDs */ public static function get_tags($TagNames) { diff --git a/classes/requests.class.php b/classes/requests.class.php index 75f43ab3..db4865ab 100644 --- a/classes/requests.class.php +++ b/classes/requests.class.php @@ -7,15 +7,24 @@ class Requests { */ public static function update_sphinx_requests($RequestID) { $QueryID = G::$DB->get_query_id(); + + G::$DB->query(" + SELECT REPLACE(t.Name, '.', '_') + FROM tags AS t + JOIN requests_tags AS rt ON t.ID = rt.TagID + WHERE rt.RequestID = $RequestID"); + $TagList = G::$DB->collect(0, false); + $TagList = db_string(implode(' ', $TagList)); + G::$DB->query(" REPLACE INTO sphinx_requests_delta ( - ID, UserID, TimeAdded, LastVote, CategoryID, Title, + ID, UserID, TimeAdded, LastVote, CategoryID, Title, TagList, Year, ReleaseType, CatalogueNumber, RecordLabel, BitrateList, FormatList, MediaList, LogCue, FillerID, TorrentID, TimeFilled, Visible, Votes, Bounty) SELECT ID, r.UserID, UNIX_TIMESTAMP(TimeAdded) AS TimeAdded, - UNIX_TIMESTAMP(LastVote) AS LastVote, CategoryID, Title, + UNIX_TIMESTAMP(LastVote) AS LastVote, CategoryID, Title, '$TagList', Year, ReleaseType, CatalogueNumber, RecordLabel, BitrateList, FormatList, MediaList, LogCue, FillerID, TorrentID, UNIX_TIMESTAMP(TimeFilled) AS TimeFilled, Visible, @@ -233,4 +242,3 @@ public static function get_votes_array($RequestID) { } } -?> diff --git a/classes/tags.class.php b/classes/tags.class.php index 9e6b1fef..8ab798c1 100644 --- a/classes/tags.class.php +++ b/classes/tags.class.php @@ -22,7 +22,7 @@ * indie (1) * * Each time a new Tags object is instantiated, the tag list is merged with the - * overall total amount of tags to provide the top tags. Merging is optional. + * overall total amount of tags to provide a Top Tags list. Merging is optional. */ class Tags { /** @@ -145,6 +145,8 @@ public function format($Link = 'torrents.php?taglist=', $ArtistName = '') { /** * Format a list of top tags * @param int $Max Max number of items to get + * @param string $Link Page query where more items of this tag type can be found + * @param string $ArtistName Optional artist */ public static function format_top($Max = 5, $Link = 'torrents.php?taglist=', $ArtistName = '') { if (empty(self::$All)) { ?> @@ -159,4 +161,115 @@ public static function format_top($Max = 5, $Link = 'torrents.php?taglist=', $Ar
  • ()
  • get_value('tag_aliases_search'); + if ($TagAliases === false) { + G::$DB->query(' + SELECT ID, BadTag, AliasTag + FROM tag_aliases + ORDER BY BadTag'); + $TagAliases = G::$DB->to_array(false, MYSQLI_ASSOC, false); + // Unify tag aliases to be in_this_format as tags not in.this.format + array_walk_recursive($TagAliases, create_function('&$val', '$val = preg_replace("/\./","_", $val);')); + // Clean up the array for smaller cache size + foreach ($TagAliases as &$TagAlias) { + foreach (array_keys($TagAlias) as $Key) { + if (is_numeric($Key)) { + unset($TagAlias[$Key]); + } + } + } + G::$Cache->cache_value('tag_aliases_search', $TagAliases, 3600 * 24 * 7); // cache for 7 days + } + return $TagAliases; + } + + /** + * Replace bad tags with tag aliases + * @param array $Tags Array with sub-arrays 'include' and 'exclude' + * @return array + */ + public static function remove_aliases($Tags) { + $TagAliases = self::get_aliases(); + + $End = count($Tags['include']); + for ($i = 0; $i < $End; $i++) { + foreach ($TagAliases as $TagAlias) { + if ($Tags['include'][$i] === $TagAlias['BadTag']) { + $Tags['include'][$i] = $TagAlias['AliasTag']; + break; + } + } + } + + $End = count($Tags['exclude']); + for ($i = 0; $i < $End; $i++) { + foreach ($TagAliases as $TagAlias) { + if (substr($Tags['exclude'][$i], 1) === $TagAlias['BadTag']) { + $Tags['exclude'][$i] = '!'.$TagAlias['AliasTag']; + break; + } + } + } + + // Only keep unique entries after unifying tag standard + $Tags['include'] = array_unique($Tags['include']); + $Tags['exclude'] = array_unique($Tags['exclude']); + + return $Tags; + } + + /** + * Filters a list of include and exclude tags to be used in a Sphinx search + * @param array $Tags An array of tags with sub-arrays 'include' and 'exclude' + * @param boolean $EnableNegation Sphinx needs at least one positive search condition to support the NOT operator + * @param integer $TagType Search for Any or All of these tags. + * @return array Array keys predicate and input + * Predicate for a Sphinx 'taglist' query + * Input contains clean, aliased tags. Use it in a form instead of the user submitted string + */ + public static function tag_filter_sph($Tags, $EnableNegation, $TagType) { + $QueryParts = []; + $Tags = Tags::remove_aliases($Tags); + $TagList = str_replace('_', '.', implode(', ', array_merge($Tags['include'], $Tags['exclude']))); + + if (!$EnableNegation && !empty($Tags['exclude'])) { + $Tags['include'] = array_merge($Tags['include'], $Tags['exclude']); + unset($Tags['exclude']); + } + + foreach ($Tags['include'] as &$Tag) { + $Tag = Sphinxql::sph_escape_string($Tag); + } + + if (!empty($Tags['exclude'])) { + foreach ($Tags['exclude'] as &$Tag) { + $Tag = '!' . Sphinxql::sph_escape_string(substr($Tag, 1)); + } + } + + // 'All' tags + if (!isset($TagType) || $TagType == 1) { + $SearchWords = array_merge($Tags['include'], $Tags['exclude']); + if (!empty($Tags)) { + $QueryParts[] = implode(' ', $SearchWords); + } + } + // 'Any' tags + else { + if (!empty($Tags['include'])) { + $QueryParts[] = '( ' . implode(' | ', $Tags['include']) . ' )'; + } + if (!empty($Tags['exclude'])) { + $QueryParts[] = implode(' ', $Tags['exclude']); + } + } + + return ['input' => $TagList, 'predicate' => implode(' ', $QueryParts)]; + } } diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt index 809400ae..238d4f50 100644 --- a/docs/CHANGES.txt +++ b/docs/CHANGES.txt @@ -1,5 +1,11 @@ CHANGE LOG +2014-04-06 by hateradio +Add wildcard support to taglist in request search + +2014-04-05 by DutchDude +Make blog post author name link to author profile + 2014-03-31 by Ajax Pushbullet support for push notifications diff --git a/sections/ajax/browse.php b/sections/ajax/browse.php index 7eb555d1..d8e7df7f 100644 --- a/sections/ajax/browse.php +++ b/sections/ajax/browse.php @@ -261,95 +261,22 @@ // Tag list if (!empty($SearchWords['taglist'])) { - //Get tag aliases. - $TagAliases = $Cache->get_value('tag_aliases_search'); - if ($TagAliases === false) { - $DB->query(' - SELECT ID, BadTag, AliasTag - FROM tag_aliases - ORDER BY BadTag'); - $TagAliases = $DB->to_array(false, MYSQLI_ASSOC, false); - //Unify tag aliases to be in_this_format as tags not in.this.format - array_walk_recursive($TagAliases, create_function('&$val', '$val = preg_replace("/\./","_", $val);')); - //Clean up the array for smaller cache size - foreach ($TagAliases as &$TagAlias) { - foreach (array_keys($TagAlias) as $Key) { - if (is_numeric($Key)) { - unset($TagAlias[$Key]); - } - } - } - $Cache->cache_value('tag_aliases_search', $TagAliases, 3600 * 24 * 7); // cache for 7 days - } + $_GET['tags_type'] = (!isset($_GET['tags_type']) || $_GET['tags_type'] == 1) ? '1' : '0'; + $TagType = (int)$_GET['tags_type']; + //Get tags $Tags = $SearchWords['taglist']; - //Replace bad tags with tag aliases - $End = count($Tags['include']); - for ($i = 0; $i < $End; $i++) { - foreach ($TagAliases as $TagAlias) { - if ($Tags['include'][$i] === $TagAlias['BadTag']) { - $Tags['include'][$i] = $TagAlias['AliasTag']; - break; - } - } - } - $End = count($Tags['exclude']); - for ($i = 0; $i < $End; $i++) { - foreach ($TagAliases as $TagAlias) { - if (substr($Tags['exclude'][$i], 1) === $TagAlias['BadTag']) { - $Tags['exclude'][$i] = '!'.$TagAlias['AliasTag']; - break; - } - } - } - //Only keep unique entries after unifying tag standard - $Tags['include'] = array_unique($Tags['include']); - $Tags['exclude'] = array_unique($Tags['exclude']); - $TagListString = implode(', ', array_merge($Tags['include'], $Tags['exclude'])); - if (!$EnableNegation && !empty($Tags['exclude'])) { - $Tags['include'] = array_merge($Tags['include'], $Tags['exclude']); - unset($Tags['exclude']); - } - foreach ($Tags['include'] as &$Tag) { - $Tag = Sphinxql::sph_escape_string($Tag); - } - if (!empty($Tags['exclude'])) { - foreach ($Tags['exclude'] as &$Tag) { - $Tag = '!'.Sphinxql::sph_escape_string(substr($Tag, 1)); - } - } - $QueryParts = array(); - // 'All' tags - if (!isset($_GET['tags_type']) || $_GET['tags_type'] == 1) { - $_GET['tags_type'] = '1'; - $Tags = array_merge($Tags['include'], $Tags['exclude']); - if (!empty($Tags)) { - $QueryParts[] = implode(' ', $Tags); - } - } - // 'Any' tags - else { - $_GET['tags_type'] = '0'; - if (!empty($Tags['include'])) { - $QueryParts[] = '( '.implode(' | ', $Tags['include']).' )'; - } - if (!empty($Tags['exclude'])) { - $QueryParts[] = implode(' ', $Tags['exclude']); - } - } - if (!empty($QueryParts)) { - $SphQL->where_match(implode(' ', $QueryParts), 'taglist', false); - $SphQLTor->where_match(implode(' ', $QueryParts), 'taglist', false); + $TagFilter = Tags::tag_filter_sph($Tags, $EnableNegation, $TagType); + if (!empty($TagFilter['predicate'])) { + $SphQL->where_match($TagFilter['predicate'], 'taglist', false); + $SphQLTor->where_match($TagFilter['predicate'], 'taglist', false); } unset($SearchWords['taglist']); } elseif (!isset($_GET['tags_type'])) { $_GET['tags_type'] = '1'; } -if (!isset($TagListString)) { - $TagListString = ""; -} foreach ($SearchWords as $Search => $Words) { $QueryParts = array(); diff --git a/sections/ajax/requests.php b/sections/ajax/requests.php index 6c72dc8a..c52e51e0 100644 --- a/sections/ajax/requests.php +++ b/sections/ajax/requests.php @@ -194,23 +194,6 @@ $EnableNegation = true; } } - $QueryParts = array(); - if (!$EnableNegation && !empty($SearchWords['exclude'])) { - $SearchWords['include'] = array_merge($SearchWords['include'], $SearchWords['exclude']); - unset($SearchWords['exclude']); - } - foreach ($SearchWords['include'] as $Word) { - $QueryParts[] = Sphinxql::sph_escape_string($Word); - } - if (!empty($SearchWords['exclude'])) { - foreach ($SearchWords['exclude'] as $Word) { - $QueryParts[] = '!' . Sphinxql::sph_escape_string(substr($Word, 1)); - } - } - if (!empty($QueryParts)) { - $SearchString = implode(' ', $QueryParts); - $SphQL->where_match($SearchString, '*', false); - } } } @@ -222,29 +205,27 @@ $_GET['tags_type'] = '0'; } if (!empty($_GET['tags'])) { + $SearchTags = array('include' => array(), 'exclude' => array()); $Tags = explode(',', $_GET['tags']); - $TagNames = $TagsExclude = array(); - // Remove illegal characters from the given tag names foreach ($Tags as $Tag) { - $Tag = ltrim($Tag); - $Exclude = ($Tag[0] === '!'); - $Tag = Misc::sanitize_tag($Tag); - if (!empty($Tag)) { - $TagNames[] = $Tag; - $TagsExclude[$Tag] = $Exclude; + $Tag = trim($Tag); + if ($Tag[0] === '!' && strlen($Tag) >= 2) { + if (strpos($Tag, '!', 1) === false) { + $SearchTags['exclude'][] = $Tag; + } else { + $SearchTags['include'][] = $Tag; + $EnableNegation = true; + } + } elseif ($Tag !== '') { + $SearchTags['include'][] = $Tag; + $EnableNegation = true; } } - $AllNegative = !in_array(false, $TagsExclude, true); - $Tags = Misc::get_tags($TagNames); - // Replace the ! characters that sanitize_tag removed - if ($TagType === 1 || $AllNegative) { - foreach ($TagNames as &$TagName) { - if ($TagsExclude[$TagName]) { - $TagName = "!$TagName"; - } - } - unset($TagName); + $TagFilter = Tags::tag_filter_sph($SearchTags, $EnableNegation, $TagType); + + if (!empty($TagFilter['predicate'])) { + $SphQL->where_match($TagFilter['predicate'], 'taglist', false); } } elseif (!isset($_GET['tags_type']) || $_GET['tags_type'] !== '0') { $_GET['tags_type'] = 1; @@ -252,13 +233,24 @@ $_GET['tags_type'] = 0; } -// 'All' tags -if ($TagType === 1 && !empty($Tags)) { - foreach ($Tags as $TagID => $TagName) { - $SphQL->where('tagid', $TagID, $TagsExclude[$TagName]); +if (isset($SearchWords)) { + $QueryParts = array(); + if (!$EnableNegation && !empty($SearchWords['exclude'])) { + $SearchWords['include'] = array_merge($SearchWords['include'], $SearchWords['exclude']); + unset($SearchWords['exclude']); + } + foreach ($SearchWords['include'] as $Word) { + $QueryParts[] = Sphinxql::sph_escape_string($Word); + } + if (!empty($SearchWords['exclude'])) { + foreach ($SearchWords['exclude'] as $Word) { + $QueryParts[] = '!' . Sphinxql::sph_escape_string(substr($Word, 1)); + } + } + if (!empty($QueryParts)) { + $SearchString = implode(' ', $QueryParts); + $SphQL->where_match($SearchString, '*', false); } -} elseif (!empty($Tags)) { - $SphQL->where('tagid', array_keys($Tags), $AllNegative); } if (!empty($_GET['filter_cat'])) { diff --git a/sections/blog/index.php b/sections/blog/index.php index 7e1bfd38..286ad562 100644 --- a/sections/blog/index.php +++ b/sections/blog/index.php @@ -147,6 +147,7 @@ SELECT b.ID, um.Username, + b.UserID, b.Title, b.Body, b.Time, @@ -156,7 +157,7 @@ ORDER BY Time DESC LIMIT 20"); $Blog = $DB->to_array(); - $Cache->cache_value('Blog', $Blog, 1209600); + $Cache->cache_value('blog', $Blog, 1209600); } if ($LoggedUser['LastReadBlog'] < $Blog[0][0]) { @@ -171,11 +172,11 @@ } foreach ($Blog as $BlogItem) { - list($BlogID, $Author, $Title, $Body, $BlogTime, $ThreadID) = $BlogItem; + list($BlogID, $Author, $AuthorID, $Title, $Body, $BlogTime, $ThreadID) = $BlogItem; ?>
    - - posted by + - posted by - Edit Delete diff --git a/sections/index/private.php b/sections/index/private.php index fe23b743..4de8077f 100644 --- a/sections/index/private.php +++ b/sections/index/private.php @@ -97,6 +97,7 @@ SELECT b.ID, um.Username, + b.UserID, b.Title, b.Body, b.Time, @@ -117,7 +118,7 @@ $Limit = 5; } for ($i = 0; $i < $Limit; $i++) { - list($BlogID, $Author, $Title, $Body, $BlogTime, $ThreadID) = $Blog[$i]; + list($BlogID, $Author, $AuthorID, $Title, $Body, $BlogTime, $ThreadID) = $Blog[$i]; ?>
  • . diff --git a/sections/requests/requests.php b/sections/requests/requests.php index 34d107d0..994e2f50 100644 --- a/sections/requests/requests.php +++ b/sections/requests/requests.php @@ -195,23 +195,6 @@ $EnableNegation = true; } } - $QueryParts = array(); - if (!$EnableNegation && !empty($SearchWords['exclude'])) { - $SearchWords['include'] = array_merge($SearchWords['include'], $SearchWords['exclude']); - unset($SearchWords['exclude']); - } - foreach ($SearchWords['include'] as $Word) { - $QueryParts[] = Sphinxql::sph_escape_string($Word); - } - if (!empty($SearchWords['exclude'])) { - foreach ($SearchWords['exclude'] as $Word) { - $QueryParts[] = '!' . Sphinxql::sph_escape_string(substr($Word, 1)); - } - } - if (!empty($QueryParts)) { - $SearchString = implode(' ', $QueryParts); - $SphQL->where_match($SearchString, '*', false); - } } } @@ -224,43 +207,54 @@ } if (!empty($_GET['tags'])) { - $Tags = explode(',', $_GET['tags']); - $TagNames = $TagsExclude = array(); - // Remove illegal characters from the given tag names + $SearchTags = array('include' => array(), 'exclude' => array()); + $Tags = explode(',', str_replace('.', '_', $_GET['tags'])); foreach ($Tags as $Tag) { - $Tag = ltrim($Tag); - $Exclude = ($Tag[0] === '!'); - $Tag = Misc::sanitize_tag($Tag); - if (!empty($Tag)) { - $TagNames[] = $Tag; - $TagsExclude[$Tag] = $Exclude; - } - } - $AllNegative = !in_array(false, $TagsExclude, true); - $Tags = Misc::get_tags($TagNames); - - // Replace the ! characters that sanitize_tag removed - if ($TagType === 1 || $AllNegative) { - foreach ($TagNames as &$TagName) { - if ($TagsExclude[$TagName]) { - $TagName = "!$TagName"; + $Tag = trim($Tag); + if ($Tag[0] === '!' && strlen($Tag) >= 2) { + if (strpos($Tag, '!', 1) === false) { + $SearchTags['exclude'][] = $Tag; + } else { + $SearchTags['include'][] = $Tag; + $EnableNegation = true; } + } elseif ($Tag !== '') { + $SearchTags['include'][] = $Tag; + $EnableNegation = true; } - unset($TagName); } + + $TagFilter = Tags::tag_filter_sph($SearchTags, $EnableNegation, $TagType); + $TagNames = $TagFilter['input']; + + if (!empty($TagFilter['predicate'])) { + $SphQL->where_match($TagFilter['predicate'], 'taglist', false); + } + } elseif (!isset($_GET['tags_type']) || $_GET['tags_type'] !== '0') { $_GET['tags_type'] = 1; } else { $_GET['tags_type'] = 0; } -// 'All' tags -if ($TagType === 1 && !empty($Tags)) { - foreach ($Tags as $TagID => $TagName) { - $SphQL->where('tagid', $TagID, $TagsExclude[$TagName]); +if (isset($SearchWords)) { + $QueryParts = array(); + if (!$EnableNegation && !empty($SearchWords['exclude'])) { + $SearchWords['include'] = array_merge($SearchWords['include'], $SearchWords['exclude']); + unset($SearchWords['exclude']); + } + foreach ($SearchWords['include'] as $Word) { + $QueryParts[] = Sphinxql::sph_escape_string($Word); + } + if (!empty($SearchWords['exclude'])) { + foreach ($SearchWords['exclude'] as $Word) { + $QueryParts[] = '!' . Sphinxql::sph_escape_string(substr($Word, 1)); + } + } + if (!empty($QueryParts)) { + $SearchString = implode(' ', $QueryParts); + $SphQL->where_match($SearchString, '*', false); } -} elseif (!empty($Tags)) { - $SphQL->where('tagid', array_keys($Tags), $AllNegative); } if (!empty($_GET['filter_cat'])) { @@ -382,7 +376,7 @@ Tags (comma-separated): - />  + />  />   /> diff --git a/sections/torrents/browse.php b/sections/torrents/browse.php index 8aeac711..c6382629 100644 --- a/sections/torrents/browse.php +++ b/sections/torrents/browse.php @@ -322,96 +322,26 @@ function header_link($SortKey, $DefaultWay = 'desc') { // Tag list if (!empty($SearchWords['taglist'])) { - // Get tag aliases. - $TagAliases = $Cache->get_value('tag_aliases_search'); - if ($TagAliases === false) { - $DB->query(' - SELECT ID, BadTag, AliasTag - FROM tag_aliases - ORDER BY BadTag'); - $TagAliases = $DB->to_array(false, MYSQLI_ASSOC, false); - // Unify tag aliases to be in_this_format as tags not in.this.format - array_walk_recursive($TagAliases, create_function('&$val', '$val = preg_replace("/\./","_", $val);')); - // Clean up the array for smaller cache size - foreach ($TagAliases as &$TagAlias) { - foreach (array_keys($TagAlias) as $Key) { - if (is_numeric($Key)) { - unset($TagAlias[$Key]); - } - } - } - $Cache->cache_value('tag_aliases_search', $TagAliases, 3600 * 24 * 7); // cache for 7 days - } - // Get tags - $Tags = $SearchWords['taglist']; - // Replace bad tags with tag aliases - $End = count($Tags['include']); - for ($i = 0; $i < $End; $i++) { - foreach ($TagAliases as $TagAlias) { - if ($Tags['include'][$i] === $TagAlias['BadTag']) { - $Tags['include'][$i] = $TagAlias['AliasTag']; - break; - } - } - } - $End = count($Tags['exclude']); - for ($i = 0; $i < $End; $i++) { - foreach ($TagAliases as $TagAlias) { - if (substr($Tags['exclude'][$i], 1) === $TagAlias['BadTag']) { - $Tags['exclude'][$i] = '!'.$TagAlias['AliasTag']; - break; - } - } - } - // Only keep unique entries after unifying tag standard - $Tags['include'] = array_unique($Tags['include']); - $Tags['exclude'] = array_unique($Tags['exclude']); - $TagListString = implode(', ', array_merge($Tags['include'], $Tags['exclude'])); - if (!$EnableNegation && !empty($Tags['exclude'])) { - $Tags['include'] = array_merge($Tags['include'], $Tags['exclude']); - unset($Tags['exclude']); - } - foreach ($Tags['include'] as &$Tag) { - $Tag = Sphinxql::sph_escape_string($Tag); - } - if (!empty($Tags['exclude'])) { - foreach ($Tags['exclude'] as &$Tag) { - $Tag = '!'.Sphinxql::sph_escape_string(substr($Tag, 1)); - } - } + $_GET['tags_type'] = (!isset($_GET['tags_type']) || $_GET['tags_type'] == 1) ? '1' : '0'; + $TagType = (int)$_GET['tags_type']; - $QueryParts = array(); - // 'All' tags - if (!isset($_GET['tags_type']) || $_GET['tags_type'] == 1) { - $_GET['tags_type'] = '1'; - $Tags = array_merge($Tags['include'], $Tags['exclude']); - if (!empty($Tags)) { - $QueryParts[] = implode(' ', $Tags); - } - } - // 'Any' tags - else { - $_GET['tags_type'] = '0'; - if (!empty($Tags['include'])) { - $QueryParts[] = '( '.implode(' | ', $Tags['include']).' )'; - } - if (!empty($Tags['exclude'])) { - $QueryParts[] = implode(' ', $Tags['exclude']); - } - } - if (!empty($QueryParts)) { - $SphQL->where_match(implode(' ', $QueryParts), 'taglist', false); - $SphQLTor->where_match(implode(' ', $QueryParts), 'taglist', false); + //Get tags + $Tags = $SearchWords['taglist']; + + $TagFilter = Tags::tag_filter_sph($Tags, $EnableNegation, $TagType); + $TagListString = $TagFilter['input']; + + if (!empty($TagFilter['predicate'])) { + $SphQL->where_match($TagFilter['predicate'], 'taglist', false); + $SphQLTor->where_match($TagFilter['predicate'], 'taglist', false); $Filtered = true; } unset($SearchWords['taglist']); + } elseif (!isset($_GET['tags_type'])) { $_GET['tags_type'] = '1'; } -if (!isset($TagListString)) { - $TagListString = ""; -} foreach ($SearchWords as $Search => $Words) { $QueryParts = array(); @@ -786,7 +716,7 @@ function header_link($SortKey, $DefaultWay = 'desc') { Tags (comma-separated): -   + />  />   /> diff --git a/sphinx.conf b/sphinx.conf index 377b2efc..38f20404 100644 --- a/sphinx.conf +++ b/sphinx.conf @@ -93,6 +93,7 @@ source torrents : torrents_base { index torrents { source = torrents path = /var/lib/sphinx/torrents + dict = crc # stopwords = /etc/sphinx/stopwords.txt # Path to file containing a space separated list of words not to index preopen = 1 morphology = none @@ -309,7 +310,7 @@ index delta : torrents { path = /var/lib/sphinx/delta } -source requests : connect { +source requests_base : connect { sql_attr_uint = UserID sql_attr_uint = TimeAdded sql_attr_uint = LastVote @@ -322,7 +323,9 @@ source requests : connect { sql_attr_uint = Visible sql_attr_uint = Votes sql_attr_uint = Bounty +} +source requests : requests_base { sql_query_pre = TRUNCATE TABLE sphinx_requests sql_query_pre = SET group_concat_max_len = 10140 sql_query_pre = SET @starttime = NOW() @@ -363,49 +366,45 @@ source requests : connect { Year AS YearFullText \ FROM sphinx_requests - sql_query_post_index = DELETE FROM sphinx_requests_delta WHERE TimeAdded <= \ - (SELECT ID FROM sphinx_index_last_pos WHERE type = 'requests') - - sql_attr_multi = uint TagID from query; \ - SELECT RequestID AS ID, TagID FROM requests_tags + sql_joined_field = taglist from query; \ + SELECT rt.RequestID, REPLACE(t.Name, '.', '_') \ + FROM requests_tags AS rt \ + JOIN tags AS t ON TagID = ID \ + ORDER BY requestid ASC; sql_attr_multi = uint Voter from query; \ - SELECT RequestID AS ID, UserID FROM requests_votes + SELECT RequestID AS ID, UserID FROM requests_votes sql_attr_multi = uint Bookmarker from query; \ - SELECT RequestID AS ID, UserID FROM bookmarks_requests + SELECT RequestID AS ID, UserID FROM bookmarks_requests - sql_query_info = SELECT * FROM sphinx_requests WHERE ID = $id + sql_query_post_index = DELETE FROM sphinx_requests_delta WHERE TimeAdded <= \ + (SELECT ID FROM sphinx_index_last_pos WHERE type = 'requests') } -source requests_delta : requests { - sql_query_pre = SET @nothing = 0 - - sql_query = SELECT ID, UserID, TimeAdded, LastVote, CategoryID, Title, \ +source requests_delta : requests_base { + sql_query = SELECT ID, UserID, TimeAdded, LastVote, CategoryID, Title, TagList, \ Year, ArtistList, ReleaseType, RecordLabel, CatalogueNumber, \ BitrateList, FormatList, MediaList, LogCue, FillerID, \ TorrentID, TimeFilled, Visible, Votes, Bounty, \ Year AS YearFullText \ FROM sphinx_requests_delta - sql_query_post_index = SET @nothing = 0 - sql_query_info = SELECT * FROM sphinx_requests_delta WHERE ID = $id sql_query_killlist = SELECT ID FROM sphinx_requests_delta - sql_attr_multi = uint TagID from query; \ - SELECT t.RequestID, t.TagID FROM requests_tags AS t\ - JOIN sphinx_requests_delta AS d ON d.ID = t.RequestID - sql_attr_multi = uint Voter from query; \ - SELECT v.RequestID, v.UserID FROM requests_votes AS v \ - JOIN sphinx_requests_delta AS d ON d.ID = v.RequestID + SELECT v.RequestID, v.UserID FROM requests_votes AS v \ + JOIN sphinx_requests_delta AS d ON d.ID = v.RequestID sql_attr_multi = uint Bookmarker from query; \ - SELECT b.RequestID, b.UserID FROM bookmarks_requests AS b \ - JOIN sphinx_requests_delta AS d ON d.ID = b.RequestID + SELECT b.RequestID, b.UserID FROM bookmarks_requests AS b \ + JOIN sphinx_requests_delta AS d ON d.ID = b.RequestID } index requests : torrents { source = requests path = /var/lib/sphinx/requests + infix_fields = taglist + min_infix_len = 3 + enable_star = 1 } index requests_delta : requests { source = requests_delta @@ -415,7 +414,6 @@ index requests_delta : requests { source log : connect { sql_attr_uint = Time sql_query = SELECT ID, UNIX_TIMESTAMP(Time) AS Time, Message FROM log - sql_query_info = SELECT * FROM log WHERE ID = $id sql_query_post_index = REPLACE INTO sphinx_index_last_pos VALUES ('log', $maxid) } source log_delta : log { @@ -425,8 +423,10 @@ source log_delta : log { } index log : torrents { source = log - min_word_len = 1 path = /var/lib/sphinx/log + min_word_len = 1 + min_infix_len = 0 + infix_fields = } index log_delta : log { source = log_delta @@ -462,6 +462,8 @@ index better_transcode : torrents { source = better_transcode path = /var/lib/sphinx/better_transcode phrase_boundary = + min_infix_len = 0 + infix_fields = } indexer {