spree_solr_search 0.40.3 → 1.0.0.rc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +8 -3
- data/Rakefile +2 -3
- data/VERSION +1 -1
- data/Versionfile +4 -0
- data/app/assets/javascripts/store/solr_sort_by.js.coffee +3 -0
- data/app/helpers/spree/base_helper_decorator.rb +7 -0
- data/app/models/spree/product_decorator.rb +80 -0
- data/app/models/spree/solr_search_configuration.rb +3 -0
- data/app/overrides/show_search_partials.rb +11 -0
- data/app/views/{products → spree/products}/_facets.html.erb +2 -2
- data/app/views/spree/products/_sort_bar.html.erb +1 -0
- data/app/views/{products → spree/products}/_suggestion.html.erb +1 -1
- data/config/initializers/solr_config.rb +11 -0
- data/lib/solr_manager.rb +17 -0
- data/lib/spree/search/solr.rb +36 -16
- data/lib/spree_solr_search.rb +16 -6
- data/lib/tasks/acts_as_solr.rake +15 -1
- data/spree_solr_search.gemspec +38 -36
- metadata +35 -21
- data/.gitignore +0 -3
- data/app/models/product_decorator.rb +0 -63
- data/lib/spree_solr_search_hooks.rb +0 -6
    
        data/README.md
    CHANGED
    
    | @@ -3,12 +3,13 @@ Solr Search | |
| 3 3 |  | 
| 4 4 | 
             
            ### Installation
         | 
| 5 5 |  | 
| 6 | 
            +
            1. add `gem 'acts_as_solr_reloaded', :git => 'git://github.com/evrone/acts_as_solr_reloaded.git', :branch => "ar_namespace_support"` to your Gemfile
         | 
| 6 7 | 
             
            1. Add `gem "spree_solr_search"` to your Gemfile
         | 
| 7 8 | 
             
            1. Run `bundle install`
         | 
| 8 9 | 
             
            1. Run `rails g spree_solr_search:install`
         | 
| 9 10 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
            If you want use this extension with Spree 0.10.x or 0.11.x, then you should use spree-0-11-stable branch
         | 
| 11 | 
            +
            Master branch 1.0.x compatible.  
         | 
| 12 | 
            +
            If you want use this extension with Spree 0.10.x or 0.11.x, then you should use spree-0-11-stable branch.
         | 
| 12 13 |  | 
| 13 14 | 
             
            ### Usage
         | 
| 14 15 |  | 
| @@ -16,7 +17,6 @@ To perform the indexing: | |
| 16 17 |  | 
| 17 18 | 
             
                rake solr:reindex BATCH=500
         | 
| 18 19 |  | 
| 19 | 
            -
             | 
| 20 20 | 
             
            To start Solr demo-server:
         | 
| 21 21 |  | 
| 22 22 | 
             
                rake solr:start SOLR_PATH="/home/roman/www/jetty-solr"
         | 
| @@ -29,6 +29,11 @@ To configure production Solr server: | |
| 29 29 |  | 
| 30 30 | 
             
                edit RAILS_ROOT/config/solr.yml
         | 
| 31 31 |  | 
| 32 | 
            +
             | 
| 33 | 
            +
            ### Running rake tasks in background
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            Read [instructions](https://gist.github.com/890215) how to run rake tasks in background.
         | 
| 36 | 
            +
             | 
| 32 37 | 
             
            P.S. For development recommended use [jetty-solr](http://github.com/dcrec1/jetty-solr) server.
         | 
| 33 38 |  | 
| 34 39 |  | 
    
        data/Rakefile
    CHANGED
    
    | @@ -11,8 +11,7 @@ end | |
| 11 11 | 
             
            require 'rake'
         | 
| 12 12 | 
             
            require 'rake/testtask'
         | 
| 13 13 | 
             
            #require 'rake/rdoctask'
         | 
| 14 | 
            -
            require ' | 
| 15 | 
            -
            require 'rake/gempackagetask'
         | 
| 14 | 
            +
            require 'rubygems/package_task'
         | 
| 16 15 |  | 
| 17 16 | 
             
            Jeweler::Tasks.new do |s|
         | 
| 18 17 | 
             
              s.name = "spree_solr_search"
         | 
| @@ -21,7 +20,7 @@ Jeweler::Tasks.new do |s| | |
| 21 20 | 
             
              s.email = "roman@railsdog.com"
         | 
| 22 21 | 
             
              s.homepage = "http://github.com/romul/spree-solr-search"
         | 
| 23 22 | 
             
              s.authors = ["Roman Smirnov"]
         | 
| 24 | 
            -
              s.add_dependency 'spree_core', ['>= 0. | 
| 23 | 
            +
              s.add_dependency 'spree_core', ['>= 1.0.0']
         | 
| 25 24 | 
             
              s.add_dependency 'acts_as_solr_reloaded', ['>= 1.6.0']
         | 
| 26 25 | 
             
              s.has_rdoc = false
         | 
| 27 26 | 
             
              #s.extra_rdoc_files = [ "README.rdoc"]
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0. | 
| 1 | 
            +
            1.0.0.rc
         | 
    
        data/Versionfile
    ADDED
    
    
| @@ -6,4 +6,11 @@ Spree::BaseHelper.module_eval do | |
| 6 6 | 
             
                  request.params.delete(:page)
         | 
| 7 7 | 
             
                  link_to("#{value} (#{count})", url_for(request.params.merge({:facets => facets_hash})))
         | 
| 8 8 | 
             
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              # hate to clutter up the BaseHelper with this one-time
         | 
| 11 | 
            +
              def sort_by_options_list
         | 
| 12 | 
            +
                # generate <options></options> list
         | 
| 13 | 
            +
                options = ::PRODUCT_SORT_FIELDS.map { |k, v| [t(k), url_for(request.params.merge({:sort => k}))] }
         | 
| 14 | 
            +
                options_for_select(options, url_for(request.params.merge({ :sort => params[:sort] || ::PRODUCT_SORT_FIELDS.keys.first })))
         | 
| 15 | 
            +
              end
         | 
| 9 16 | 
             
            end
         | 
| @@ -0,0 +1,80 @@ | |
| 1 | 
            +
            Spree::Product.class_eval do
         | 
| 2 | 
            +
              acts_as_solr :fields => PRODUCT_SOLR_FIELDS, :facets => PRODUCT_SOLR_FACETS rescue nil
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              def taxon_ids
         | 
| 5 | 
            +
                taxons.map(&:id)
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
              
         | 
| 8 | 
            +
              def is_active
         | 
| 9 | 
            +
                !deleted_at && available_on && 
         | 
| 10 | 
            +
                  (available_on <= Time.zone.now) && 
         | 
| 11 | 
            +
                    (Spree::Config[:allow_backorders] || count_on_hand > 0)
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
              
         | 
| 14 | 
            +
              # saves product to the Solr index
         | 
| 15 | 
            +
              def solr_save
         | 
| 16 | 
            +
                return true if indexing_disabled?
         | 
| 17 | 
            +
                if evaluate_condition(:if, self)
         | 
| 18 | 
            +
                  if defined? Delayed::Job 
         | 
| 19 | 
            +
                    Delayed::Job.enqueue SolrManager.new("solr_save", self, Spree::SolrSearch::Config[:auto_commit])
         | 
| 20 | 
            +
                  else  
         | 
| 21 | 
            +
                    debug "solr_save: #{self.class.name} : #{record_id(self)}"
         | 
| 22 | 
            +
                    solr_add to_solr_doc
         | 
| 23 | 
            +
                    solr_commit if Spree::SolrSearch::Config[:auto_commit]
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                  true
         | 
| 26 | 
            +
                else
         | 
| 27 | 
            +
                  solr_destroy
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              private
         | 
| 32 | 
            +
              
         | 
| 33 | 
            +
              def store_ids
         | 
| 34 | 
            +
                if self.respond_to? :stores
         | 
| 35 | 
            +
                  stores.map(&:id)
         | 
| 36 | 
            +
                else
         | 
| 37 | 
            +
                  []
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
              
         | 
| 41 | 
            +
              def taxon_names
         | 
| 42 | 
            +
                taxons.map(&:name)
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
              
         | 
| 45 | 
            +
              def price_range
         | 
| 46 | 
            +
                max = 0
         | 
| 47 | 
            +
                PRODUCT_PRICE_RANGES.each do |range, name|
         | 
| 48 | 
            +
                  return name if range.include?(price)
         | 
| 49 | 
            +
                  max = range.max if range.max > max
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
                I18n.t(:price_and_above, :price => max)
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
              
         | 
| 54 | 
            +
              def brand_property
         | 
| 55 | 
            +
                pp = Spree::ProductProperty.first(:joins => :property, 
         | 
| 56 | 
            +
                      :conditions => {:product_id => self.id, :spree_properties => {:name => 'brand'}})
         | 
| 57 | 
            +
                pp ? pp.value : ''
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              def color_option
         | 
| 61 | 
            +
                get_option_values('color')
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              def size_option
         | 
| 65 | 
            +
                get_option_values('size')
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
              
         | 
| 68 | 
            +
              def get_option_values(option_name)
         | 
| 69 | 
            +
                sql = <<-eos
         | 
| 70 | 
            +
                  SELECT DISTINCT ov.id, ov.presentation
         | 
| 71 | 
            +
                  FROM spree_option_values AS ov
         | 
| 72 | 
            +
                  LEFT JOIN spree_option_types AS ot ON (ov.option_type_id = ot.id)
         | 
| 73 | 
            +
                  LEFT JOIN spree_option_values_variants AS ovv ON (ovv.option_value_id = ov.id)
         | 
| 74 | 
            +
                  LEFT JOIN spree_variants AS v ON (ovv.variant_id = v.id)
         | 
| 75 | 
            +
                  LEFT JOIN spree_products AS p ON (v.product_id = p.id)
         | 
| 76 | 
            +
                  WHERE (ot.name = '#{option_name}' AND p.id = #{self.id});
         | 
| 77 | 
            +
                eos
         | 
| 78 | 
            +
                Spree::OptionValue.find_by_sql(sql).map(&:presentation)     
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
            end
         | 
| @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            Deface::Override.new(:virtual_path => "spree/shared/_taxonomies",
         | 
| 2 | 
            +
                                  :name => "show_search_partials_facets",
         | 
| 3 | 
            +
                                  :insert_top => "#taxonomies",
         | 
| 4 | 
            +
                                  :partial => "spree/products/facets",
         | 
| 5 | 
            +
                                  :disabled => false)
         | 
| 6 | 
            +
                                 
         | 
| 7 | 
            +
            Deface::Override.new(:virtual_path => "spree/products/index",
         | 
| 8 | 
            +
                                  :name => "show_search_partials_suggestion",
         | 
| 9 | 
            +
                                  :insert_top => "[data-hook='search_results']",
         | 
| 10 | 
            +
                                  :partial => "spree/products/suggestion",
         | 
| 11 | 
            +
                                  :disabled => false)
         | 
| @@ -9,8 +9,8 @@ facets = @searcher.facets || [] | |
| 9 9 | 
             
                  options = options.sort{|x, y| y.count <=> x.count}
         | 
| 10 10 | 
             
                end
         | 
| 11 11 | 
             
                unless options.empty? %>
         | 
| 12 | 
            -
                  < | 
| 13 | 
            -
                  <ul><%
         | 
| 12 | 
            +
                  <h6 class="taxonomy-root"><%= t "#{facet.name}_facet" %></h6>
         | 
| 13 | 
            +
                  <ul class="taxons-list"><%
         | 
| 14 14 | 
             
                    for option in options %>
         | 
| 15 15 | 
             
                      <li>
         | 
| 16 16 | 
             
                        <%= link_to_facet(facet.name, option.name, option.count) %>
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            <div id="product-list-sort">Sort by: <%= select_tag("product_sort_by", sort_by_options_list) %></div>
         | 
| @@ -11,3 +11,14 @@ unless defined?(PRODUCT_SOLR_FACETS) | |
| 11 11 | 
             
              PRODUCT_SOLR_FACETS = [:price_range, :taxon_names,
         | 
| 12 12 | 
             
                                    :brand_property, :color_option, :size_option]
         | 
| 13 13 | 
             
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            unless defined?(PRODUCT_SORT_FIELDS)
         | 
| 16 | 
            +
              PRODUCT_SORT_FIELDS = {
         | 
| 17 | 
            +
                  "price_asc" => ["spree_variants.price", "asc"],
         | 
| 18 | 
            +
                  "price_desc" => ["spree_variants.price", "desc"],
         | 
| 19 | 
            +
                  "date_asc" => ["spree_products.available_on", "asc"],
         | 
| 20 | 
            +
                  "date_desc" => ["spree_products.available_on", "desc"],
         | 
| 21 | 
            +
                  "name_asc" => ["spree_products.name", "asc"],
         | 
| 22 | 
            +
                  "name_desc" => ["spree_products.name", "desc"]
         | 
| 23 | 
            +
                }
         | 
| 24 | 
            +
            end
         | 
    
        data/lib/solr_manager.rb
    ADDED
    
    | @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            class SolrManager
         | 
| 2 | 
            +
              def initialize(mode, object, auto_commit)
         | 
| 3 | 
            +
                @mode = mode
         | 
| 4 | 
            +
                @object = object
         | 
| 5 | 
            +
                @auto_commit = auto_commit
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
              
         | 
| 8 | 
            +
              def perform
         | 
| 9 | 
            +
                puts "#{@mode}: #{@object.class.name} : #{@object.id}"
         | 
| 10 | 
            +
                if @mode == "solr_save"
         | 
| 11 | 
            +
                  @object.solr_add(@object.to_solr_doc)
         | 
| 12 | 
            +
                elsif @mode == "solr_destroy"
         | 
| 13 | 
            +
                  @object.solr_delete(@object.solr_id)
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
                @object.solr_commit if @auto_commit
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
    
        data/lib/spree/search/solr.rb
    CHANGED
    
    | @@ -1,17 +1,31 @@ | |
| 1 1 | 
             
            module Spree::Search
         | 
| 2 | 
            -
              class Solr < defined?(Spree::Search::MultiDomain) ? Spree::Search::MultiDomain :  Spree::Search::Base
         | 
| 2 | 
            +
              class Solr < defined?(Spree::Core::Search::MultiDomain) ? Spree::Core::Search::MultiDomain :  Spree::Core::Search::Base
         | 
| 3 3 | 
             
                protected
         | 
| 4 4 |  | 
| 5 | 
            +
                # NOTE: This class seems to loaded and init'd on rails startup
         | 
| 6 | 
            +
                # this means that any changes to the code will not take effect until the rails app is reloaded.
         | 
| 7 | 
            +
             | 
| 5 8 | 
             
                def get_products_conditions_for(base_scope, query)
         | 
| 6 9 | 
             
                  facets = {
         | 
| 7 10 | 
             
                      :fields => PRODUCT_SOLR_FACETS,
         | 
| 8 11 | 
             
                      :browse => @properties[:facets_hash].map{|k,v| "#{k}:#{v}"},
         | 
| 9 12 | 
             
                      :zeros => false 
         | 
| 10 13 | 
             
                  }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  # adding :scores => true here should return relevance scoring, but the underlying acts_as_solr library seems broken
         | 
| 11 16 | 
             
                  search_options = {:facets => facets, :limit => 25000, :lazy => true}
         | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 17 | 
            +
             | 
| 18 | 
            +
                  # the order option does not work... it generates the solr query request correctly
         | 
| 19 | 
            +
                  # but the returned result.records are not ordered correctly
         | 
| 20 | 
            +
                  # search_options.merge!(:order => (order_by_price == 'descend') ? "price desc" : "price asc")
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  # TODO: find a better place to put the PRODUCT_SORT_FIELDS instead of the global constant namespace
         | 
| 23 | 
            +
                  if not @properties[:sort].nil? and PRODUCT_SORT_FIELDS.has_key? @properties[:sort]
         | 
| 24 | 
            +
                    sort_option = PRODUCT_SORT_FIELDS[@properties[:sort]]
         | 
| 25 | 
            +
                    base_scope = base_scope.order("#{sort_option[0]} #{sort_option[1].upcase}")
         | 
| 14 26 | 
             
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  # Solr query parameters: http://wiki.apache.org/solr/CommonQueryParameters
         | 
| 15 29 | 
             
                  full_query = query + " AND is_active:(true)"
         | 
| 16 30 | 
             
                  if taxon 
         | 
| 17 31 | 
             
                    taxons_query = taxon.self_and_descendants.map{|t| "taxon_ids:(#{t.id})"}.join(" OR ")
         | 
| @@ -20,30 +34,34 @@ module Spree::Search | |
| 20 34 |  | 
| 21 35 | 
             
                  full_query += " AND store_ids:(#{current_store_id})" if current_store_id
         | 
| 22 36 |  | 
| 23 | 
            -
                   | 
| 37 | 
            +
                  # Rails.logger.info "Solr Query: #{full_query}\nOptions: #{search_options}"
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  result = Spree::Product.find_by_solr(full_query, search_options)
         | 
| 24 40 |  | 
| 25 | 
            -
                   | 
| 26 | 
            -
             | 
| 41 | 
            +
                  products = result.records
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  # Rails.logger.info "Solr Response: #{result.records}"
         | 
| 27 44 |  | 
| 28 45 | 
             
                  @properties[:products] = products
         | 
| 29 46 | 
             
                  @properties[:suggest] = nil
         | 
| 30 47 | 
             
                  begin
         | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 48 | 
            +
                    if suggest = result.suggest
         | 
| 49 | 
            +
                      suggest.sub!(/\sAND.*/, '')
         | 
| 50 | 
            +
                      @properties[:suggest] = suggest if suggest != query
         | 
| 51 | 
            +
                    end
         | 
| 35 52 | 
             
                  rescue
         | 
| 36 53 | 
             
                  end
         | 
| 37 | 
            -
             | 
| 54 | 
            +
             | 
| 38 55 | 
             
                  @properties[:facets] = parse_facets_hash(result.facets)
         | 
| 39 | 
            -
                  base_scope.where | 
| 56 | 
            +
                  base_scope.where(["spree_products.id IN (?)", products.map(&:id)])
         | 
| 40 57 | 
             
                end
         | 
| 41 58 |  | 
| 42 59 | 
             
                def prepare(params)
         | 
| 43 60 | 
             
                  super
         | 
| 44 61 | 
             
                  @properties[:facets_hash] = params[:facets] || {}
         | 
| 45 | 
            -
                  @properties[:manage_pagination] =  | 
| 46 | 
            -
                  @properties[: | 
| 62 | 
            +
                  @properties[:manage_pagination] = false
         | 
| 63 | 
            +
                  @properties[:sort] = params[:sort] || nil
         | 
| 64 | 
            +
                  # @properties[:order_by_price] = params[:order_by_price]
         | 
| 47 65 | 
             
                end
         | 
| 48 66 |  | 
| 49 67 | 
             
                private
         | 
| @@ -55,7 +73,7 @@ module Spree::Search | |
| 55 73 | 
             
                    next if options.size <= 1
         | 
| 56 74 | 
             
                    facet = Facet.new(name.sub('_facet', ''))
         | 
| 57 75 | 
             
                    options.each do |value, count|
         | 
| 58 | 
            -
                      facet.options << FacetOption.new(value, count)
         | 
| 76 | 
            +
                      facet.options << FacetOption.new(value, count, facet.name)
         | 
| 59 77 | 
             
                    end
         | 
| 60 78 | 
             
                    facets << facet
         | 
| 61 79 | 
             
                  end
         | 
| @@ -76,9 +94,11 @@ module Spree::Search | |
| 76 94 | 
             
              class FacetOption
         | 
| 77 95 | 
             
                attr_accessor :name
         | 
| 78 96 | 
             
                attr_accessor :count
         | 
| 79 | 
            -
                 | 
| 97 | 
            +
                attr_accessor :facet_name
         | 
| 98 | 
            +
                def initialize(name, count, facet_name)
         | 
| 80 99 | 
             
                  self.name = name
         | 
| 81 100 | 
             
                  self.count = count
         | 
| 101 | 
            +
                  self.facet_name = facet_name
         | 
| 82 102 | 
             
                end    
         | 
| 83 103 | 
             
              end
         | 
| 84 104 | 
             
            end
         | 
    
        data/lib/spree_solr_search.rb
    CHANGED
    
    | @@ -1,18 +1,28 @@ | |
| 1 1 | 
             
            require 'spree_core'
         | 
| 2 | 
            -
             | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Spree::SolrSearch
         | 
| 4 | 
            +
            end
         | 
| 3 5 |  | 
| 4 6 | 
             
            module SpreeSolrSearch
         | 
| 5 7 | 
             
              class Engine < Rails::Engine
         | 
| 8 | 
            +
                engine_name 'spree_solr_search'
         | 
| 9 | 
            +
                
         | 
| 10 | 
            +
                initializer "spree.solr_search.preferences", :after => "spree.environment" do |app|
         | 
| 11 | 
            +
                  Spree::SolrSearch::Config = Spree::SolrSearchConfiguration.new
         | 
| 12 | 
            +
                  Spree::Config.searcher_class = Spree::Search::Solr
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 6 15 | 
             
                def self.activate
         | 
| 7 16 | 
             
                  require 'websolr_acts_as_solr'
         | 
| 8 17 | 
             
                  ENV['RAILS_ENV'] = Rails.env
         | 
| 9 | 
            -
                  
         | 
| 10 | 
            -
                  if Spree::Config.instance
         | 
| 11 | 
            -
                    Spree::Config.searcher_class = Spree::Search::Solr
         | 
| 12 | 
            -
                  end
         | 
| 13 18 |  | 
| 14 19 | 
             
                  Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
         | 
| 15 | 
            -
                    Rails. | 
| 20 | 
            +
                    Rails.configuration.cache_classes ? require(c) : load(c)
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                  
         | 
| 23 | 
            +
                  # Load application's view overrides
         | 
| 24 | 
            +
                  Dir.glob(File.join(File.dirname(__FILE__), "../app/overrides/**/*.rb")) do |c|
         | 
| 25 | 
            +
                    Rails.configuration.cache_classes ? require(c) : load(c)
         | 
| 16 26 | 
             
                  end
         | 
| 17 27 |  | 
| 18 28 | 
             
                end
         | 
    
        data/lib/tasks/acts_as_solr.rake
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            begin
         | 
| 2 | 
            -
              ENV['ONLY'] = "Product"
         | 
| 2 | 
            +
              ENV['ONLY'] = "Spree::Product"
         | 
| 3 3 | 
             
              SOLR_PATH = ENV['SOLR_PATH']
         | 
| 4 4 | 
             
              RAILS_DEFAULT_LOGGER = Logger.new(Rails.root.join("log", Rails.env + ".log"))
         | 
| 5 5 | 
             
              RAILS_ROOT = Rails.root.to_s unless defined?(RAILS_ROOT)
         | 
| @@ -8,3 +8,17 @@ begin | |
| 8 8 | 
             
            rescue LoadError
         | 
| 9 9 | 
             
              puts "WARNING: acts_as_solr_reloaded gem appears to be unavailable.  Please install with bundle install."
         | 
| 10 10 | 
             
            end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            namespace :solr do
         | 
| 13 | 
            +
              task :optimize => :environment do
         | 
| 14 | 
            +
                acts_as_solr_lib_path = $LOAD_PATH.find{|path| path =~ /acts_as_solr_reloaded/ }
         | 
| 15 | 
            +
                require File.expand_path("#{acts_as_solr_lib_path}/../config/solr_environment")
         | 
| 16 | 
            +
                begin
         | 
| 17 | 
            +
                  puts "Optimizing..."
         | 
| 18 | 
            +
                  Spree::Product.solr_optimize
         | 
| 19 | 
            +
                rescue Errno::ECONNREFUSED
         | 
| 20 | 
            +
                  puts "Can't run optimizing, b/c Solr server is unavailable."
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| 24 | 
            +
             | 
    
        data/spree_solr_search.gemspec
    CHANGED
    
    | @@ -1,61 +1,63 @@ | |
| 1 1 | 
             
            # Generated by jeweler
         | 
| 2 2 | 
             
            # DO NOT EDIT THIS FILE DIRECTLY
         | 
| 3 | 
            -
            # Instead, edit Jeweler::Tasks in Rakefile, and run  | 
| 3 | 
            +
            # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
         | 
| 4 4 | 
             
            # -*- encoding: utf-8 -*-
         | 
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 | 
            -
              s.name =  | 
| 8 | 
            -
              s.version = "0. | 
| 7 | 
            +
              s.name = "spree_solr_search"
         | 
| 8 | 
            +
              s.version = "1.0.0.rc"
         | 
| 9 9 |  | 
| 10 | 
            -
              s.required_rubygems_version = Gem::Requirement.new(" | 
| 10 | 
            +
              s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["Roman Smirnov"]
         | 
| 12 | 
            -
              s.date =  | 
| 13 | 
            -
              s.description =  | 
| 14 | 
            -
              s.email =  | 
| 12 | 
            +
              s.date = "2012-04-02"
         | 
| 13 | 
            +
              s.description = "Provides search via Apache Solr for a Spree store."
         | 
| 14 | 
            +
              s.email = "roman@railsdog.com"
         | 
| 15 15 | 
             
              s.extra_rdoc_files = [
         | 
| 16 16 | 
             
                "README.md"
         | 
| 17 17 | 
             
              ]
         | 
| 18 18 | 
             
              s.files = [
         | 
| 19 | 
            -
                ". | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 19 | 
            +
                "README.md",
         | 
| 20 | 
            +
                "Rakefile",
         | 
| 21 | 
            +
                "VERSION",
         | 
| 22 | 
            +
                "Versionfile",
         | 
| 23 | 
            +
                "app/assets/javascripts/store/solr_sort_by.js.coffee",
         | 
| 24 | 
            +
                "app/helpers/spree/base_helper_decorator.rb",
         | 
| 25 | 
            +
                "app/models/spree/product_decorator.rb",
         | 
| 26 | 
            +
                "app/models/spree/solr_search_configuration.rb",
         | 
| 27 | 
            +
                "app/overrides/show_search_partials.rb",
         | 
| 28 | 
            +
                "app/views/spree/products/_facets.html.erb",
         | 
| 29 | 
            +
                "app/views/spree/products/_sort_bar.html.erb",
         | 
| 30 | 
            +
                "app/views/spree/products/_suggestion.html.erb",
         | 
| 31 | 
            +
                "config/initializers/solr_config.rb",
         | 
| 32 | 
            +
                "config/locales/en.yml",
         | 
| 33 | 
            +
                "config/locales/ru-RU.yml",
         | 
| 34 | 
            +
                "config/locales/ru.yml",
         | 
| 35 | 
            +
                "lib/generators/spree_solr_search/install_generator.rb",
         | 
| 36 | 
            +
                "lib/generators/templates/solr.yml",
         | 
| 37 | 
            +
                "lib/solr_manager.rb",
         | 
| 38 | 
            +
                "lib/spree/search/solr.rb",
         | 
| 39 | 
            +
                "lib/spree_solr_search.rb",
         | 
| 40 | 
            +
                "lib/tasks/acts_as_solr.rake",
         | 
| 41 | 
            +
                "lib/websolr_acts_as_solr.rb",
         | 
| 42 | 
            +
                "spree_solr_search.gemspec"
         | 
| 39 43 | 
             
              ]
         | 
| 40 | 
            -
              s.homepage =  | 
| 41 | 
            -
              s.rdoc_options = ["--charset=UTF-8"]
         | 
| 44 | 
            +
              s.homepage = "http://github.com/romul/spree-solr-search"
         | 
| 42 45 | 
             
              s.require_paths = ["lib"]
         | 
| 43 | 
            -
              s.rubygems_version =  | 
| 44 | 
            -
              s.summary =  | 
| 46 | 
            +
              s.rubygems_version = "1.8.15"
         | 
| 47 | 
            +
              s.summary = "Provides search via Apache Solr for a Spree store."
         | 
| 45 48 |  | 
| 46 49 | 
             
              if s.respond_to? :specification_version then
         | 
| 47 | 
            -
                current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
         | 
| 48 50 | 
             
                s.specification_version = 3
         | 
| 49 51 |  | 
| 50 | 
            -
                if Gem::Version.new(Gem:: | 
| 51 | 
            -
                  s.add_runtime_dependency(%q<spree_core>, [">= 0. | 
| 52 | 
            +
                if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
         | 
| 53 | 
            +
                  s.add_runtime_dependency(%q<spree_core>, [">= 1.0.0"])
         | 
| 52 54 | 
             
                  s.add_runtime_dependency(%q<acts_as_solr_reloaded>, [">= 1.6.0"])
         | 
| 53 55 | 
             
                else
         | 
| 54 | 
            -
                  s.add_dependency(%q<spree_core>, [">= 0. | 
| 56 | 
            +
                  s.add_dependency(%q<spree_core>, [">= 1.0.0"])
         | 
| 55 57 | 
             
                  s.add_dependency(%q<acts_as_solr_reloaded>, [">= 1.6.0"])
         | 
| 56 58 | 
             
                end
         | 
| 57 59 | 
             
              else
         | 
| 58 | 
            -
                s.add_dependency(%q<spree_core>, [">= 0. | 
| 60 | 
            +
                s.add_dependency(%q<spree_core>, [">= 1.0.0"])
         | 
| 59 61 | 
             
                s.add_dependency(%q<acts_as_solr_reloaded>, [">= 1.6.0"])
         | 
| 60 62 | 
             
              end
         | 
| 61 63 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,12 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: spree_solr_search
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
               | 
| 4 | 
            +
              hash: 981947206
         | 
| 5 | 
            +
              prerelease: 6
         | 
| 5 6 | 
             
              segments: 
         | 
| 7 | 
            +
              - 1
         | 
| 8 | 
            +
              - 0
         | 
| 6 9 | 
             
              - 0
         | 
| 7 | 
            -
              -  | 
| 8 | 
            -
               | 
| 9 | 
            -
              version: 0.40.3
         | 
| 10 | 
            +
              - rc
         | 
| 11 | 
            +
              version: 1.0.0.rc
         | 
| 10 12 | 
             
            platform: ruby
         | 
| 11 13 | 
             
            authors: 
         | 
| 12 14 | 
             
            - Roman Smirnov
         | 
| @@ -14,30 +16,33 @@ autorequire: | |
| 14 16 | 
             
            bindir: bin
         | 
| 15 17 | 
             
            cert_chain: []
         | 
| 16 18 |  | 
| 17 | 
            -
            date:  | 
| 18 | 
            -
            default_executable: 
         | 
| 19 | 
            +
            date: 2012-04-02 00:00:00 Z
         | 
| 19 20 | 
             
            dependencies: 
         | 
| 20 21 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 21 22 | 
             
              name: spree_core
         | 
| 22 23 | 
             
              prerelease: false
         | 
| 23 24 | 
             
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 25 | 
            +
                none: false
         | 
| 24 26 | 
             
                requirements: 
         | 
| 25 27 | 
             
                - - ">="
         | 
| 26 28 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 29 | 
            +
                    hash: 23
         | 
| 27 30 | 
             
                    segments: 
         | 
| 28 | 
            -
                    - 0
         | 
| 29 | 
            -
                    - 30
         | 
| 30 31 | 
             
                    - 1
         | 
| 31 | 
            -
                     | 
| 32 | 
            +
                    - 0
         | 
| 33 | 
            +
                    - 0
         | 
| 34 | 
            +
                    version: 1.0.0
         | 
| 32 35 | 
             
              type: :runtime
         | 
| 33 36 | 
             
              version_requirements: *id001
         | 
| 34 37 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 35 38 | 
             
              name: acts_as_solr_reloaded
         | 
| 36 39 | 
             
              prerelease: false
         | 
| 37 40 | 
             
              requirement: &id002 !ruby/object:Gem::Requirement 
         | 
| 41 | 
            +
                none: false
         | 
| 38 42 | 
             
                requirements: 
         | 
| 39 43 | 
             
                - - ">="
         | 
| 40 44 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 45 | 
            +
                    hash: 15
         | 
| 41 46 | 
             
                    segments: 
         | 
| 42 47 | 
             
                    - 1
         | 
| 43 48 | 
             
                    - 6
         | 
| @@ -54,53 +59,62 @@ extensions: [] | |
| 54 59 | 
             
            extra_rdoc_files: 
         | 
| 55 60 | 
             
            - README.md
         | 
| 56 61 | 
             
            files: 
         | 
| 57 | 
            -
            - .gitignore
         | 
| 58 62 | 
             
            - README.md
         | 
| 59 63 | 
             
            - Rakefile
         | 
| 60 64 | 
             
            - VERSION
         | 
| 65 | 
            +
            - Versionfile
         | 
| 66 | 
            +
            - app/assets/javascripts/store/solr_sort_by.js.coffee
         | 
| 61 67 | 
             
            - app/helpers/spree/base_helper_decorator.rb
         | 
| 62 | 
            -
            - app/models/product_decorator.rb
         | 
| 63 | 
            -
            - app/ | 
| 64 | 
            -
            - app/ | 
| 68 | 
            +
            - app/models/spree/product_decorator.rb
         | 
| 69 | 
            +
            - app/models/spree/solr_search_configuration.rb
         | 
| 70 | 
            +
            - app/overrides/show_search_partials.rb
         | 
| 71 | 
            +
            - app/views/spree/products/_facets.html.erb
         | 
| 72 | 
            +
            - app/views/spree/products/_sort_bar.html.erb
         | 
| 73 | 
            +
            - app/views/spree/products/_suggestion.html.erb
         | 
| 65 74 | 
             
            - config/initializers/solr_config.rb
         | 
| 66 75 | 
             
            - config/locales/en.yml
         | 
| 67 76 | 
             
            - config/locales/ru-RU.yml
         | 
| 68 77 | 
             
            - config/locales/ru.yml
         | 
| 69 78 | 
             
            - lib/generators/spree_solr_search/install_generator.rb
         | 
| 70 79 | 
             
            - lib/generators/templates/solr.yml
         | 
| 80 | 
            +
            - lib/solr_manager.rb
         | 
| 71 81 | 
             
            - lib/spree/search/solr.rb
         | 
| 72 82 | 
             
            - lib/spree_solr_search.rb
         | 
| 73 | 
            -
            - lib/spree_solr_search_hooks.rb
         | 
| 74 83 | 
             
            - lib/tasks/acts_as_solr.rake
         | 
| 75 84 | 
             
            - lib/websolr_acts_as_solr.rb
         | 
| 76 85 | 
             
            - spree_solr_search.gemspec
         | 
| 77 | 
            -
            has_rdoc: true
         | 
| 78 86 | 
             
            homepage: http://github.com/romul/spree-solr-search
         | 
| 79 87 | 
             
            licenses: []
         | 
| 80 88 |  | 
| 81 89 | 
             
            post_install_message: 
         | 
| 82 | 
            -
            rdoc_options: 
         | 
| 83 | 
            -
             | 
| 90 | 
            +
            rdoc_options: []
         | 
| 91 | 
            +
             | 
| 84 92 | 
             
            require_paths: 
         | 
| 85 93 | 
             
            - lib
         | 
| 86 94 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement 
         | 
| 95 | 
            +
              none: false
         | 
| 87 96 | 
             
              requirements: 
         | 
| 88 97 | 
             
              - - ">="
         | 
| 89 98 | 
             
                - !ruby/object:Gem::Version 
         | 
| 99 | 
            +
                  hash: 3
         | 
| 90 100 | 
             
                  segments: 
         | 
| 91 101 | 
             
                  - 0
         | 
| 92 102 | 
             
                  version: "0"
         | 
| 93 103 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 104 | 
            +
              none: false
         | 
| 94 105 | 
             
              requirements: 
         | 
| 95 | 
            -
              - - " | 
| 106 | 
            +
              - - ">"
         | 
| 96 107 | 
             
                - !ruby/object:Gem::Version 
         | 
| 108 | 
            +
                  hash: 25
         | 
| 97 109 | 
             
                  segments: 
         | 
| 98 | 
            -
                  -  | 
| 99 | 
            -
                   | 
| 110 | 
            +
                  - 1
         | 
| 111 | 
            +
                  - 3
         | 
| 112 | 
            +
                  - 1
         | 
| 113 | 
            +
                  version: 1.3.1
         | 
| 100 114 | 
             
            requirements: []
         | 
| 101 115 |  | 
| 102 116 | 
             
            rubyforge_project: 
         | 
| 103 | 
            -
            rubygems_version: 1. | 
| 117 | 
            +
            rubygems_version: 1.8.15
         | 
| 104 118 | 
             
            signing_key: 
         | 
| 105 119 | 
             
            specification_version: 3
         | 
| 106 120 | 
             
            summary: Provides search via Apache Solr for a Spree store.
         | 
    
        data/.gitignore
    DELETED
    
    
| @@ -1,63 +0,0 @@ | |
| 1 | 
            -
            Product.class_eval do
         | 
| 2 | 
            -
              acts_as_solr  :fields => PRODUCT_SOLR_FIELDS, :facets => PRODUCT_SOLR_FACETS
         | 
| 3 | 
            -
             | 
| 4 | 
            -
              def taxon_ids
         | 
| 5 | 
            -
                taxons.map(&:id)
         | 
| 6 | 
            -
              end
         | 
| 7 | 
            -
              
         | 
| 8 | 
            -
              def is_active
         | 
| 9 | 
            -
                !deleted_at && 
         | 
| 10 | 
            -
                  (available_on <= Time.zone.now) && 
         | 
| 11 | 
            -
                    (Spree::Config[:allow_backorders] || count_on_hand > 0)
         | 
| 12 | 
            -
              end
         | 
| 13 | 
            -
              
         | 
| 14 | 
            -
              private
         | 
| 15 | 
            -
              
         | 
| 16 | 
            -
              def store_ids
         | 
| 17 | 
            -
                if self.respond_to? :stores
         | 
| 18 | 
            -
                  stores.map(&:id)
         | 
| 19 | 
            -
                else
         | 
| 20 | 
            -
                  []
         | 
| 21 | 
            -
                end
         | 
| 22 | 
            -
              end
         | 
| 23 | 
            -
              
         | 
| 24 | 
            -
              def taxon_names
         | 
| 25 | 
            -
                taxons.map(&:name)
         | 
| 26 | 
            -
              end
         | 
| 27 | 
            -
              
         | 
| 28 | 
            -
              def price_range
         | 
| 29 | 
            -
                max = 0
         | 
| 30 | 
            -
                PRODUCT_PRICE_RANGES.each do |range, name|
         | 
| 31 | 
            -
                  return name if range.include?(price)
         | 
| 32 | 
            -
                  max = range.max if range.max > max
         | 
| 33 | 
            -
                end
         | 
| 34 | 
            -
                I18n.t(:price_and_above, :price => max)
         | 
| 35 | 
            -
              end
         | 
| 36 | 
            -
              
         | 
| 37 | 
            -
              def brand_property
         | 
| 38 | 
            -
                pp = ProductProperty.first(:joins => :property, 
         | 
| 39 | 
            -
                      :conditions => {:product_id => self.id, :properties => {:name => 'brand'}})
         | 
| 40 | 
            -
                pp ? pp.value : ''
         | 
| 41 | 
            -
              end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
              def color_option
         | 
| 44 | 
            -
                get_option_values('color')
         | 
| 45 | 
            -
              end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
              def size_option
         | 
| 48 | 
            -
                get_option_values('size')
         | 
| 49 | 
            -
              end
         | 
| 50 | 
            -
              
         | 
| 51 | 
            -
              def get_option_values(option_name)
         | 
| 52 | 
            -
                sql = <<-eos
         | 
| 53 | 
            -
                  SELECT DISTINCT ov.id, ov.presentation
         | 
| 54 | 
            -
                  FROM option_values AS ov
         | 
| 55 | 
            -
                  LEFT JOIN option_types AS ot ON (ov.option_type_id = ot.id)
         | 
| 56 | 
            -
                  LEFT JOIN option_values_variants AS ovv ON (ovv.option_value_id = ov.id)
         | 
| 57 | 
            -
                  LEFT JOIN variants AS v ON (ovv.variant_id = v.id)
         | 
| 58 | 
            -
                  LEFT JOIN products AS p ON (v.product_id = p.id)
         | 
| 59 | 
            -
                  WHERE (ot.name = '#{option_name}' AND p.id = #{self.id});
         | 
| 60 | 
            -
                eos
         | 
| 61 | 
            -
                OptionValue.find_by_sql(sql).map(&:presentation)     
         | 
| 62 | 
            -
              end
         | 
| 63 | 
            -
            end
         |