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
|