Sha256: 49673988e3bc842ad2b43128de213b07225ee1c34fdea5bab0c3cba219608dc9

Contents?: true

Size: 1.9 KB

Versions: 53

Compression:

Stored size: 1.9 KB

Contents

module ForemanTasks
  class Task
    module Search
      def search_by_generic_resource(key, operator, value)
        key = 'resource_type' if key.blank?
        key_name = connection.quote_column_name(key.sub(/^.*\./, ''))
        value = value.split(',') if operator.index(/IN/i)
        condition = sanitize_sql_for_conditions(["foreman_tasks_links.#{key_name} #{operator} (?)", value])

        { :conditions => condition, :joins => :links }
      end

      def search_by_taxonomy(key, operator, value)
        uniq_suffix = SecureRandom.hex(3)
        resource_type = key == 'location_id' ? 'Location' : 'Organization'

        joins = <<-SQL
        LEFT JOIN foreman_tasks_links AS foreman_tasks_links_taxonomy#{uniq_suffix}
        ON (foreman_tasks_links_taxonomy#{uniq_suffix}.task_id = foreman_tasks_tasks.id AND
            foreman_tasks_links_taxonomy#{uniq_suffix}.resource_type = '#{resource_type}')
        SQL
        # Select only those tasks which either have the correct taxonomy or are not related to any
        sql = "foreman_tasks_links_taxonomy#{uniq_suffix}.resource_id #{operator} (?) OR foreman_tasks_links_taxonomy#{uniq_suffix}.resource_id IS NULL"
        value = value.split(',') if operator.index(/IN/i)
        { :conditions => sanitize_sql_for_conditions([sql, value]), :joins => joins }
      end

      # Expects the time in the format "\d+ (seconds|minutes|hours|days|months|years)"
      SUPPORTED_DURATION_FORMAT = /\A\s*(\d+(\s+\b(seconds?|minutes?|hours?|days?|months?|years?)\b)?)\b\s*\z/i.freeze
      def search_by_duration(_key, operator, value)
        raise "Unsupported duration '#{value}' specified for searching" unless value =~ SUPPORTED_DURATION_FORMAT
        value = value.strip
        { :conditions => "coalesce(ended_at, current_timestamp) - coalesce(coalesce(started_at, ended_at), current_timestamp) #{operator} ?::interval",
          :parameter => [value] }
      end
    end
  end
end

Version data entries

53 entries across 53 versions & 1 rubygems

Version Path
foreman-tasks-10.0.2 app/models/foreman_tasks/task/search.rb
foreman-tasks-10.0.1 app/models/foreman_tasks/task/search.rb
foreman-tasks-10.0.0 app/models/foreman_tasks/task/search.rb
foreman-tasks-9.2.3 app/models/foreman_tasks/task/search.rb
foreman-tasks-9.2.2 app/models/foreman_tasks/task/search.rb
foreman-tasks-9.2.1 app/models/foreman_tasks/task/search.rb
foreman-tasks-9.2.0 app/models/foreman_tasks/task/search.rb
foreman-tasks-9.1.1 app/models/foreman_tasks/task/search.rb
foreman-tasks-9.0.4 app/models/foreman_tasks/task/search.rb
foreman-tasks-9.1.0 app/models/foreman_tasks/task/search.rb
foreman-tasks-9.0.2 app/models/foreman_tasks/task/search.rb
foreman-tasks-9.0.1 app/models/foreman_tasks/task/search.rb
foreman-tasks-8.3.3 app/models/foreman_tasks/task/search.rb
foreman-tasks-9.0.0 app/models/foreman_tasks/task/search.rb
foreman-tasks-8.2.1 app/models/foreman_tasks/task/search.rb
foreman-tasks-8.1.4 app/models/foreman_tasks/task/search.rb
foreman-tasks-8.3.2 app/models/foreman_tasks/task/search.rb
foreman-tasks-8.3.1 app/models/foreman_tasks/task/search.rb
foreman-tasks-8.1.3 app/models/foreman_tasks/task/search.rb
foreman-tasks-8.3.0 app/models/foreman_tasks/task/search.rb