From c452aa6c784820ba40c05a31848ef6eb375733cc Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 20 Apr 2020 02:31:36 -0500 Subject: [PATCH] search: add exclusive range syntax (id:5...10). Support exclusive ranges for numeric metatags. For example, `id:5...10` is equivalent to `id:>=5 id:<10`. Useful for splitting searches into id ranges without the endpoints overlapping: id:100...200, id:200...300, id:300...400. --- app/logical/post_query_builder.rb | 3 +++ test/unit/post_query_builder_test.rb | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index 5578da617..296933682 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -1145,6 +1145,9 @@ class PostQueryBuilder def parse_range(string, type = :integer) range = case string + when /\A(.+?)\.\.\.(.+)/ # A...B + lo, hi = [parse_cast($1, type), parse_cast($2, type)].sort + [:between, (lo...hi)] when /\A(.+?)\.\.(.+)/ lo, hi = [parse_cast($1, type), parse_cast($2, type)].sort [:between, (lo..hi)] diff --git a/test/unit/post_query_builder_test.rb b/test/unit/post_query_builder_test.rb index ba02fc97e..6ccaac141 100644 --- a/test/unit/post_query_builder_test.rb +++ b/test/unit/post_query_builder_test.rb @@ -141,8 +141,12 @@ class PostQueryBuilderTest < ActiveSupport::TestCase assert_tag_match([posts[2], posts[1]], "id:>=#{posts[1].id}") 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([posts[2], posts[1]], "id:#{posts[1].id}..") + assert_tag_match([posts[1], posts[0]], "id:..#{posts[1].id}") + assert_tag_match([posts[1], posts[0]], "id:#{posts[0].id}..#{posts[1].id}") + assert_tag_match([posts[1], posts[0]], "id:#{posts[1].id}..#{posts[0].id}") + assert_tag_match([posts[1], posts[0]], "id:#{posts[0].id}...#{posts[2].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}")