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"
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[:mpixels], "p.width*p.height/1000000.0", 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"
when "portrait"
sql << " ORDER BY 1.0*width/GREATEST(1, height)"
sql << " ORDER BY ratio"
when "landscape"
sql << " ORDER BY 1.0*width/GREATEST(1, height) DESC"
sql << " ORDER BY ratio DESC"
when "portrait_pool"
# We can only do this if we're searching for a 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
when "change", "change_asc"

View File

@ -9,16 +9,19 @@ module Tag::ParseMethods
end
def parse_cast(x, type)
if type == :integer
case type
when :integer
x.to_i
elsif type == :float
when :float
x.to_f
elsif type == :date
when :date
begin
x.to_date
rescue
nil
end
when :rational
Rational(x.tr(":", "/")).to_f.round(3) rescue 0
end
end
@ -68,9 +71,11 @@ module Tag::ParseMethods
next
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"
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"
vote, user = Regexp.last_match[2].split(":", 2)
user_id = User.find_by_name(user).id rescue nil

View File

@ -70,6 +70,9 @@
<dt>mpixels:2.5..</dt>
<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>
<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_warehoused boolean DEFAULT false NOT NULL,
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;
INSERT INTO "schema_migrations" (version) VALUES
('1'),
('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'),
('96'),
('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');