elastic_searchable 0.1.3 → 0.1.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.4
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{elastic_searchable}
8
- s.version = "0.1.3"
8
+ s.version = "0.1.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ryan Sonnek"]
@@ -12,8 +12,6 @@ module ElasticSearchable
12
12
  end
13
13
 
14
14
  module ClassMethods
15
- attr_accessor :index_name
16
- attr_accessor :elastic_search_type
17
15
  attr_accessor :elastic_options
18
16
 
19
17
  # Valid options:
@@ -22,13 +20,11 @@ module ElasticSearchable
22
20
  # :unless
23
21
  def elastic_searchable(options = {})
24
22
  options.symbolize_keys!
25
-
23
+ options[:index] ||= self.table_name
24
+ options[:type] ||= self.table_name
25
+ options[:index_options] ||= {}
26
+ options[:mapping] ||= false
26
27
  self.elastic_options = options
27
- @index_name = options[:index_name] || self.name.underscore.gsub(/\//,'-')
28
- @elastic_search_type = options[:elastic_search_type] || self.name.underscore.singularize.gsub(/\//,'-')
29
-
30
- @index_options = options[:index_options] || {}
31
- @mapping = options[:mapping] || false
32
28
 
33
29
  extend ElasticSearchable::ActiveRecord::Index
34
30
  extend ElasticSearchable::Queries
@@ -47,12 +43,11 @@ module ElasticSearchable
47
43
  def indexed_json_document
48
44
  self.to_json
49
45
  end
50
- def index_in_elastic_search(options = {})
51
- options[:id] ||= self.id.to_s
46
+ def index_in_elastic_search(lifecycle = nil)
52
47
  document = self.indexed_json_document
53
- ElasticSearchable.searcher.index document, self.class.elastic_search_options(options)
48
+ ElasticSearchable.searcher.index document, self.class.index_options.merge(:id => self.id.to_s)
54
49
 
55
- self.run_callbacks("after_index_on_#{options[:lifecycle]}".to_sym) if options[:lifecycle]
50
+ self.run_callbacks("after_index_on_#{lifecycle}".to_sym) if lifecycle
56
51
  self.run_callbacks(:after_index)
57
52
  end
58
53
  end
@@ -20,10 +20,10 @@ module ElasticSearchable
20
20
  end
21
21
 
22
22
  def update_index_on_create
23
- index_in_elastic_search :lifecycle => :create
23
+ index_in_elastic_search :create
24
24
  end
25
25
  def update_index_on_update
26
- index_in_elastic_search :lifecycle => :update
26
+ index_in_elastic_search :update
27
27
  end
28
28
  end
29
29
  end
@@ -3,15 +3,16 @@ module ElasticSearchable
3
3
  module Index
4
4
  def create_index
5
5
  self.delete_index
6
- ElasticSearchable.searcher.create_index(index_name, @index_options)
7
- ElasticSearchable.searcher.update_mapping(@mapping, self.elastic_search_options) if @mapping
6
+ ElasticSearchable.searcher.create_index index_name, self.elastic_options[:index_options]
7
+ if mapping = self.elastic_options[:mapping]
8
+ ElasticSearchable.searcher.update_mapping mapping, self.index_options
9
+ end
8
10
 
9
11
  self.find_each do |record|
10
12
  record.run_callbacks :after_commit_on_update
11
13
  end
12
14
  self.refresh_index
13
15
  end
14
-
15
16
  # explicitly refresh the index, making all operations performed since the last refresh
16
17
  # available for search
17
18
  #
@@ -35,8 +36,15 @@ module ElasticSearchable
35
36
  end
36
37
 
37
38
  #delete one record from the index
38
- def delete_id_from_index(id, options = {})
39
- ElasticSearchable.searcher.delete id.to_s, elastic_search_options(options)
39
+ def delete_id_from_index(id)
40
+ ElasticSearchable.searcher.delete id.to_s, index_options
41
+ end
42
+
43
+ def index_name
44
+ self.elastic_options[:index]
45
+ end
46
+ def index_options
47
+ self.elastic_options.slice :index, :type
40
48
  end
41
49
  end
42
50
  end
@@ -13,7 +13,7 @@ module ElasticSearchable
13
13
  if query.kind_of?(Hash)
14
14
  query = {:query => query}
15
15
  end
16
- hits = ElasticSearchable.searcher.search query, elastic_search_options(options)
16
+ hits = ElasticSearchable.searcher.search query, index_options.merge(options)
17
17
 
18
18
  results = WillPaginate::Collection.new(hits.current_page, hits.per_page, hits.total_entries)
19
19
  results.replace self.find(hits.collect(&:_id))
@@ -25,7 +25,7 @@ module ElasticSearchable
25
25
  if query.kind_of?(Hash)
26
26
  query = {:query => query}
27
27
  end
28
- ElasticSearchable.searcher.count query, elastic_search_options(options)
28
+ ElasticSearchable.searcher.count query, index_options.merge(options)
29
29
  end
30
30
 
31
31
  def facets(fields_list, options = {})
@@ -43,7 +43,7 @@ module ElasticSearchable
43
43
  options[:facets][field] = {:terms => {:field => field, :size => size}}
44
44
  end
45
45
 
46
- hits = ElasticSearchable.searcher.search options, elastic_search_options
46
+ hits = ElasticSearchable.searcher.search options, index_options.merge(options)
47
47
  out = {}
48
48
 
49
49
  fields_list.each do |field|
@@ -55,9 +55,5 @@ module ElasticSearchable
55
55
 
56
56
  out
57
57
  end
58
-
59
- def elastic_search_options(options = {})
60
- options.merge(:index => self.index_name, :type => self.elastic_search_type)
61
- end
62
58
  end
63
59
  end
@@ -1,5 +1,24 @@
1
1
  require File.join(File.dirname(__FILE__), 'helper')
2
2
 
3
+ module ElasticSearch
4
+ class Client
5
+ def index_mapping(*args)
6
+ options = args.last.is_a?(Hash) ? args.pop : {}
7
+ indices = args.empty? ? [(default_index || :all)] : args.flatten
8
+ indices.collect! { |i| [:all].include?(i) ? "_#{i}" : i }
9
+ execute(:index_mapping, indices, options)
10
+ end
11
+ end
12
+ module Transport
13
+ class HTTP
14
+ def index_mapping(index_list, options={})
15
+ standard_request(:get, {:index => index_list, :op => "_mapping"})
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+
3
22
  class TestElasticSearchable < Test::Unit::TestCase
4
23
  ActiveRecord::Schema.define(:version => 1) do
5
24
  create_table :posts, :force => true do |t|
@@ -11,6 +30,9 @@ class TestElasticSearchable < Test::Unit::TestCase
11
30
  t.column :title, :string
12
31
  t.column :body, :string
13
32
  end
33
+ create_table :users, :force => true do |t|
34
+ t.column :name, :string
35
+ end
14
36
  end
15
37
 
16
38
  class Post < ActiveRecord::Base
@@ -24,8 +46,11 @@ class TestElasticSearchable < Test::Unit::TestCase
24
46
  should 'respond to :search' do
25
47
  assert @clazz.respond_to?(:search)
26
48
  end
49
+ should 'define elastic_options' do
50
+ assert @clazz.elastic_options
51
+ end
27
52
  should 'define index_name' do
28
- assert_equal 'test_elastic_searchable-post', @clazz.index_name
53
+ assert_equal 'posts', @clazz.index_name
29
54
  end
30
55
  end
31
56
 
@@ -83,4 +108,28 @@ class TestElasticSearchable < Test::Unit::TestCase
83
108
  end
84
109
  end
85
110
  end
111
+
112
+ class User < ActiveRecord::Base
113
+ elastic_searchable :mapping => {:properties => {:name => {:type => :string, :index => :not_analyzed}}}
114
+ end
115
+ context 'activerecord class with :mapping=>{}' do
116
+ context 'creating index' do
117
+ setup do
118
+ User.create_index
119
+ @status = ElasticSearchable.searcher.index_mapping User.index_name
120
+ end
121
+ should 'have set mapping' do
122
+ expected = {
123
+ "users"=> {
124
+ "users"=> {
125
+ "properties"=> {
126
+ "name"=> {"type"=>"string", "index"=>"not_analyzed"}
127
+ }
128
+ }
129
+ }
130
+ }
131
+ assert_equal expected, @status
132
+ end
133
+ end
134
+ end
86
135
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastic_searchable
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 3
10
- version: 0.1.3
9
+ - 4
10
+ version: 0.1.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ryan Sonnek