From d82418ed43d61ea73a793f1ea35b0a29f2c342d5 Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 16 Nov 2018 22:39:39 -0600 Subject: [PATCH] Fix #3988: ordpool: fails for large pools. Also fixes ordpool: not returning all posts in the correct order when searching for series pools that contain duplicate posts. --- app/logical/post_query_builder.rb | 4 +++- test/unit/post_test.rb | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index 148da88ff..d748a41e0 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -406,7 +406,9 @@ class PostQueryBuilder if q[:ordpool].present? pool_id = q[:ordpool].to_i - relation = relation.find_ordered(Pool.find(pool_id).post_ids) + + pool_posts = Pool.joins("CROSS JOIN unnest(pools.post_ids) WITH ORDINALITY AS row(post_id, pool_index)").where(id: pool_id).select(:post_id, :pool_index) + relation = relation.joins("JOIN (#{pool_posts.to_sql}) pool_posts ON pool_posts.post_id = posts.id").order("pool_posts.pool_index ASC") end if q[:favgroups_neg].present? diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index 92b99ff00..d17e163c8 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -2014,6 +2014,13 @@ class PostTest < ActiveSupport::TestCase assert_tag_match(posts, "ordpool:test") end + should "return posts for the ordpool: metatag for a series pool containing duplicate posts" do + posts = FactoryBot.create_list(:post, 2) + pool = FactoryBot.create(:pool, name: "test", category: "series", post_ids: [posts[0].id, posts[1].id, posts[1].id]) + + assert_tag_match([posts[0], posts[1], posts[1]], "ordpool:test") + end + should "return posts for the parent: metatag" do parent = FactoryBot.create(:post) child = FactoryBot.create(:post, tag_string: "parent:#{parent.id}")