activesearch 0.0.5 → 0.0.6

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.
@@ -0,0 +1,29 @@
1
+ module ActiveSearch
2
+ module Base
3
+ def search_by(*params)
4
+ @search_parameters = params
5
+ self.after_save :reindex, self.search_conditions
6
+ self.after_destroy :deindex, self.search_conditions
7
+ end
8
+
9
+ def search_options
10
+ search_parameters.last.is_a?(Hash) ? search_parameters.last : search_parameters
11
+ end
12
+
13
+ def search_conditions
14
+ {}.tap do |conditions|
15
+ conditions.merge!(if: search_options[:if]) if search_options.has_key?(:if)
16
+ conditions.merge!(unless: search_options[:unless]) if search_options.has_key?(:unless)
17
+ end
18
+ end
19
+
20
+ def search_fields
21
+ search_parameters.last.is_a?(Hash) ? search_parameters[0...-1] : search_parameters
22
+ end
23
+
24
+ protected
25
+ def search_parameters
26
+ @search_parameters.first.respond_to?(:call) ? @search_parameters.first.call : @search_parameters
27
+ end
28
+ end
29
+ end
@@ -1,4 +1,6 @@
1
+ require 'tire'
1
2
  require "active_support/core_ext"
3
+ require "activesearch/base"
2
4
  require "activesearch/elastic_search/proxy"
3
5
 
4
6
  module ActiveSearch
@@ -9,34 +11,55 @@ module ActiveSearch
9
11
 
10
12
  module ElasticSearch
11
13
  def self.included(base)
14
+ base.extend Base
12
15
  base.extend ClassMethods
13
16
  end
14
- end
15
-
16
- module ClassMethods
17
- def search_by(*fields)
18
- include Tire::Model::Search
19
-
20
- options = fields.last.is_a?(Hash) ? fields.pop : {}
21
- conditions = { if: options.delete(:if), unless: options.delete(:unless) }
17
+
18
+ def to_indexable
19
+ self.attributes.merge(_type: self.elastic_type)
20
+ end
21
+
22
+ protected
23
+ def elastic_type
24
+ @elastic_type ||= self.type.gsub!(/(.)([A-Z])/,'\1_\2').downcase
25
+ end
26
+
27
+ def elastic_index(&block)
28
+ Tire.index(elastic_type, &block)
29
+ end
30
+
31
+ def reindex
32
+ doc = self.to_indexable
33
+ properties = self.class.elastic_properties
22
34
 
23
- mapping do
24
- indexes :type
25
- indexes :id, as: :original_id
26
- fields.each { |f| indexes f }
27
- (Array(options[:store]) - fields).each { |f| indexes f, :index => :no }
35
+ elastic_index do
36
+ unless exists?
37
+ create({ mappings: { doc[:_type] => {properties: properties}}})
38
+ end
39
+ store doc
28
40
  end
29
-
30
- # Partially taken from Tire::Model::Callbacks
31
-
32
- if respond_to?(:after_save) && respond_to?(:after_destroy)
33
- after_save lambda { tire.update_index }, conditions
34
- after_destroy lambda { tire.update_index }, conditions
41
+ end
42
+
43
+ def deindex
44
+ doc = self.to_indexable
45
+ elastic_index do
46
+ remove doc
35
47
  end
36
-
37
- if respond_to?(:before_destroy) && !instance_methods.map(&:to_sym).include?(:destroyed?)
38
- before_destroy { @destroyed = true }
39
- class_eval { def destroyed?; !!@destroyed; end; }
48
+ end
49
+
50
+ module ClassMethods
51
+ def elastic_properties
52
+ props = {}
53
+
54
+ search_fields.each_with_object(props) do |field,hash|
55
+ hash[field] = {type: 'string'}
56
+ end
57
+
58
+ (Array(search_options[:store]) - search_fields).each_with_object(props) do |field,hash|
59
+ hash[field] = {type: 'string', :index => :no}
60
+ end
61
+
62
+ props
40
63
  end
41
64
  end
42
65
  end
@@ -1,3 +1,4 @@
1
+ require 'activesearch/base'
1
2
  require 'activesearch/mongoid/model'
2
3
 
3
4
  module ActiveSearch
@@ -10,7 +11,7 @@ module ActiveSearch
10
11
 
11
12
  module Mongoid
12
13
  def self.included(base)
13
- base.extend ClassMethods
14
+ base.extend Base
14
15
  end
15
16
 
16
17
  protected
@@ -21,23 +22,5 @@ module ActiveSearch
21
22
  def deindex
22
23
  ActiveSearch::Mongoid::Model.deindex(self)
23
24
  end
24
-
25
- module ClassMethods
26
- def search_options
27
- @search_options
28
- end
29
-
30
- def search_fields
31
- @search_fields
32
- end
33
-
34
- def search_by(*fields)
35
- @search_options = fields.pop if fields.last.is_a?(Hash)
36
- conditions = {if: @search_options.delete(:if), unless: @search_options.delete(:unless)}
37
- @search_fields = fields
38
- self.after_save :reindex, conditions
39
- self.after_destroy :deindex, conditions
40
- end
41
- end
42
25
  end
43
26
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveSearch
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -1,16 +1,13 @@
1
- require 'tire'
2
1
  require 'activesearch/elastic_search'
3
2
 
4
- Tire.configure { logger File.join(File.dirname(__FILE__), '..', '..', 'log', 'elasticsearch.log'), :level => 'debug' }
5
-
6
3
  module ElasticSearchRefresh
7
4
 
8
5
  def save
9
- super.tap { tire.index.refresh }
6
+ super.tap { Tire.index('_all') { refresh }}
10
7
  end
11
8
 
12
9
  def destroy
13
- super.tap { tire.index.refresh }
10
+ super.tap { Tire.index('_all') { refresh }}
14
11
  end
15
12
  end
16
13
 
@@ -19,7 +19,7 @@ class AnotherMongoidModel
19
19
  include ActiveSearch::Mongoid
20
20
 
21
21
  field :title, type: String
22
- search_by :title, :text, store: [:title]
22
+ search_by lambda { [:title, :text, store: [:title]] } # Simulating dynamic options
23
23
  end
24
24
 
25
25
 
@@ -28,5 +28,6 @@ class LocalizedMongoidModel
28
28
  include ActiveSearch::Mongoid
29
29
 
30
30
  field :title, localize: true
31
- search_by :title, store: [:title]
31
+ field :special_type
32
+ search_by :title, store: [:title], type: :special_type
32
33
  end
data/spec/spec_helper.rb CHANGED
@@ -9,6 +9,7 @@ class ActiveMimic
9
9
  include ActiveAttr::MassAssignment
10
10
 
11
11
  attribute :id
12
+ attribute :type
12
13
 
13
14
  define_model_callbacks :save
14
15
  define_model_callbacks :destroy
@@ -17,7 +18,12 @@ class ActiveMimic
17
18
  new(attrs).tap(&:save)
18
19
  end
19
20
 
21
+ def type
22
+ self.class.to_s
23
+ end
24
+
20
25
  def save
26
+ self.id = self.class.next_id
21
27
  run_callbacks :save do
22
28
  true
23
29
  end
@@ -28,4 +34,9 @@ class ActiveMimic
28
34
  true
29
35
  end
30
36
  end
37
+
38
+ def self.next_id
39
+ @next_id ||= 0
40
+ @next_id += 1
41
+ end
31
42
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activesearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-05 00:00:00.000000000 Z
12
+ date: 2012-11-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -121,6 +121,7 @@ files:
121
121
  - Rakefile
122
122
  - activesearch.gemspec
123
123
  - lib/activesearch.rb
124
+ - lib/activesearch/base.rb
124
125
  - lib/activesearch/elastic_search.rb
125
126
  - lib/activesearch/elastic_search/proxy.rb
126
127
  - lib/activesearch/mongoid.rb