search: clean up mpixels:, filesize: tolerance handling.

Fold parse_helper_fudged into parse_helper. This is used to make
mpixels:N and filesize:N do an inexact match with a 5% error tolerance.
For example, filesize:1mb is really equivalent to filesize:0.95mb..1.05mb
because an exact filesize:1mb search is unlikely to match anything.
This commit is contained in:
evazion
2020-04-18 15:56:17 -05:00
parent fdaaf6e371
commit 824d0d8edb

View File

@@ -936,7 +936,7 @@ class PostQueryBuilder
q[:height] = parse_helper(g2)
when "mpixels"
q[:mpixels] = parse_helper_fudged(g2, :float)
q[:mpixels] = parse_helper(g2, :float)
when "ratio"
q[:ratio] = parse_helper(g2, :ratio)
@@ -948,7 +948,7 @@ class PostQueryBuilder
q[:fav_count] = parse_helper(g2)
when "filesize"
q[:filesize] = parse_helper_fudged(g2, :filesize)
q[:filesize] = parse_helper(g2, :filesize)
when "source"
q[:source] = g2.gsub(/\A"(.*)"\Z/, '\1')
@@ -1156,22 +1156,13 @@ class PostQueryBuilder
return [:in, range.split(/[, ]+/).map {|x| parse_cast(x, type)}]
else
return [:eq, parse_cast(range, type)]
end
end
def parse_helper_fudged(range, type)
result = parse_helper(range, type)
# Don't fudge the filesize when searching filesize:123b or filesize:123.
if result[0] == :eq && type == :filesize && range !~ /[km]b?\Z/i
result
elsif result[0] == :eq
new_min = (result[1] * 0.95).to_i
new_max = (result[1] * 1.05).to_i
[:between, new_min, new_max]
else
result
# add a 5% tolerance for float and filesize values
if type == :float || (type == :filesize && range =~ /[km]b?\z/i)
value = parse_cast(range, type)
[:between, value * 0.95, value * 1.05]
else
[:eq, parse_cast(range, type)]
end
end
end