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}")