diff --git a/app/controllers/searches_controller.rb b/app/controllers/searches_controller.rb index e30de426c..a9724b489 100644 --- a/app/controllers/searches_controller.rb +++ b/app/controllers/searches_controller.rb @@ -6,7 +6,7 @@ def show if params[:query].blank? redirect_to controller: 'home', action: 'index' else - @srpms = Srpm.query(params[:query]).by_branch_name(params[:branch]).page(params[:page]).includes(:branch) + @srpms = Srpm.includes(:branch).b(params[:branch]).q(params[:query]).page(params[:page]).reorder("srpms.name").distinct # @srpms = Srpm.none # @srpms = Srpm.search( diff --git a/app/models/package.rb b/app/models/package.rb index 27d057f31..10494be75 100644 --- a/app/models/package.rb +++ b/app/models/package.rb @@ -25,6 +25,10 @@ class Package < ApplicationRecord after_destroy :remove_filename_from_cache + pg_search_scope :query, + against: %i[name summary description filename sourcepackage], + using: { tsearch: { prefix: true } } + multisearchable against: [:name, :summary, :description, :filename, :sourcepackage] diff --git a/app/models/srpm.rb b/app/models/srpm.rb index f9b21b02c..19a86f5e5 100644 --- a/app/models/srpm.rb +++ b/app/models/srpm.rb @@ -41,6 +41,10 @@ class Srpm < ApplicationRecord scope :by_branch_name, ->(name) { joins(:branch).where(branches: { name: name }) } + scope :q, ->(text) { joins(:packages).merge(Package.query(text)).or(self.query(text)) } + + singleton_class.send(:alias_method, :b, :by_branch_name) + validates :groupname, presence: true validates :md5, presence: true diff --git a/config/initializers/require.rb b/config/initializers/require.rb new file mode 100644 index 000000000..93c8a527b --- /dev/null +++ b/config/initializers/require.rb @@ -0,0 +1 @@ +require "#{Rails.root}/lib/extensions" diff --git a/lib/extensions.rb b/lib/extensions.rb new file mode 100644 index 000000000..e7a08e8ed --- /dev/null +++ b/lib/extensions.rb @@ -0,0 +1,11 @@ +require "active_record" +require "active_record/relation" +require "active_record/relation/query_methods.rb" + +module ActiveRecord::QueryMethods + def structurally_incompatible_values_for_or(other) + (ActiveRecord::Relation::SINGLE_VALUE_METHODS - [:distinct]).reject { |m| send("#{m}_value") == other.send("#{m}_value") } + + (ActiveRecord::Relation::MULTI_VALUE_METHODS - [:eager_load, :left_outer_joins, :joins, :references, :order, :extending]).reject { |m| send("#{m}_values") == other.send("#{m}_values") } + + (ActiveRecord::Relation::CLAUSE_METHODS - [:having, :where]).reject { |m| send("#{m}_clause") == other.send("#{m}_clause") } + end +end