Awesome Search

  • A helpful library to make searching more organized in the controller and views.

  • Using this library will force you to write a class for each kind of search you want to use.

Usage

See tests.

AwesomeSearch.results_for_type_and_locale(":local :text this is a test", ":upc", ":ebay")

Configuration

These are the settings used by the test suite. Configure separately for each search class you create, or all at once for AwesomeSearch.

AwesomeSearch.configure_search_locales do |config|
  config[:search_locales_to_classes] =
    { ":local" =>   "SearchLocal",
      ":amazon" =>  "SearchAmazon",
      ":google" =>  "SearchGoogle",
      ":ebay" =>    "SearchEbay" },
  config[:search_locales_to_locale_modifiers] =
    {
      ":local" =>
        [ ":local" ],
      ":amazon" =>
        [ ":amazon",
          ":amzn",
          ":amz",
          ":am"],
      ":google" =>
        [ ":google",
          ":goog",
          ":goo",
          ":go"],
      ":ebay" =>
        [ ":ebay",
          ":eby",
          ":eb"]
    },
  config[:locale_modifiers_to_search_locales] =
    {
      ":local"  => ":local",
      ":amazon" => ":amazon",
      ":amz"    => ":amazon",
      ":amzn"   => ":amazon",
      ":am"     => ":amazon",
      ":google" => ":google",
      ":goog"   => ":google",
      ":goo"    => ":google",
      ":go"     => ":google",
      ":ebay"   => ":ebay",
      ":eby"    => ":ebay",
      ":eb"     => ":ebay"
    }
end

AwesomeSearch.configure_search_types do |config|
  config[:search_types_to_type_modifiers] =
    {
      ":isbn" => ":isbn",
      ":sku" => ":sku",
      ":upc" => ":upc",
      ":asin" => ":asin",
      ":id" => ":dbid",
      ":text" => ":text"
    },
    # When using observer, how long should we wait before sending out search queries?
  config[:search_type_inceptions] =
    {
      ":isbn" => 10,
      ":sku" => 8,
      ":upc" => 10,
      ":asin" => 10,
      ":id" => 1,
      ":text" => 4
    },
  config[:search_type_regexes] =
    {
      ":isbn" => /\d{10}$|^\d{13}/,            #match 10 or 13 digits for isbn
      ":sku" => /[0-9a-zA-Z\-]+/,              #match any alphanumeric
      ":upc" => /\d{10}$|^\d{12}/,
      ":asin" => /\w{10}/,
      ":id" => /\d+/,
      ":text" => /\w{4}/
    }
end

Create subclasses like this:

#1. inherit from SuperSearch (which inherits from AwesomeSearch)
  class SearchAmazon < SuperSearch
#2. Define a method called get_results
  def get_results
#3. Always return nil unless super, as super's get_results will ensure the search is valid
    return nil unless super
#4. Here is where you would do actual searching.  Write other methods and call them if need be or call methods in other classes, etc.
    # You need to set the attribute 'found' to contain the search result(s).
    # found is set to [] in the super, so you can iterate and do << with it,
    # or set it to whatever you need it to be
    self.found = Model.find(stuff) if stuff
    nil
  end
end

Note on Patches/Pull Requests

  • Fork the project.

  • Make your feature addition or bug fix.

  • Add tests for it. This is important so I don’t break it in a future version unintentionally.

  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)

  • Send me a pull request. Bonus points for topic branches.

Copyright (c) 2008-10 Peter H. Boling, released under the MIT license. See LICENSE for details.