summaryrefslogtreecommitdiff
path: root/app/finders/autocomplete/acts_as_taggable_on/tags_finder.rb
blob: f38c187799c60d6b77f90e16c85bcc2731a11b67 (plain)
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
# frozen_string_literal: true

module Autocomplete
  module ActsAsTaggableOn
    class TagsFinder
      LIMIT = 20

      def initialize(params:)
        @params = params
      end

      def execute
        tags = all_tags
        tags = filter_by_name(tags)
        limit(tags)
      end

      private

      def all_tags
        ::ActsAsTaggableOn::Tag.all
      end

      def filter_by_name(tags)
        return tags unless search
        return tags.none if search.empty?

        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

      def search
        @params[:search]
      end
    end
  end
end