Sha256: 08351d02df4037119feeb9bdb641cfe8403165b04b24756dfaf062faa2e1e314

Contents?: true

Size: 1.29 KB

Versions: 2

Compression:

Stored size: 1.29 KB

Contents

# frozen_string_literal: true

module Decidim
  module Proposals
    # Class used to retrieve similar proposals.
    class SimilarProposals < Rectify::Query
      include Decidim::TranslationsHelper

      # Syntactic sugar to initialize the class and return the queried objects.
      #
      # features - Decidim::CurrentFeature
      # proposal - Decidim::Proposals::Proposal
      def self.for(features, proposal)
        new(features, proposal).query
      end

      # Initializes the class.
      #
      # features - Decidim::CurrentFeature
      # proposal - Decidim::Proposals::Proposal
      def initialize(features, proposal)
        @features = features
        @proposal = proposal
      end

      # Retrieves similar proposals
      def query
        Decidim::Proposals::Proposal
          .where(feature: @features)
          .published
          .where(
            "GREATEST(#{title_similarity}, #{body_similarity}) >= ?",
            proposal.title,
            proposal.body,
            Decidim::Proposals.similarity_threshold
          )
          .limit(Decidim::Proposals.similarity_limit)
      end

      private

      attr_reader :proposal

      def title_similarity
        "similarity(title, ?)"
      end

      def body_similarity
        "similarity(body, ?)"
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
decidim-proposals-0.10.1 app/queries/decidim/proposals/similar_proposals.rb
decidim-proposals-0.10.0 app/queries/decidim/proposals/similar_proposals.rb