2
0
mirror of https://github.com/moebooru/moebooru synced 2025-08-22 01:47:48 +00:00

Support searching by aspect ratio

This commit is contained in:
nanaya 2025-03-30 01:04:00 +09:00
parent 3ca567512a
commit 5593a81f1b
5 changed files with 204 additions and 189 deletions

View File

@ -66,6 +66,7 @@ module Post::SqlMethods
conds << "FALSE" conds << "FALSE"
end end
generate_sql_range_helper(q[:ratio], "ratio", conds, cond_params)
generate_sql_range_helper(q[:post_id], "p.id", conds, cond_params) generate_sql_range_helper(q[:post_id], "p.id", conds, cond_params)
generate_sql_range_helper(q[:mpixels], "p.width*p.height/1000000.0", conds, cond_params) generate_sql_range_helper(q[:mpixels], "p.width*p.height/1000000.0", conds, cond_params)
generate_sql_range_helper(q[:width], "p.width", conds, cond_params) generate_sql_range_helper(q[:width], "p.width", conds, cond_params)
@ -314,15 +315,15 @@ module Post::SqlMethods
sql << " ORDER BY width*height/1000000.0" sql << " ORDER BY width*height/1000000.0"
when "portrait" when "portrait"
sql << " ORDER BY 1.0*width/GREATEST(1, height)" sql << " ORDER BY ratio"
when "landscape" when "landscape"
sql << " ORDER BY 1.0*width/GREATEST(1, height) DESC" sql << " ORDER BY ratio DESC"
when "portrait_pool" when "portrait_pool"
# We can only do this if we're searching for a pool. # We can only do this if we're searching for a pool.
if q.key?(:pool) if q.key?(:pool)
sql << " ORDER BY 1.0*width / GREATEST(1, height), nat_sort(pools_posts.sequence), pools_posts.post_id" sql << " ORDER BY ratio, nat_sort(pools_posts.sequence), pools_posts.post_id"
end end
when "change", "change_asc" when "change", "change_asc"

View File

@ -9,16 +9,19 @@ module Tag::ParseMethods
end end
def parse_cast(x, type) def parse_cast(x, type)
if type == :integer case type
when :integer
x.to_i x.to_i
elsif type == :float when :float
x.to_f x.to_f
elsif type == :date when :date
begin begin
x.to_date x.to_date
rescue rescue
nil nil
end end
when :rational
Rational(x.tr(":", "/")).to_f.round(3) rescue 0
end end
end end
@ -68,9 +71,11 @@ module Tag::ParseMethods
next next
end end
if token =~ /^(unlocked|deleted|ext|user|sub|vote|-vote|fav|md5|-rating|rating|width|height|mpixels|score|source|id|date|pool|-pool|parent|order|change|holds|pending|shown|limit):(.+)$/ if token =~ /^(ratio|unlocked|deleted|ext|user|sub|vote|-vote|fav|md5|-rating|rating|width|height|mpixels|score|source|id|date|pool|-pool|parent|order|change|holds|pending|shown|limit):(.+)$/
if Regexp.last_match[1] == "user" if Regexp.last_match[1] == "user"
q[:user] = Regexp.last_match[2] q[:user] = Regexp.last_match[2]
elsif Regexp.last_match[1] == "ratio"
q[:ratio] = parse_helper(Regexp.last_match[2], :rational)
elsif Regexp.last_match[1] == "vote" elsif Regexp.last_match[1] == "vote"
vote, user = Regexp.last_match[2].split(":", 2) vote, user = Regexp.last_match[2].split(":", 2)
user_id = User.find_by_name(user).id rescue nil user_id = User.find_by_name(user).id rescue nil

View File

@ -70,6 +70,9 @@
<dt>mpixels:2.5..</dt> <dt>mpixels:2.5..</dt>
<dd>Search for posts with 2.5 million pixels or greater (uses same syntax as id search).</dd> <dd>Search for posts with 2.5 million pixels or greater (uses same syntax as id search).</dd>
<dt>ratio:16:9</dt>
<dd>Search for posts with aspect ratio of approximately 16:9 (uses same syntax as id search).</dd>
<dt>date:2007-01-01</dt> <dt>date:2007-01-01</dt>
<dd>Search for posts uploaded on a certain date (uses same syntax as id search).</dd> <dd>Search for posts uploaded on a certain date (uses same syntax as id search).</dd>

View File

@ -0,0 +1,5 @@
class AddRatioToPosts < ActiveRecord::Migration[7.2]
def change
add_column :posts, :ratio, 'numeric GENERATED ALWAYS AS (ROUND(width::numeric / GREATEST(1, height), 3)) STORED'
end
end

View File

@ -1105,7 +1105,8 @@ CREATE TABLE public.posts (
frames_pending text DEFAULT ''::text NOT NULL, frames_pending text DEFAULT ''::text NOT NULL,
frames_warehoused boolean DEFAULT false NOT NULL, frames_warehoused boolean DEFAULT false NOT NULL,
updated_at timestamp with time zone, updated_at timestamp with time zone,
tags_array character varying[] tags_array character varying[],
ratio numeric GENERATED ALWAYS AS (round(((width)::numeric / (GREATEST(1, height))::numeric), 3)) STORED
); );
@ -3302,186 +3303,186 @@ ALTER TABLE ONLY public.users
SET search_path TO "$user", public; SET search_path TO "$user", public;
INSERT INTO "schema_migrations" (version) VALUES INSERT INTO "schema_migrations" (version) VALUES
('1'), ('96'),
('10'),
('11'),
('12'),
('13'),
('14'),
('15'),
('16'),
('17'),
('18'),
('19'),
('2'),
('20'),
('20080901000000'),
('20080927145957'),
('20081015004825'),
('20081015004855'),
('20081015004938'),
('20081015005018'),
('20081015005051'),
('20081015005124'),
('20081015005201'),
('20081015005919'),
('20081015010657'),
('20081016002814'),
('20081018175545'),
('20081023224739'),
('20081024083115'),
('20081024223856'),
('20081025222424'),
('20081105030832'),
('20081122055610'),
('20081130190723'),
('20081130191226'),
('20081203035506'),
('20081204062728'),
('20081205061033'),
('20081205072029'),
('20081208220020'),
('20081209221550'),
('20081210193125'),
('20090115234541'),
('20090123212834'),
('20090208201752'),
('20090215000207'),
('20090903232732'),
('20091228170149'),
('20100101225942'),
('20100827031936'),
('20100831065951'),
('20100903220234'),
('20100906054326'),
('20100907042612'),
('20100907210915'),
('20100907215811'),
('20101011000658'),
('20101027013550'),
('20101116221443'),
('20101212021821'),
('20101218070942'),
('20110116202516'),
('20110228010717'),
('20120331040429'),
('20120505130017'),
('20120624121058'),
('20120723155345'),
('20120723161914'),
('20120804130515'),
('20120813155642'),
('20120830051636'),
('20120920171733'),
('20120920172947'),
('20120920173324'),
('20120920173803'),
('20120920174218'),
('20120921040720'),
('20130326154700'),
('20130326161630'),
('20140309152432'),
('20140427041839'),
('20140429125422'),
('20140905023318'),
('20151207113346'),
('20160113112901'),
('20160329065325'),
('20160329065802'),
('20160329154133'),
('20160329160235'),
('20160329161636'),
('20160330063707'),
('20180624074601'),
('20190518111956'),
('20190817070727'),
('20191110172526'),
('20200908180652'),
('20201103140508'),
('20210211213304'),
('21'),
('22'),
('23'),
('24'),
('25'),
('26'),
('27'),
('28'),
('29'),
('3'),
('30'),
('31'),
('32'),
('33'),
('34'),
('35'),
('36'),
('37'),
('38'),
('39'),
('4'),
('40'),
('41'),
('42'),
('43'),
('44'),
('45'),
('46'),
('47'),
('48'),
('49'),
('5'),
('50'),
('51'),
('52'),
('53'),
('54'),
('55'),
('56'),
('57'),
('58'),
('59'),
('6'),
('60'),
('61'),
('62'),
('63'),
('64'),
('65'),
('66'),
('67'),
('68'),
('69'),
('7'),
('70'),
('71'),
('72'),
('73'),
('74'),
('75'),
('76'),
('77'),
('78'),
('79'),
('8'),
('80'),
('81'),
('82'),
('83'),
('84'),
('85'),
('86'),
('87'),
('88'),
('89'),
('9'),
('90'),
('91'),
('9142010220946'),
('92'),
('93'),
('94'),
('95'), ('95'),
('96'); ('94'),
('93'),
('92'),
('9142010220946'),
('91'),
('90'),
('9'),
('89'),
('88'),
('87'),
('86'),
('85'),
('84'),
('83'),
('82'),
('81'),
('80'),
('8'),
('79'),
('78'),
('77'),
('76'),
('75'),
('74'),
('73'),
('72'),
('71'),
('70'),
('7'),
('69'),
('68'),
('67'),
('66'),
('65'),
('64'),
('63'),
('62'),
('61'),
('60'),
('6'),
('59'),
('58'),
('57'),
('56'),
('55'),
('54'),
('53'),
('52'),
('51'),
('50'),
('5'),
('49'),
('48'),
('47'),
('46'),
('45'),
('44'),
('43'),
('42'),
('41'),
('40'),
('4'),
('39'),
('38'),
('37'),
('36'),
('35'),
('34'),
('33'),
('32'),
('31'),
('30'),
('3'),
('29'),
('28'),
('27'),
('26'),
('25'),
('24'),
('23'),
('22'),
('21'),
('20250329151230'),
('20210211213304'),
('20201103140508'),
('20200908180652'),
('20191110172526'),
('20190817070727'),
('20190518111956'),
('20180624074601'),
('20160330063707'),
('20160329161636'),
('20160329160235'),
('20160329154133'),
('20160329065802'),
('20160329065325'),
('20160113112901'),
('20151207113346'),
('20140905023318'),
('20140429125422'),
('20140427041839'),
('20140309152432'),
('20130326161630'),
('20130326154700'),
('20120921040720'),
('20120920174218'),
('20120920173803'),
('20120920173324'),
('20120920172947'),
('20120920171733'),
('20120830051636'),
('20120813155642'),
('20120804130515'),
('20120723161914'),
('20120723155345'),
('20120624121058'),
('20120505130017'),
('20120331040429'),
('20110228010717'),
('20110116202516'),
('20101218070942'),
('20101212021821'),
('20101116221443'),
('20101027013550'),
('20101011000658'),
('20100907215811'),
('20100907210915'),
('20100907042612'),
('20100906054326'),
('20100903220234'),
('20100831065951'),
('20100827031936'),
('20100101225942'),
('20091228170149'),
('20090903232732'),
('20090215000207'),
('20090208201752'),
('20090123212834'),
('20090115234541'),
('20081210193125'),
('20081209221550'),
('20081208220020'),
('20081205072029'),
('20081205061033'),
('20081204062728'),
('20081203035506'),
('20081130191226'),
('20081130190723'),
('20081122055610'),
('20081105030832'),
('20081025222424'),
('20081024223856'),
('20081024083115'),
('20081023224739'),
('20081018175545'),
('20081016002814'),
('20081015010657'),
('20081015005919'),
('20081015005201'),
('20081015005124'),
('20081015005051'),
('20081015005018'),
('20081015004938'),
('20081015004855'),
('20081015004825'),
('20080927145957'),
('20080901000000'),
('20'),
('2'),
('19'),
('18'),
('17'),
('16'),
('15'),
('14'),
('13'),
('12'),
('11'),
('10'),
('1');