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.