Sha256: 53b93248c3fcb1c1cc24f845c56e28266b25b57e4107ff527831422d1e114c71

Contents?: true

Size: 1.5 KB

Versions: 50

Compression:

Stored size: 1.5 KB

Contents

# frozen_string_literal: true

module Motor
  module ApiQuery
    module Search
      STRING_COLUMN_TYPES = %i[text string citext].freeze
      NUMBER_COLUMN_TYPES = %i[integer float].freeze

      module_function

      def call(rel, keyword)
        return rel if keyword.blank?

        filters = fetch_filters(rel, keyword)

        arel_where = build_arel_or_query(filters)

        rel.where(arel_where)
      end

      def fetch_filters(rel, keyword)
        klass = rel.klass

        selected_columns = find_searchable_columns(klass)

        build_arel_filters(klass, selected_columns, keyword)
      end

      def build_arel_filters(model, column_names, keyword)
        arel_table = model.arel_table

        column_names.map do |name|
          column_type = model.columns_hash[name]&.type

          next unless column_type

          if STRING_COLUMN_TYPES.include?(column_type)
            arel_table[name].matches("%#{keyword}%")
          elsif NUMBER_COLUMN_TYPES.include?(column_type)
            arel_table[name].eq(keyword.to_f) if keyword.match?(/\A\d/)
          else
            arel_table[name].eq(keyword)
          end
        end.compact
      end

      def build_arel_or_query(filter_array)
        filter_array.reduce(nil) do |acc, filter|
          next acc = filter unless acc

          acc.or(filter)
        end
      end

      def find_searchable_columns(model)
        model.try(:motor_searchable_columns) || Motor::BuildSchema::FindSearchableColumns.call(model)
      end
    end
  end
end

Version data entries

50 entries across 50 versions & 6 rubygems

Version Path
motor-admin-0.4.36 lib/motor/api_query/search.rb
motor-admin-0.4.35 lib/motor/api_query/search.rb
motor-admin-0.4.34 lib/motor/api_query/search.rb
motor-admin-0.4.33 lib/motor/api_query/search.rb
motor-admin-0.4.32 lib/motor/api_query/search.rb
motor-admin-0.4.31 lib/motor/api_query/search.rb
motor-admin-0.4.30 lib/motor/api_query/search.rb
motor-admin-0.4.29 lib/motor/api_query/search.rb
motor-admin-0.4.28 lib/motor/api_query/search.rb
motor-admin-cstham8-0.4.35 lib/motor/api_query/search.rb
motor-admin-cstham8-0.4.34 lib/motor/api_query/search.rb
motor-admin-cstham8-0.4.33 lib/motor/api_query/search.rb
motor-admin-cstham8-0.4.32 lib/motor/api_query/search.rb
motor-admin-cstham8-0.4.31 lib/motor/api_query/search.rb
motor-admin-cstham8-0.4.30 lib/motor/api_query/search.rb
motor-admin-cstham8-0.4.29 lib/motor/api_query/search.rb
motor-admin-cstham8-0.4.28 lib/motor/api_query/search.rb
motor-admin-cstham8-0.4.27 lib/motor/api_query/search.rb
motor-admin-0.4.27 lib/motor/api_query/search.rb
motor-admin-unosquare-0.4.28 lib/motor/api_query/search.rb