tags_finder.rb 859 Bytes
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
# frozen_string_literal: true

module Autocomplete
  module ActsAsTaggableOn
    class TagsFinder
      LIMIT = 20

      def initialize(taggable_type:, params:)
        @taggable_type = taggable_type
        @params = params
      end

      def execute
        @tags = @taggable_type.all_tags

        search!
        limit!

        @tags
      end

      def search!
        search = @params[:search]

        return unless search

        if search.empty?
          @tags = @taggable_type.none
          return
        end

        @tags =
          if search.length >= Gitlab::SQL::Pattern::MIN_CHARS_FOR_PARTIAL_MATCHING
            @tags.named_like(search)
          else
            @tags.named(search)
          end
      end

      def limit!
        @tags = @tags.limit(LIMIT) # rubocop: disable CodeReuse/ActiveRecord
      end
    end
  end
end