Merge pull request #3005 from evazion/fix-ss-query-normalization

Fix #2995: Saved searches’ tags are getting reordered
This commit is contained in:
Albert Yi
2017-05-01 14:51:01 -07:00
committed by GitHub
5 changed files with 30 additions and 14 deletions

View File

@@ -74,14 +74,18 @@ class SavedSearch < ActiveRecord::Base
def self.queries_for(user_id, label = nil, options = {})
if label
SavedSearch.where(user_id: user_id).labeled(label).pluck("distinct query")
SavedSearch.where(user_id: user_id).labeled(label).map(&:normalized_query).sort.uniq
else
SavedSearch.where(user_id: user_id).pluck("distinct query")
SavedSearch.where(user_id: user_id).map(&:normalized_query).sort.uniq
end
end
def normalized_query
Tag.normalize_query(query, sort: true)
end
def normalize
self.query = query_array.sort.join(" ")
self.query = Tag.normalize_query(query, sort: false)
self.labels = labels.map {|x| SavedSearch.normalize_label(x)}.reject {|x| x.blank?}
end
@@ -103,10 +107,6 @@ class SavedSearch < ActiveRecord::Base
end
end
def query_array
Tag.scan_tags(query)
end
def label_string
labels.join(" ")
end

View File

@@ -236,6 +236,15 @@ class Tag < ActiveRecord::Base
query.to_s.gsub(/\u3000/, " ").strip
end
def normalize_query(query, sort: true)
tags = Tag.scan_query(query.to_s)
tags = tags.map { |t| Tag.normalize_name(t) }
tags = TagAlias.to_aliased(tags)
tags = tags.sort if sort
tags = tags.uniq
tags.join(" ")
end
def scan_query(query)
tagstr = normalize(query)
list = tagstr.scan(/-?source:".*?"/) || []

View File

@@ -186,8 +186,8 @@ class TagAlias < ActiveRecord::Base
end
def initialize_creator
self.creator_id = CurrentUser.user.id
self.creator_ip_addr = CurrentUser.ip_addr
self.creator_id ||= CurrentUser.user.id
self.creator_ip_addr ||= CurrentUser.ip_addr
end
def antecedent_tag

View File

@@ -4,6 +4,7 @@ FactoryGirl.define do
consequent_name "bbb"
status "active"
skip_secondary_validations true
creator_ip_addr { FFaker::Internet.ip_v4_address }
after(:create) do |tag_alias|
unless tag_alias.status == "pending"

View File

@@ -30,13 +30,18 @@ class SavedSearchTest < ActiveSupport::TestCase
context ".queries_for" do
setup do
@user = FactoryGirl.create(:user)
FactoryGirl.create(:tag_alias, antecedent_name: "bbb", consequent_name: "ccc", creator: @user)
FactoryGirl.create(:saved_search, user: @user, label_string: "blah", query: "aaa")
FactoryGirl.create(:saved_search, user: @user, label_string: "zah", query: "bbb")
FactoryGirl.create(:saved_search, user: @user, label_string: "zah", query: "CCC BBB AAA")
FactoryGirl.create(:saved_search, user: @user, label_string: "qux", query: " aaa bbb ccc ")
end
should "fetch the queries used by a user for a label" do
assert_equal(%w(aaa), SavedSearch.queries_for(@user.id, "blah"))
assert_equal(%w(aaa bbb), SavedSearch.queries_for(@user.id))
end
should "return fully normalized queries" do
assert_equal(["aaa", "aaa ccc"], SavedSearch.queries_for(@user.id))
end
end
@@ -84,7 +89,8 @@ class SavedSearchTest < ActiveSupport::TestCase
context "Creating a saved search" do
setup do
@user = FactoryGirl.create(:gold_user)
@saved_search = @user.saved_searches.create(:query => " xxx ")
FactoryGirl.create(:tag_alias, antecedent_name: "zzz", consequent_name: "yyy", creator: @user)
@saved_search = @user.saved_searches.create(:query => " ZZZ xxx ")
end
should "update the bitpref on the user" do
@@ -92,8 +98,8 @@ class SavedSearchTest < ActiveSupport::TestCase
assert(@user.has_saved_searches?, "should have saved_searches bitpref set")
end
should "normalize whitespace" do
assert_equal("xxx", @saved_search.query)
should "normalize the query aside from the order" do
assert_equal("yyy xxx", @saved_search.query)
end
should "normalize the label string" do