activesearch 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Activesearch
1
+ # ActiveSearch
2
2
 
3
3
  This gem allows any class to be indexed by the chosen fulltext search engine.
4
4
 
@@ -22,7 +22,8 @@ Or install it yourself as:
22
22
 
23
23
  This is not a fulltext search engine, but it's a good solution for those users that don't have access to anything else.
24
24
  It works by storing keywords taken from the specified fields and storing them in an Array field, which would be indexed.
25
- fts() method will return a Mongod::Criteria, so you can chain it with further scopes.
25
+ search() method will return a Mongod::Criteria, so you can chain it with further scopes, like pagination.
26
+ You won't get original documents though.
26
27
 
27
28
  ## Usage
28
29
 
@@ -30,10 +31,11 @@ fts() method will return a Mongod::Criteria, so you can chain it with further sc
30
31
  # [...] field definitions if needed
31
32
  include ActiveSearch::Engine # "Engine" being your chosen engine ie. "Mongoid"
32
33
 
33
- search_on :title, :body
34
+ search_on :title, :body, store: [:title]
34
35
  end
35
36
 
36
- SomeModel.fts("some words") # "fts" for full text search
37
+ # Access the stored fields so you don't need to fetch the real document
38
+ SomeModel.search("some words").first.stored["title"]
37
39
 
38
40
 
39
41
  ## Contributing
data/activesearch.gemspec CHANGED
@@ -5,7 +5,7 @@ require 'activesearch/version'
5
5
 
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = "activesearch"
8
- gem.version = Activesearch::VERSION
8
+ gem.version = ActiveSearch::VERSION
9
9
  gem.authors = ["Rodrigo Alvarez"]
10
10
  gem.email = ["papipo@gmail.com"]
11
11
  gem.description = %q{ORM agnostic full text search}
data/lib/activesearch.rb CHANGED
@@ -1,4 +1 @@
1
1
  require "activesearch/version"
2
-
3
- module Activesearch
4
- end
@@ -1,4 +1,12 @@
1
+ require 'activesearch/mongoid/model'
2
+
1
3
  module ActiveSearch
4
+
5
+ # TODO: Wrap this so all engines behave consistently
6
+ def self.search(text)
7
+ Mongoid::Model.all_in(keywords: text.split)
8
+ end
9
+
2
10
  module Mongoid
3
11
  def self.included(base)
4
12
  base.extend ClassMethods
@@ -6,20 +14,15 @@ module ActiveSearch
6
14
 
7
15
  module ClassMethods
8
16
  def search_on(*fields)
9
- field :_keywords, type: Array
10
- index :_keywords
11
-
12
- before_save do
13
- self._keywords = []
14
-
15
- fields.each do |f|
16
- self._keywords = self._keywords | self[f].downcase.split if self[f]
17
+ # TODO: Use inheritable class variables, so ActiveSearch::Mongoid::Model can get fields and options from there
18
+ self.class_eval <<-EOV
19
+ after_save do
20
+ fields = #{fields}
21
+ options = fields.pop if fields.last.is_a?(Hash)
22
+ return unless fields.any? { |f| self.send("\#{f}_changed?") }
23
+ ActiveSearch::Mongoid::Model.reindex(self, fields, options)
17
24
  end
18
- end
19
- end
20
-
21
- def fts(query)
22
- all_in(_keywords: query.split)
25
+ EOV
23
26
  end
24
27
  end
25
28
  end
@@ -0,0 +1,36 @@
1
+ module ActiveSearch
2
+ module Mongoid
3
+ class Model
4
+ include ::Mongoid::Document
5
+
6
+ field :type, type: String
7
+ field :original_id, type: BSON::ObjectId
8
+ field :keywords
9
+ field :stored, type: Hash, default: {}
10
+
11
+ index :keywords
12
+ index [:type, :original_id], unique: true
13
+
14
+ def store_fields(original, fields, options)
15
+ if options && options[:store]
16
+ (fields & options[:store]).each do |f|
17
+ self.stored[f] = original[f] if original.send("#{f}_changed?")
18
+ end
19
+ end
20
+ end
21
+
22
+ def refresh_keywords(original, fields)
23
+ self.keywords = fields.inject([]) do |memo,f|
24
+ original[f] ? memo | original[f].downcase.split : memo
25
+ end
26
+ end
27
+
28
+ def self.reindex(original, fields, options)
29
+ doc = self.find_or_initialize_by(type: original.class.to_s, original_id: original.id)
30
+ doc.store_fields(original, fields, options)
31
+ doc.refresh_keywords(original, fields)
32
+ doc.save
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
- module Activesearch
2
- VERSION = "0.0.1"
1
+ module ActiveSearch
2
+ VERSION = "0.0.2"
3
3
  end
data/spec/mongoid_spec.rb CHANGED
@@ -10,26 +10,40 @@ class MongoidModel
10
10
  field :title, type: String
11
11
  field :text, type: String
12
12
  field :junk, type: String
13
- search_on :title, :text
13
+ search_on :title, :text, store: [:title]
14
+ end
15
+
16
+ class AnotherMongoidModel
17
+ include Mongoid::Document
18
+ include ActiveSearch::Mongoid
19
+
20
+ field :title, type: String
21
+ search_on :title, :text, store: [:title]
14
22
  end
15
23
 
16
24
  describe ActiveSearch::Mongoid do
17
25
  before do
18
- MongoidModel.delete_all
26
+ Mongoid.master.collections.select { |c| c.name != 'system.indexes' }.each(&:drop)
27
+
19
28
  @findable = MongoidModel.create!(title: "Findable")
20
29
  @quite_findable = MongoidModel.create!(title: "Some title", text: "Findable text")
21
- MongoidModel.create!(title: "Junk", junk: "Findable junk")
30
+ @another = AnotherMongoidModel.create!(title: "Another findable title")
31
+ @junk = MongoidModel.create!(title: "Junk", junk: "Findable junk")
22
32
  end
23
33
 
24
34
  it "should find the expected documents" do
25
- MongoidModel.fts("findable").to_a.should == [@findable, @quite_findable]
35
+ ActiveSearch.search("findable").map { |r| r.stored["title"] }.should == ["Findable", "Some title", "Another findable title"]
26
36
  end
27
37
 
28
38
  it "should store the proper keywords" do
29
- @quite_findable._keywords.should == %w{some title findable text}
39
+ ActiveSearch::Mongoid::Model.where(type: "MongoidModel", original_id: @quite_findable.id).first.keywords.should == %w{some title findable text}
30
40
  end
31
41
 
32
42
  it "should be chainable" do
33
- MongoidModel.fts("findable").should respond_to(:where)
43
+ ActiveSearch.search("findable").should respond_to(:where)
44
+ end
45
+
46
+ it "should store the specified fields" do
47
+ ActiveSearch::Mongoid::Model.where(type: "MongoidModel", original_id: @findable.id).first.stored.should == {"title" => "Findable"}
34
48
  end
35
49
  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.1
4
+ version: 0.0.2
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-10-25 00:00:00.000000000 Z
12
+ date: 2012-10-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -74,6 +74,7 @@ files:
74
74
  - activesearch.gemspec
75
75
  - lib/activesearch.rb
76
76
  - lib/activesearch/mongoid.rb
77
+ - lib/activesearch/mongoid/model.rb
77
78
  - lib/activesearch/version.rb
78
79
  - spec/config/mongoid.yml
79
80
  - spec/mongoid_spec.rb