stub_solr 0.0.4

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0dfd9c8199e4ab5c50789791f3149ed9e2c89aac
4
+ data.tar.gz: e9ac7ef59532089aabee78d66df601068287b42c
5
+ SHA512:
6
+ metadata.gz: edcf6aaa16e0bbdca4f64e9ee76a3c1599d320461214d67c17063f682b9a392ee9df14dcd14709d3900294b023a8171e9515896fffeea9b515d298cf6c8d50dd
7
+ data.tar.gz: 13badb963b7b8303ea4476d99e379622e1b9b22c0be94ef345cfd0b011637eea64b09974702b67a23ff55d3a9600238d16f4fe5252dd62284aaea3b57bff9af0
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ *.gem
2
+ sunspot-solr.pid
3
+ /.bundle/
4
+ /.yardoc
5
+ /Gemfile.lock
6
+ /_yardoc/
7
+ /coverage/
8
+ /doc/
9
+ /pkg/
10
+ /spec/reports/
11
+ /tmp/*
12
+ .DS_Store
13
+ .byebug_history
14
+ /gemfiles/*.lock
data/.rubocop.yml ADDED
@@ -0,0 +1,27 @@
1
+
2
+ AllCops:
3
+ Exclude:
4
+ - bin/**/*
5
+ - dev_tasks/*
6
+ - gemfiels/*
7
+ - test/**/*
8
+ - tmp/**/*
9
+ TargetRubyVersion: 2.3
10
+
11
+ Rails:
12
+ Enabled: true
13
+
14
+ DotPosition:
15
+ EnforcedStyle: trailing
16
+
17
+ Style/EmptyLinesAroundBlockBody:
18
+ Enabled: false
19
+
20
+ Style/EmptyLinesAroundModuleBody:
21
+ Enabled: false
22
+
23
+ Style/EmptyLinesAroundClassBody:
24
+ Enabled: false
25
+
26
+ Style/EmptyLinesAroundMethodBody:
27
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ sudo: false
2
+ language: ruby
3
+ cache: bundler
4
+
5
+ rvm:
6
+ - 2.3.1
7
+ before_install: gem install bundler -v 1.12.5
8
+
9
+ env:
10
+ - GEM=sunspot
11
+ - GEM=sunspot_rails RAILS=5.0.0.1
12
+ - GEM=sunspot_solr
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ platforms :ruby_19 do
4
+ gem 'mime-types', '~> 2.6'
5
+ end
6
+
7
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Jaigouk Kim
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # StubSolr
2
+
3
+ `Sunspot.session = Sunspot::Rails::StubSessionProxy.new(Sunspot.session)` is enough for most of cases but if you want more than `allow_any_instance_of(Sunspot::Rails::StubSessionProxy::Search).to receive(:results).and_return(myExpectedResults)` this gem can be helpful. `kaminari` for pagination and plain AR to mimic resutls.
4
+
5
+ this gem depends on `2.2.6` version of sunspot, sunspot_rails.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'stub_solr'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install stub_solr
22
+
23
+ ## Usage
24
+
25
+ `test_helper` file should have `require 'stub_solr'`. In your test file, add setup and teardown like this
26
+
27
+ ```ruby
28
+ class ActivitiesControllerTest < ActionDispatch::IntegrationTest
29
+ def setup
30
+ Sunspot.session = Sunspot::Rails::StubSessionProxy.new(
31
+ Sunspot.session, Activity.all.to_a.concat(Excercise.all.to_a)
32
+ )
33
+ super
34
+ end
35
+
36
+ def teardown
37
+ Sunspot.session = ::Sunspot.session.original_session
38
+ super
39
+ end
40
+
41
+ test 'search with filter' do
42
+ get search_activities_url(params: { visible: true, search: 'beer' })
43
+ expected = Activity.where(visible: true).where("title LIKE ?", "%beer%")
44
+ res = ActiveSupport::JSON.decode(response.body)["activities"]
45
+ res.size.must_equal expected.size
46
+ end
47
+ end
48
+ ```
49
+
50
+ For searching, it finds all string / text fields for given classes and use them.
51
+
52
+ For range search like `greater_than`, it uses array to check an attribute is for range search. by default, it's `%w[time month created_at start end]` but you can change that.
53
+
54
+ ```ruby
55
+ def setup
56
+ Sunspot.session = Sunspot::Rails::StubSessionProxy.new(
57
+ Sunspot.session, Activity.all.to_a.concat(Excercise.all.to_a)
58
+ )
59
+ Sunspot.session.set_range_fields(%w[time month created_at departure arrival])
60
+ super
61
+ end
62
+ ```
63
+
64
+
65
+ ## Development
66
+
67
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
68
+
69
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
70
+
71
+ ## Contributing
72
+
73
+ Bug reports and pull requests are welcome on GitHub at https://github.com/jaigouk/stub_solr.
74
+
75
+
76
+ ## License
77
+
78
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
79
+
data/Rakefile ADDED
@@ -0,0 +1,37 @@
1
+ require 'rake'
2
+ require 'rake/clean'
3
+ require 'rake/file_list'
4
+
5
+ TO_CLEAN = Rake::FileList.new do |fl|
6
+ fl.include 'tmp/**/*'
7
+ fl.include '**/.bundle'
8
+ fl.exclude 'tmp/.gitkeep'
9
+ end
10
+
11
+ CLEAN.include TO_CLEAN
12
+
13
+ task :environment do
14
+ end
15
+
16
+ FileList['dev_tasks/*.rake'].each { |file| load(file) }
17
+ task :default => [:spec]
18
+
19
+ desc 'Install bleeding edge gems locally'
20
+ task :install do
21
+ system "rm *.gem"
22
+ system "gem build *.gemspec"
23
+ system "gem install *.gem"
24
+ end
25
+
26
+ desc 'Release to Rubygems.org'
27
+ task :release do
28
+ require File.expand_path('../lib/stub_solr/version', __FILE__)
29
+
30
+ version_tag = "v#{StubSolr::VERSION}"
31
+ system "git tag -am 'Release version #{StubSolr::VERSION}' '#{version_tag}'"
32
+ system "git push origin #{version_tag}:#{version_tag}"
33
+
34
+ system "gem build stub_solr.gemspec"
35
+ system "gem push stub_solr-#{StubSolr::VERSION}.gem"
36
+ FileUtils.rm("stub_solr-#{StubSolr::VERSION}.gem")
37
+ end
@@ -0,0 +1,4 @@
1
+ namespace :release do
2
+ desc 'Release gem on GitHub'
3
+ task :all => [:release]
4
+ end
@@ -0,0 +1,107 @@
1
+ require 'fileutils'
2
+ require 'rake'
3
+
4
+ desc 'Run spec suite in all Rails versions'
5
+ task :spec do
6
+ puts "Running default task"
7
+ versions = if ENV['RAILS']
8
+ ENV['RAILS'].split(",")
9
+ else
10
+ rails_all_versions
11
+ end
12
+
13
+ versions.each do |version|
14
+ puts "Running specs against Rails #{version}..."
15
+
16
+ ENV['VERSION'] = version
17
+ reenable_spec_tasks
18
+ Rake::Task['spec:run_with_rails'].invoke
19
+ end
20
+ end
21
+
22
+
23
+ namespace :spec do
24
+ def rails_app_path(version)
25
+ File.join(File.dirname(__FILE__), "..", "tmp", "rails_#{version.gsub(".", "_")}_app")
26
+ end
27
+
28
+ def gemfile_path(version)
29
+ File.join(File.dirname(__FILE__), "..", "gemfiles", "rails-#{version}")
30
+ end
31
+
32
+ def vendor_path(version)
33
+ File.expand_path("vendor/bundle", rails_app_path(version))
34
+ end
35
+
36
+ def rails_template_path
37
+ File.join(File.dirname(__FILE__), "..", "test", "rails_template")
38
+ end
39
+
40
+ def version
41
+ ENV['VERSION']
42
+ end
43
+
44
+ task :run_with_rails => [:set_gemfile, :generate_rails_app, :initialize_database, :setup_rails_app, :run]
45
+
46
+ task :set_gemfile do
47
+ ENV['BUNDLE_PATH'] = vendor_path(version)
48
+ ENV['BUNDLE_GEMFILE'] = gemfile_path(version)
49
+ unless File.exist?(ENV['BUNDLE_PATH'])
50
+ puts "Installing gems for Rails #{version} (this will only be done once)..."
51
+ sh("bundle install #{ENV['BUNDLE_ARGS']}") || exit(1)
52
+ end
53
+ end
54
+
55
+ task :generate_rails_app do
56
+ app_path = rails_app_path(version)
57
+
58
+ unless File.exist?(File.expand_path("config/environment.rb", app_path))
59
+ puts "Generating Rails #{version} application..."
60
+ sh("bundle exec rails _#{version}_ new \"#{app_path}\" --force --skip-git --skip-javascript --skip-gemfile --skip-sprockets") || exit(1)
61
+ end
62
+ end
63
+
64
+ task :initialize_database do
65
+ if ENV['DB'] == 'postgres'
66
+ sh "bundle exec rake db:test:prepare"
67
+ end
68
+ end
69
+
70
+ task :setup_rails_app do
71
+ FileUtils.cp_r File.join(rails_template_path, "."), rails_app_path(version)
72
+ end
73
+
74
+ # task :load_fixtures do
75
+ # puts "loading fixtures..."
76
+ # sh "bundle exec rake db:fixtures:load RAILS_ENV=test FIXTURES_DIR='test/fixtures'"
77
+ # end
78
+
79
+ task :run do
80
+ ENV['BUNDLE_GEMFILE'] = gemfile_path(version)
81
+ ENV['RAILS_ROOT'] = rails_app_path(version)
82
+
83
+ sh "bundle exec ruby -I test #{ENV['SPEC'] || 'test/*_spec.rb'}"
84
+ end
85
+ end
86
+
87
+
88
+ def rails_all_versions
89
+ versions = []
90
+ puts "getting rails versions to test"
91
+ Dir.glob(File.join(File.dirname(__FILE__), "..", "gemfiles", "rails-*")).each do |gemfile|
92
+ if !gemfile.end_with?(".lock") && gemfile =~ /rails-([0-9.]+)/
93
+ versions << $1
94
+ end
95
+ end
96
+
97
+ puts versions.to_s
98
+ versions
99
+ end
100
+
101
+ def reenable_spec_tasks
102
+ Rake::Task.tasks.each do |task|
103
+ if task.name =~ /spec:/
104
+ task.reenable
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_DISABLE_SHARED_GEMS: "true"
@@ -0,0 +1,22 @@
1
+ source 'https://rubygems.org'
2
+ gem 'rails', '~> 5.0.0.1'
3
+ gem 'sunspot', '2.2.6'
4
+ gem 'sunspot_solr', '2.2.6'
5
+ gem 'sunspot_rails', '2.2.6'
6
+ gem 'kaminari'
7
+ gem 'rake', '11.2.0'
8
+
9
+ group :test do
10
+ gem 'minitest-rails'
11
+ gem 'minitest-reporters'
12
+ gem 'byebug'
13
+ gem 'stub_solr', :path => File.expand_path('../..', __FILE__)
14
+ end
15
+
16
+ group :postgres do
17
+ gem 'pg'
18
+ end
19
+
20
+ group :sqlite do
21
+ gem 'sqlite3'
22
+ end
@@ -0,0 +1,363 @@
1
+
2
+ # stub solr with "dara" array for testing.
3
+ # if there is no data then it will behave like default blank search
4
+ # this stub uses Kaminari for pagination
5
+ # once the data is given, solr search block will call search
6
+ # and that will create a new Search with arguments.
7
+ # With the search, it passes the given data as @operation_context.
8
+ # And "run_proc_block" method will go through each search conditions
9
+ # in the block. while going through the block, it will change @operation_context
10
+ #
11
+ class Sunspot::Rails::StubSessionProxy
12
+ attr_reader :block, :data, :range_fields
13
+
14
+ def initialize(original_session, data = [])
15
+ @original_session = original_session
16
+ @data = data
17
+ @range_fields = %w[time month created_at start end]
18
+ end
19
+
20
+ def set_range_fields(arr)
21
+ @range_fields = arr
22
+ end
23
+
24
+ def search(*types, &block)
25
+ Search.new(@data, types, &block)
26
+ end
27
+
28
+ # with and fulltext can be called multiple times
29
+ # based on the block. that's why i am mutating @results
30
+ #
31
+ # for all and any block, we need to consult sunspot/lib/sunspot/dsl/standard_query.rb
32
+ #
33
+ class Search
34
+ attr_reader :block, :types, :page, :per_page, :grouped_results
35
+ def initialize(results = [], types = [], &block)
36
+ @facets = {}
37
+ @search_data = results
38
+ @block = block
39
+ @types = types
40
+ @page = 1
41
+ @per_page = 30
42
+ @grouped_results = {}
43
+ @group_key = ""
44
+ @range_search_field = nil
45
+ @operation_context = [{operation: "all", result: @search_data}]
46
+ @current_context_index = 0
47
+ @order_key = nil
48
+ @order_direction = nil
49
+ @textsearch_priorities = {}
50
+ @search_term = ""
51
+ run_proc_block
52
+ end
53
+
54
+ def final_results
55
+ @operation_context.last[:result]
56
+ end
57
+
58
+ def results
59
+ return PaginatedCollection.new if sorted_temp_result.empty?
60
+ return sorted_temp_result if final_results.is_a? Kaminari::PaginatableArray
61
+ Kaminari.paginate_array(sorted_temp_result).page(@page).per(@per_page)
62
+ end
63
+
64
+ def any_of(&bl)
65
+ previous_result = result_for_current_context
66
+ @operation_context.push({operation: "any", result: previous_result, temp_result: []})
67
+ @current_context_index += 1
68
+
69
+ Sunspot::Util::ContextBoundDelegate.instance_eval_with_context(self, &bl)
70
+ after_results = @operation_context[@current_context_index][:temp_result]
71
+
72
+ parent_temp_result = @operation_context[@current_context_index - 1][:temp_result]
73
+
74
+
75
+ unless @current_context_index == 0
76
+ @current_context_index -= 1
77
+ @operation_context.pop
78
+ end
79
+ # parent is now current context
80
+ if parent_temp_result
81
+ @operation_context[@current_context_index][:temp_result] = parent_temp_result.concat(after_results)
82
+ else
83
+ @operation_context[@current_context_index][:result] = after_results
84
+ end
85
+ self
86
+ end
87
+
88
+ def all_of(&bl)
89
+ previous_result = result_for_current_context
90
+ @operation_context.push({operation: "all", result: previous_result})
91
+ @current_context_index += 1
92
+
93
+ Sunspot::Util::ContextBoundDelegate.instance_eval_with_context(self, &bl)
94
+ after_results = result_for_current_context
95
+ parent_temp_result = @operation_context[@current_context_index - 1][:temp_result]
96
+
97
+ unless @current_context_index == 0
98
+ @current_context_index -= 1
99
+ @operation_context.pop
100
+ end
101
+
102
+ # parent is now current context
103
+ if parent_temp_result
104
+ @operation_context[@current_context_index][:temp_result] = parent_temp_result.concat(after_results)
105
+ else
106
+ @operation_context[@current_context_index][:result] = (previous_result & after_results).uniq
107
+ end
108
+
109
+ self
110
+ end
111
+
112
+ def with(attribute, value = "no_value")
113
+ skip_no_value(attribute, value)
114
+
115
+ if attribute == :search_class
116
+ matches = result_for_current_context.select {|x| x.class.name == value }
117
+ operation_context_result(matches)
118
+ return self
119
+ end
120
+
121
+ if value == nil && attribute_is_about_range?(attribute)
122
+ matches = result_for_current_context.select {|x| x.has_attribute?(attribute) && (x.read_attribute(attribute) == value)}
123
+ operation_context_result(matches)
124
+ return self
125
+ end
126
+
127
+ return self if value == "no_value" || attribute == :location
128
+
129
+ matches = if value.class.name == "Array"
130
+ result_for_current_context.select {|x| value.include?(x.send(attribute)) }
131
+ elsif @types.map{|x| x.has_attribute?(attribute)}.include?(true)
132
+ result_for_current_context.select {|x| x.read_attribute(attribute) == value }
133
+ else
134
+ result_for_current_context.select {|x| x.send(attribute) == value }
135
+ end
136
+ operation_context_result(matches)
137
+ self
138
+ end
139
+
140
+ def without(attribute, value = "no_value")
141
+ skip_no_value(attribute, value)
142
+ if value == nil && attribute_is_about_range?(attribute)
143
+ matches = result_for_current_context.select {|x| x.has_attribute?(attribute) && !(x.read_attribute(attribute) == value)}
144
+ operation_context_result(matches)
145
+ return self
146
+ end
147
+
148
+ return self if value == "no_value" || attribute == :location
149
+ matches = if value.class.name == "Array"
150
+ result_for_current_context.select {|x| x.has_attribute?(attribute) && !value.include?(x.send(attribute)) }
151
+ else
152
+ result_for_current_context.select {|x| x.has_attribute?(attribute) && !x.read_attribute(attribute).nil? && (x.read_attribute(attribute) != value) }
153
+ end
154
+ operation_context_result(matches)
155
+ self
156
+ end
157
+
158
+ def hits
159
+ self
160
+ end
161
+
162
+ # Added to pass .group_by
163
+ # Idea is save grouped hash result seperately and then
164
+ # access it with [] method.
165
+ #
166
+ # initial_grouped_hits = initial.hits.group_by(&:class_name)
167
+ # initial_grouped_hits["Activity"]
168
+ def [](key)
169
+ return if @grouped_results.empty? || @grouped_results[key].nil?
170
+ @group_key = key
171
+ self
172
+ end
173
+
174
+ # possible situation
175
+ #
176
+ # initial_grouped_hits = initial.hits.group_by(&:class_name)
177
+ # initial_grouped_hits["Activity"].map(&:primary_key)
178
+ def map(&pr)
179
+ return unless @grouped_results[@group_key]
180
+ @grouped_results[@group_key].map{|x| x.id}
181
+ end
182
+
183
+ # possible situation
184
+ #
185
+ # initial_grouped_hits = initial.hits.group_by(&:class_name)
186
+ def group_by(class_name = nil)
187
+ return self if final_results.empty?
188
+ @types.each do |type|
189
+ @grouped_results[type.name] = sorted_temp_result.group_by{|i| i.class.name == type.name }[true]
190
+ end
191
+ self
192
+ end
193
+
194
+ def phrase_fields(arg)
195
+ @textsearch_priorities = arg
196
+ return self if @search_term.empty?
197
+ fulltext(@search_term)
198
+ end
199
+
200
+ def query_phrase_slop(*args)
201
+ fulltext(@search_term)
202
+ end
203
+
204
+ # with default `StubSessionProxy`, the results is blank whatever
205
+ # argument or options you put in the search block
206
+ def fulltext(term, opt={}, &bl)
207
+ matches = []
208
+ @search_term = term
209
+ Sunspot::Util::ContextBoundDelegate.instance_eval_with_context(self, &bl) if !bl.nil?
210
+ # if there is phrase_fields option then we only search for the field
211
+ # to mimic the priority search. #string_text_fields
212
+ @types.each do |type|
213
+ string_text_fields(type).each do |field|
214
+ if type.has_attribute?(field.to_sym)
215
+ matches << type.where(type.arel_table[field.to_sym].matches("%#{term}%")).to_a
216
+ end
217
+ end
218
+ end
219
+ calculated = (result_for_current_context & matches.flatten.uniq)
220
+ operation_context_result(calculated)
221
+ self
222
+ end
223
+
224
+ def order_by(attribute, direction)
225
+ @order_key = attribute
226
+ @order_direction = direction
227
+ self
228
+ end
229
+
230
+ def in_radius(*args)
231
+ calculated = result_for_current_context.select do |r|
232
+ distance = r&.location&.distance_from([args[0], args[1]])
233
+ distance && distance < args[2].to_i
234
+ end
235
+ operation_context_result(calculated)
236
+ self
237
+ end
238
+
239
+ def greater_than(time)
240
+ calculated = result_for_current_context.select do |x|
241
+ has_attribute_and_not_nil(x) &&
242
+ x.read_attribute(@range_search_field) > time
243
+ end.uniq
244
+ operation_context_result(calculated)
245
+ self
246
+ end
247
+
248
+ def greater_than_or_equal_to(time)
249
+ calculated = result_for_current_context.select do |x|
250
+ has_attribute_and_not_nil(x) &&
251
+ x.read_attribute(@range_search_field) >= time
252
+ end.uniq
253
+ operation_context_result(calculated)
254
+ self
255
+ end
256
+
257
+ def less_than(time)
258
+ calculated = result_for_current_context.select do |x|
259
+ has_attribute_and_not_nil(x) &&
260
+ x.read_attribute(@range_search_field) < time
261
+ end.uniq
262
+ operation_context_result(calculated)
263
+ self
264
+ end
265
+
266
+ def less_than_or_equal_to(time)
267
+ calculated = result_for_current_context.select do |x|
268
+ has_attribute_and_not_nil(x) &&
269
+ x.read_attribute(@range_search_field) <= time
270
+ end.uniq
271
+ operation_context_result(calculated)
272
+ self
273
+ end
274
+
275
+ def paginate(args={})
276
+ @page = args[:page]
277
+ @per_page = args[:per_page]
278
+ self
279
+ end
280
+
281
+ def total
282
+ @operation_context.last[:result].size
283
+ end
284
+
285
+ private
286
+
287
+ # iterate the given block and change @operation_context
288
+ # block may cotain with, without, fulltext, paginate, in_raius, order_by
289
+ def run_proc_block
290
+ result = @operation_context.last[:result]
291
+ return PaginatedCollection.new if result.empty?
292
+
293
+ Sunspot::Util::ContextBoundDelegate.instance_eval_with_context(self, &@block)
294
+ # @operation_context.last[:result] = @operation_context.last[:result].uniq
295
+ self
296
+ end
297
+
298
+ def current_operation
299
+ @operation_context[@current_context_index][:operation]
300
+ end
301
+
302
+ def result_for_current_context
303
+ @operation_context[@current_context_index][:result]
304
+ end
305
+
306
+ def temp_result_for_current_context
307
+ @operation_context[@current_context_index][:temp_result]
308
+ end
309
+
310
+ def operation_context_result(after_results)
311
+ previous_result = result_for_current_context
312
+ # parent_result = @operation_context[@current_context_index -1][:result]
313
+ temp_result = @operation_context[@current_context_index][:temp_result]
314
+ if current_operation == "any"
315
+ @operation_context[@current_context_index][:result] = previous_result.concat(after_results).uniq
316
+ if temp_result
317
+ @operation_context[@current_context_index][:temp_result] = temp_result.concat(after_results)
318
+ end
319
+ else
320
+ @operation_context[@current_context_index][:result] = (previous_result & after_results).uniq
321
+ end
322
+ end
323
+
324
+ def skip_no_value(attribute, value)
325
+ if value == "no_value" && attribute_is_about_range?(attribute)
326
+ matches = result_for_current_context.select {|x| x.has_attribute?(attribute)}
327
+ operation_context_result(matches)
328
+ return self
329
+ end
330
+ end
331
+
332
+ def has_attribute_and_not_nil(x)
333
+ x.read_attribute(@range_search_field) &&
334
+ !x.read_attribute(@range_search_field).nil?
335
+ end
336
+
337
+ def string_text_fields(type)
338
+ return @textsearch_priorities.keys unless @textsearch_priorities.keys.empty?
339
+ type.columns.collect { |c| {"#{c.type}":"#{c.name}"} }
340
+ .map{|hash| hash.select{|k,v| [:string, :text].include? k} }.uniq
341
+ .map{|x| x.values}.flatten
342
+ end
343
+
344
+ def attribute_is_about_range?(attribute)
345
+ matched = nil
346
+ Sunspot.session.range_fields.each do |x|
347
+ if attribute.to_s.include? x
348
+ matched = true
349
+ @range_search_field = attribute
350
+ break
351
+ end
352
+ end
353
+ matched
354
+ end
355
+
356
+ def sorted_temp_result
357
+ return final_results unless @order_direction
358
+ asc = final_results.sort_by{|x| x[@order_key]}
359
+ return asc if @order_direction.to_s.downcase.include?("asc")
360
+ asc.reverse
361
+ end
362
+ end
363
+ end
@@ -0,0 +1,3 @@
1
+ module StubSolr
2
+ VERSION = "0.0.4"
3
+ end
data/lib/stub_solr.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'kaminari'
2
+ module Kaminari::PageScopeMethods
3
+ alias_method :previous_page, :prev_page
4
+ end
5
+ require 'sunspot'
6
+ require 'sunspot_rails'
7
+ require 'rails'
8
+ require "stub_solr/version"
9
+ require File.expand_path('stub_solr/sunspot_rails_stub_session_proxy', File.dirname(__FILE__))
data/stub_solr.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+
3
+ require File.expand_path('../lib/stub_solr/version', __FILE__)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = 'stub_solr'
7
+ gem.version = StubSolr::VERSION
8
+ gem.authors = ['Jaigouk Kim']
9
+ gem.email = ['ping@jaigouk.kim']
10
+
11
+ gem.summary = %q{stub sunspot to test }
12
+ gem.description = %q{overrided StubSessionProxy with AR queries to mimic sunspot }
13
+ gem.homepage = 'https://github.com/jaigouk/stub_solr'
14
+ gem.license = 'MIT'
15
+
16
+ gem.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ gem.bindir = 'bin'
18
+ gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ gem.require_paths = ['lib']
20
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
21
+
22
+ gem.add_dependency 'kaminari', '~> 0.17.0'
23
+ gem.add_dependency 'sunspot', '~> 2.2.6'
24
+ gem.add_dependency 'sunspot_solr', '~> 2.2.6'
25
+ gem.add_dependency 'sunspot_rails', '~> 2.2.6'
26
+ gem.add_dependency 'rails', '>= 4'
27
+
28
+ # gem.add_development_dependency 'simplecov', '~> 0.12.0'
29
+ gem.add_development_dependency 'bundler', '~> 1.12'
30
+ gem.add_development_dependency 'minitest', '~> 5.0'
31
+ gem.add_development_dependency 'minitest-reporters', '~> 1.1.11'
32
+ end
metadata ADDED
@@ -0,0 +1,171 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stub_solr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Jaigouk Kim
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: kaminari
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.17.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.17.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: sunspot
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.2.6
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.2.6
41
+ - !ruby/object:Gem::Dependency
42
+ name: sunspot_solr
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 2.2.6
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 2.2.6
55
+ - !ruby/object:Gem::Dependency
56
+ name: sunspot_rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 2.2.6
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 2.2.6
69
+ - !ruby/object:Gem::Dependency
70
+ name: rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '4'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.12'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.12'
97
+ - !ruby/object:Gem::Dependency
98
+ name: minitest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '5.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '5.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest-reporters
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.1.11
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.1.11
125
+ description: 'overrided StubSessionProxy with AR queries to mimic sunspot '
126
+ email:
127
+ - ping@jaigouk.kim
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rubocop.yml"
134
+ - ".travis.yml"
135
+ - Gemfile
136
+ - LICENSE.txt
137
+ - README.md
138
+ - Rakefile
139
+ - dev_tasks/release.rake
140
+ - dev_tasks/spec.rake
141
+ - gemfiles/.bundle/config
142
+ - gemfiles/rails-5.0.0.1
143
+ - lib/stub_solr.rb
144
+ - lib/stub_solr/sunspot_rails_stub_session_proxy.rb
145
+ - lib/stub_solr/version.rb
146
+ - stub_solr.gemspec
147
+ homepage: https://github.com/jaigouk/stub_solr
148
+ licenses:
149
+ - MIT
150
+ metadata: {}
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ required_rubygems_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ requirements: []
166
+ rubyforge_project:
167
+ rubygems_version: 2.5.1
168
+ signing_key:
169
+ specification_version: 4
170
+ summary: stub sunspot to test
171
+ test_files: []