# class Chef::Knife::Search

### Public Instance Methods

fuzzify_query() click to toggle source

    # File lib/chef/knife/search.rb, line 146
    def fuzzify_query
      if @query !~ /:/
        @query = "tags:*#{@query}* OR roles:*#{@query}* OR fqdn:*#{@query}* OR addresses:*#{@query}*"
      end
    end

read_cli_args() click to toggle source

    # File lib/chef/knife/search.rb, line 121
    def read_cli_args
      if config[:query]
        if @name_args[1]
          ui.error "please specify query as an argument or an option via -q, not both"
          ui.msg opt_parser
          exit 1
        end
        @type = name_args[0]
        @query = config[:query]
      else
        case name_args.size
        when 0
          ui.error "no query specified"
          ui.msg opt_parser
          exit 1
        when 1
          @type = "node"
          @query = name_args[0]
        when 2
          @type = name_args[0]
          @query = name_args[1]
        end
      end
    end

run() click to toggle source

    # File lib/chef/knife/search.rb, line 74
    def run
      read_cli_args
      fuzzify_query

      if @type == 'node'
        ui.use_presenter Knife::Core::NodePresenter
      end

      q = Chef::Search::Query.new
      escaped_query = URI.escape(@query,
                         Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))

      result_items = []
      result_count = 0

      rows = config[:rows]
      start = config[:start]
      begin
        q.search(@type, escaped_query, config[:sort], start, rows) do |item|
          formatted_item = format_for_display(item)
          # if formatted_item.respond_to?(:has_key?) && !formatted_item.has_key?('id')
          #   formatted_item['id'] = item.has_key?('id') ? item['id'] : item.name
          # end
          result_items << formatted_item
          result_count += 1
        end
      rescue Net::HTTPServerException => e
        msg = Chef::JSONCompat.from_json(e.response.body)["error"].first
        ui.error("knife search failed: #{msg}")
        exit 1
      end

      if ui.interchange?
        output({:results => result_count, :rows => result_items})
      else
        ui.msg "#{result_count} items found"
        ui.msg("\n")
        result_items.each do |item|
          output(item)
          unless config[:id_only]
            ui.msg("\n")
          end
        end
      end
    end