dilute 0.0.2 → 0.0.3
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/lib/dilute/modelize.rb +4 -2
- data/lib/dilute/query.rb +45 -0
- data/lib/dilute/version.rb +1 -1
- data/spec/modelize_integration_spec.rb +33 -11
- data/spec/query_spec.rb +20 -0
- data/spec/spec_helper.rb +5 -1
- metadata +11 -3
data/lib/dilute/modelize.rb
CHANGED
@@ -20,8 +20,10 @@ module Dilute::Modelize
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def all(query = {}, page_size = 10)
|
23
|
-
|
24
|
-
search_results.
|
23
|
+
|
24
|
+
# search_results = type.search(size: page_size, query: {match_all: {}})
|
25
|
+
# search_results.raw["hits"]["hits"].collect {|r| new(r) }
|
26
|
+
Dilute::Query.new(self)
|
25
27
|
end
|
26
28
|
|
27
29
|
def define_type(options = {}, &blk)
|
data/lib/dilute/query.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
class Dilute::Query
|
2
|
+
attr_reader :for_class, :options, :chained, :results, :from_elastic_search
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(for_class, options = {}, chained = true)
|
6
|
+
@for_class, @options, @chained = for_class, options, chained
|
7
|
+
end
|
8
|
+
|
9
|
+
def match(q)
|
10
|
+
merge_or_chain(:match, q)
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_query
|
14
|
+
query = options.reject {|k,v| v.nil? || v.empty? }
|
15
|
+
query[:match_all] ||= {} unless query[:match]
|
16
|
+
query
|
17
|
+
end
|
18
|
+
|
19
|
+
def execute!
|
20
|
+
@results ||= begin
|
21
|
+
search_results = for_class.type.search(size: 25, query: to_query)
|
22
|
+
@from_elastic_search = search_results
|
23
|
+
search_results.raw["hits"]["hits"].collect {|r| for_class.new(r) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_a
|
28
|
+
execute!
|
29
|
+
results
|
30
|
+
end
|
31
|
+
|
32
|
+
def each(*args, &block)
|
33
|
+
return enum_for(__callee__) unless block_given?
|
34
|
+
to_a.each(*args, &block)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def merge_or_chain(key, to_merge)
|
40
|
+
new_options = chained ? options.dup : options
|
41
|
+
new_options[key] ||= {}
|
42
|
+
new_options[key].merge!(to_merge)
|
43
|
+
chained ? self.class.new(for_class, new_options) : new_options[key]
|
44
|
+
end
|
45
|
+
end
|
data/lib/dilute/version.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
require_relative "spec_helper"
|
2
2
|
require "pry"
|
3
|
+
require 'pp'
|
3
4
|
|
4
5
|
describe Dilute::Modelize do
|
5
6
|
let(:dilute_class) do
|
6
7
|
Class.new do
|
7
8
|
include Dilute::Modelize
|
8
9
|
|
9
|
-
define_type(
|
10
|
+
define_type(type_name: :abstract) do
|
10
11
|
attribute(:data).not_indexed
|
11
12
|
attribute(:header).not_indexed
|
12
|
-
attribute(:keys).index_analyzer("keyword")
|
13
|
+
attribute(:keys).not_indexed# .index_analyzer("keyword")
|
13
14
|
attribute(:created_at, :date)
|
14
15
|
end
|
15
16
|
end
|
@@ -33,15 +34,38 @@ describe Dilute::Modelize do
|
|
33
34
|
expect(dilute_class.find(saved.id).data).to eq(test_data)
|
34
35
|
end
|
35
36
|
|
36
|
-
it "should retreive many saved documents" do
|
37
|
-
destroy_test_index!
|
38
|
-
10.times { dilute_class.new({data: test_data}).save }
|
39
|
-
sleep 1
|
40
|
-
expect(dilute_class.all({}, 5)).to have(5).items
|
41
|
-
end
|
42
|
-
|
43
37
|
it "I have no idea what I'm doing." do
|
44
38
|
true
|
39
|
+
# That's why you see the sleep 1s and such.
|
40
|
+
end
|
41
|
+
|
42
|
+
context "searching" do
|
43
|
+
before { destroy_test_index! }
|
44
|
+
it "should find docs" do
|
45
|
+
destroy_test_index!
|
46
|
+
saved
|
47
|
+
sleep 1
|
48
|
+
all = dilute_class.all
|
49
|
+
expect(all.to_a).to have(1).item
|
50
|
+
expect(all.first.data).to eq(test_data)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should find docs matching pattern" do
|
54
|
+
dilute_class.new({keys: %w(taga tagb tagc)}).save
|
55
|
+
dilute_class.new({keys: %w(tagb tagc)}).save
|
56
|
+
sleep 1
|
57
|
+
search = dilute_class.all.match(keys: "taga")
|
58
|
+
expect(search.to_a).to have(1).item
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should find docs matching very short word" do
|
62
|
+
dilute_class.new({keys: %w(a)}).save
|
63
|
+
dilute_class.new({keys: %w(b)}).save
|
64
|
+
sleep 1
|
65
|
+
search = dilute_class.all.match(keys: "a")
|
66
|
+
expect(search.to_a).to have(1).item
|
67
|
+
end
|
68
|
+
|
45
69
|
end
|
46
70
|
|
47
71
|
context "infering the index name" do
|
@@ -63,8 +87,6 @@ describe Dilute::Modelize do
|
|
63
87
|
expect(new_diluted.attributes["_index"]).to eq "default_dilute_index_name"
|
64
88
|
expect(new_diluted.attributes["_type"]).to eq "test_name_for_dilutes"
|
65
89
|
end
|
66
|
-
|
67
|
-
|
68
90
|
end
|
69
91
|
|
70
92
|
end
|
data/spec/query_spec.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative "spec_helper"
|
2
|
+
|
3
|
+
describe Dilute::Query do
|
4
|
+
|
5
|
+
let(:model_class) { Class.new }
|
6
|
+
let(:query) { Dilute::Query.new(model_class) }
|
7
|
+
|
8
|
+
it "should create new" do
|
9
|
+
expect(query).to be_kind_of Dilute::Query
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should chain match queries" do
|
13
|
+
expect(query.match({foo: "bar"})).to be_kind_of Dilute::Query
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should have updated options in chained query" do
|
17
|
+
expect(query.match({foo: "bar"}).options[:match]).to eq({foo: "bar"})
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -22,5 +22,9 @@ def destroy_test_index!
|
|
22
22
|
require "stretcher"
|
23
23
|
server = Stretcher::Server.new("http://localhost:9200", log_level: :info)
|
24
24
|
index = server.index("default_dilute_index_name")
|
25
|
-
|
25
|
+
begin
|
26
|
+
index.delete
|
27
|
+
rescue Stretcher::RequestError::NotFound
|
28
|
+
# Index didn't exist to begin with.
|
29
|
+
end
|
26
30
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dilute
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
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: 2013-06-
|
12
|
+
date: 2013-06-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: stretcher
|
@@ -142,9 +142,11 @@ files:
|
|
142
142
|
- lib/dilute.rb
|
143
143
|
- lib/dilute/attribute.rb
|
144
144
|
- lib/dilute/modelize.rb
|
145
|
+
- lib/dilute/query.rb
|
145
146
|
- lib/dilute/type.rb
|
146
147
|
- lib/dilute/version.rb
|
147
148
|
- spec/modelize_integration_spec.rb
|
149
|
+
- spec/query_spec.rb
|
148
150
|
- spec/spec_helper.rb
|
149
151
|
homepage: ''
|
150
152
|
licenses:
|
@@ -159,12 +161,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
161
|
- - ! '>='
|
160
162
|
- !ruby/object:Gem::Version
|
161
163
|
version: '0'
|
164
|
+
segments:
|
165
|
+
- 0
|
166
|
+
hash: 3890611216473297716
|
162
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
168
|
none: false
|
164
169
|
requirements:
|
165
170
|
- - ! '>='
|
166
171
|
- !ruby/object:Gem::Version
|
167
172
|
version: '0'
|
173
|
+
segments:
|
174
|
+
- 0
|
175
|
+
hash: 3890611216473297716
|
168
176
|
requirements: []
|
169
177
|
rubyforge_project:
|
170
178
|
rubygems_version: 1.8.23
|
@@ -173,5 +181,5 @@ specification_version: 3
|
|
173
181
|
summary: An ActiveRecord-ish thing for using ElasticSearch through Stretcher.
|
174
182
|
test_files:
|
175
183
|
- spec/modelize_integration_spec.rb
|
184
|
+
- spec/query_spec.rb
|
176
185
|
- spec/spec_helper.rb
|
177
|
-
has_rdoc:
|