From 0b63dd32d1747fcbfce3f54eb4ead45269f37e24 Mon Sep 17 00:00:00 2001 From: evazion Date: Tue, 28 Mar 2017 20:44:09 -0500 Subject: [PATCH 1/2] saved searches: don't change tag ordering within queries. Normalize queries aside from the tag ordering when they're saved. Normalize queries including ordering when they're sent to listbooru. This way tag ordering within searches is kept in the /saved_searches listing. --- app/models/saved_search.rb | 14 +++++++------- app/models/tag.rb | 9 +++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/models/saved_search.rb b/app/models/saved_search.rb index 2360caae8..a8d83d7e4 100644 --- a/app/models/saved_search.rb +++ b/app/models/saved_search.rb @@ -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 diff --git a/app/models/tag.rb b/app/models/tag.rb index 303ad692b..3f1d9448d 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -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:".*?"/) || [] From 8e5491a5367efa7f380e5381e0aa9ac3616d6ffa Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 28 Apr 2017 16:22:37 -0500 Subject: [PATCH 2/2] saved searches: add query normalization tests. --- app/models/tag_alias.rb | 4 ++-- test/factories/tag_alias.rb | 1 + test/unit/saved_search_test.rb | 16 +++++++++++----- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/models/tag_alias.rb b/app/models/tag_alias.rb index 53d915173..37c58b5c0 100644 --- a/app/models/tag_alias.rb +++ b/app/models/tag_alias.rb @@ -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 diff --git a/test/factories/tag_alias.rb b/test/factories/tag_alias.rb index 89f1ada42..4033c01dd 100644 --- a/test/factories/tag_alias.rb +++ b/test/factories/tag_alias.rb @@ -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" diff --git a/test/unit/saved_search_test.rb b/test/unit/saved_search_test.rb index 604126199..c8040c19d 100644 --- a/test/unit/saved_search_test.rb +++ b/test/unit/saved_search_test.rb @@ -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