From 25159bb21ca05c5f31420b18e9c5d480abbbabfa Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 20 Apr 2020 02:05:10 -0500 Subject: [PATCH] search: support backwards ranges. Fix things like age:1y..2y or score:5..0 returning no results. --- app/logical/post_query_builder.rb | 5 ++--- test/unit/post_query_builder_test.rb | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index c93d3c9a5..5578da617 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -1146,7 +1146,8 @@ class PostQueryBuilder def parse_range(string, type = :integer) range = case string when /\A(.+?)\.\.(.+)/ - [:between, (parse_cast($1, type)..parse_cast($2, type))] + lo, hi = [parse_cast($1, type), parse_cast($2, type)].sort + [:between, (lo..hi)] when /\A<=(.+)/, /\A\.\.(.+)/ [:lteq, parse_cast($1, type)] when /\A<(.+)/ @@ -1180,8 +1181,6 @@ class PostQueryBuilder def reverse_range(range) case range - in [:between, range] - [:between, (range.end..range.begin)] in [:lteq, value] [:gteq, value] in [:lt, value] diff --git a/test/unit/post_query_builder_test.rb b/test/unit/post_query_builder_test.rb index 60c6249b5..ba02fc97e 100644 --- a/test/unit/post_query_builder_test.rb +++ b/test/unit/post_query_builder_test.rb @@ -142,6 +142,7 @@ class PostQueryBuilderTest < ActiveSupport::TestCase assert_tag_match([posts[1], posts[0]], "id:<=#{posts[1].id}") assert_tag_match([posts[2], posts[0]], "id:#{posts[0].id},#{posts[2].id}") assert_tag_match(posts.reverse, "id:#{posts[0].id}..#{posts[2].id}") + assert_tag_match(posts.reverse, "id:#{posts[2].id}..#{posts[0].id}") assert_tag_match([], "id:#{posts[0].id} id:#{posts[2].id}") assert_tag_match([posts[1]], "id:>#{posts[0].id} id:<#{posts[2].id}") @@ -420,6 +421,7 @@ class PostQueryBuilderTest < ActiveSupport::TestCase assert_tag_match([post], "age:>0s") assert_tag_match([post], "age:>=0s") assert_tag_match([post], "age:0s..1m") + assert_tag_match([post], "age:1m..0s") assert_tag_match([], "age:>1y") assert_tag_match([], "age:>=1y")