CloudSesame 0.1.6 → 0.2.0
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 +4 -4
- data/Gemfile.lock +1 -1
- data/cloud_sesame.gemspec +1 -1
- data/lib/cloud_sesame/domain/base.rb +9 -0
- data/lib/cloud_sesame/query/ast/and.rb +1 -1
- data/lib/cloud_sesame/query/ast/block_chaining_relation.rb +30 -0
- data/lib/cloud_sesame/query/ast/field_array.rb +31 -0
- data/lib/cloud_sesame/query/ast/literal.rb +15 -9
- data/lib/cloud_sesame/query/ast/multi_expression_operator.rb +26 -8
- data/lib/cloud_sesame/query/ast/near.rb +5 -10
- data/lib/cloud_sesame/query/ast/not.rb +11 -1
- data/lib/cloud_sesame/query/ast/operator.rb +26 -0
- data/lib/cloud_sesame/query/ast/or.rb +1 -1
- data/lib/cloud_sesame/query/ast/phrase.rb +2 -6
- data/lib/cloud_sesame/query/ast/prefix.rb +2 -6
- data/lib/cloud_sesame/query/ast/range_value.rb +1 -1
- data/lib/cloud_sesame/query/ast/root.rb +7 -3
- data/lib/cloud_sesame/query/ast/single_expression_operator.rb +16 -7
- data/lib/cloud_sesame/query/ast/term.rb +2 -6
- data/lib/cloud_sesame/query/ast/value.rb +5 -5
- data/lib/cloud_sesame/query/builder.rb +18 -8
- data/lib/cloud_sesame/query/dsl/base.rb +6 -6
- data/lib/cloud_sesame/query/dsl/block_chaining_methods.rb +26 -0
- data/lib/cloud_sesame/query/dsl/block_methods.rb +41 -0
- data/lib/cloud_sesame/query/dsl/field_array_methods.rb +70 -0
- data/lib/cloud_sesame/query/dsl/field_methods.rb +25 -0
- data/lib/cloud_sesame/query/dsl/{filter_query.rb → filter_query_methods.rb} +3 -9
- data/lib/cloud_sesame/query/dsl/operator_methods.rb +53 -0
- data/lib/cloud_sesame/query/dsl/{page.rb → page_methods.rb} +12 -1
- data/lib/cloud_sesame/query/dsl/{query.rb → query_methods.rb} +1 -1
- data/lib/cloud_sesame/query/dsl/{return.rb → return_methods.rb} +1 -1
- data/lib/cloud_sesame/query/dsl/{scope.rb → scope_methods.rb} +3 -3
- data/lib/cloud_sesame/query/dsl/{sort.rb → sort_methods.rb} +1 -1
- data/lib/cloud_sesame/query/dsl/{value.rb → value_methods.rb} +1 -4
- data/lib/cloud_sesame/query/{ast/leaf.rb → error/invalid_syntax.rb} +2 -2
- data/lib/cloud_sesame/query/fuzziness.rb +54 -0
- data/lib/cloud_sesame/query/node/page.rb +6 -6
- data/lib/cloud_sesame/query/node/query.rb +14 -10
- data/lib/cloud_sesame/query/node/sort.rb +1 -1
- data/lib/cloud_sesame.rb +19 -16
- data/spec/cloud_sesame/query/dsl/base_spec.rb +2 -2
- data/spec/cloud_sesame/query/dsl/block_chaining_methods_spec.rb +73 -0
- data/spec/cloud_sesame/query/dsl/block_methods_spec.rb +117 -0
- data/spec/cloud_sesame/query/dsl/field_array_methods_spec.rb +69 -0
- data/spec/cloud_sesame/query/dsl/field_methods_spec.rb +54 -0
- data/spec/cloud_sesame/query/node/query_spec.rb +16 -9
- data/spec/cloud_sesame_spec.rb +79 -68
- metadata +26 -34
- data/lib/cloud_sesame/query/ast/compound_array.rb +0 -77
- data/lib/cloud_sesame/query/ast/multi_branch.rb +0 -27
- data/lib/cloud_sesame/query/ast/single_branch.rb +0 -27
- data/lib/cloud_sesame/query/dsl/and.rb +0 -19
- data/lib/cloud_sesame/query/dsl/boost.rb +0 -20
- data/lib/cloud_sesame/query/dsl/literal.rb +0 -72
- data/lib/cloud_sesame/query/dsl/or.rb +0 -19
- data/spec/cloud_sesame/query/ast/and_spec.rb +0 -13
- data/spec/cloud_sesame/query/ast/literal_spec.rb +0 -37
- data/spec/cloud_sesame/query/ast/multi_branch_spec.rb +0 -65
- data/spec/cloud_sesame/query/ast/multi_expression_operator_spec.rb +0 -26
- data/spec/cloud_sesame/query/ast/or_spec.rb +0 -13
- data/spec/cloud_sesame/query/ast/root_spec.rb +0 -43
- data/spec/cloud_sesame/query/ast/value_spec.rb +0 -40
- data/spec/cloud_sesame/query/dsl/filter_query_spec.rb +0 -108
- data/spec/cloud_sesame/query/node/request_spec.rb +0 -71
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module CloudSesame
|
4
|
+
module Query
|
5
|
+
module DSL
|
6
|
+
describe FieldMethods do
|
7
|
+
|
8
|
+
# Setup Test Class
|
9
|
+
class Product
|
10
|
+
include CloudSesame
|
11
|
+
define_cloudsearch {
|
12
|
+
field :name
|
13
|
+
field :tags
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
subject(:cloudsearch) { Product.cloudsearch }
|
18
|
+
|
19
|
+
after { subject.clear_request }
|
20
|
+
|
21
|
+
context 'when field is registered' do
|
22
|
+
it 'should create a literal node' do
|
23
|
+
expect(AST::Literal).to receive(:new).with(:name, "my name", {})
|
24
|
+
subject.name "my name"
|
25
|
+
end
|
26
|
+
it 'should belong to the dsl context' do
|
27
|
+
expect{ subject.name "name" }.to change{ subject.request.filter_query.root.children.size }.by(1)
|
28
|
+
end
|
29
|
+
it 'should return the dsl scope if called from the root' do
|
30
|
+
expect(subject.tags "men").to eq subject
|
31
|
+
end
|
32
|
+
it 'should return the field array if called from inside a block' do
|
33
|
+
array = nil
|
34
|
+
subject.and { array = tags("men") }
|
35
|
+
expect(array).to be_kind_of(AST::FieldArray)
|
36
|
+
expect(array).to include(AST::Literal)
|
37
|
+
end
|
38
|
+
it 'shoudl set the field array#field' do
|
39
|
+
array = nil
|
40
|
+
subject.and { array = tags("men") }
|
41
|
+
expect(array.field).to eq :tags
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when field is not registered' do
|
46
|
+
it 'should raise an error' do
|
47
|
+
expect{ subject.description("description") }.to raise_error NoMethodError
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -10,31 +10,38 @@ module CloudSesame
|
|
10
10
|
describe '#initialize' do
|
11
11
|
context 'when arguments passed in' do
|
12
12
|
let(:arguments) {{ query: "" }}
|
13
|
-
it 'should initalize an empty
|
14
|
-
expect(node.
|
13
|
+
it 'should initalize an empty string if query is empty' do
|
14
|
+
expect(node.query).to eq ""
|
15
15
|
end
|
16
|
-
it 'should accept query as args and initialize
|
16
|
+
it 'should accept query as args and initialize query' do
|
17
17
|
arguments[:query] = "hello world"
|
18
|
-
expect(node.
|
18
|
+
expect(node.query).to eq "hello world"
|
19
19
|
end
|
20
20
|
end
|
21
21
|
context 'when arguments not passed in' do
|
22
22
|
it 'should initialize an empty terms' do
|
23
|
-
expect(node.
|
23
|
+
expect(node.query).to eq nil
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
describe '#query' do
|
29
|
-
it 'should return
|
30
|
-
node.
|
29
|
+
it 'should return the query string' do
|
30
|
+
node.query = ["term1", "term2", "term3", "-term4"].join(' ')
|
31
31
|
expect(node.query).to eq "term1 term2 term3 -term4"
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
describe '#
|
35
|
+
describe '#compile' do
|
36
|
+
it 'should parse with fuzziness if fuzziness is defined' do
|
37
|
+
fuzziness = Fuzziness.new
|
38
|
+
node = Query.new(fuzziness: fuzziness)
|
39
|
+
node.query = ["term1", "term2", "term3", "-term4"].join(' ')
|
40
|
+
expect(fuzziness).to receive(:parse).with(node.query)
|
41
|
+
node.compile
|
42
|
+
end
|
36
43
|
it 'should return a serialized hash contains query string' do
|
37
|
-
node.
|
44
|
+
node.query = ["term1", "term2", "term3", "-term4"].join(' ')
|
38
45
|
expect(node.compile).to eq({ query: "term1 term2 term3 -term4" })
|
39
46
|
end
|
40
47
|
end
|
data/spec/cloud_sesame_spec.rb
CHANGED
@@ -2,74 +2,85 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe CloudSesame do
|
4
4
|
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
5
|
+
# AWS initializer
|
6
|
+
require 'yaml'
|
7
|
+
YAML.load_file('aws.yml').each do |key, value|
|
8
|
+
ENV["AWS_#{ key }"] = value
|
9
|
+
end
|
10
|
+
|
11
|
+
# Domain Initializer /config/initializers/cloudsearch.rb
|
12
|
+
require 'cloud_sesame'
|
13
|
+
|
14
|
+
CloudSesame::Domain::Client.configure do |config|
|
15
|
+
config.access_key = ENV['AWS_ACCESS_KEY_ID']
|
16
|
+
config.secret_key = ENV['AWS_SECRET_ACCESS_KEY']
|
17
|
+
end
|
18
|
+
|
19
|
+
# Usage Example
|
20
|
+
class Product
|
21
|
+
include CloudSesame
|
22
|
+
|
23
|
+
define_cloudsearch do
|
24
|
+
# Product CloudSesame Config
|
25
|
+
config.endpoint = ENV['AWS_ENDPOINT']
|
26
|
+
config.region = ENV['AWS_REGION']
|
27
|
+
|
28
|
+
default_size 100
|
29
|
+
|
30
|
+
define_sloppiness 3
|
31
|
+
|
32
|
+
define_fuzziness do
|
33
|
+
max_fuzziness 3
|
34
|
+
min_char_size 6
|
35
|
+
fuzzy_percent 0.17
|
36
|
+
end
|
37
|
+
|
38
|
+
field :searchable_text, query: { weight: 2 }
|
39
|
+
field :description, query: true
|
40
|
+
field :tags
|
41
|
+
|
42
|
+
field :affiliate_advertiser_ext_id, facet: { size: 50 }
|
43
|
+
field :currency, facet: true
|
44
|
+
field :discount_percentage, facet: { buckets: %w([10,100] [25,100] [50,100] [70,100]), method: 'interval' }
|
45
|
+
field :manufacturer_name, facet: { size: 50 }
|
46
|
+
field :price, facet: { buckets: %w([0,25] [25,50] [50,100] [100,200] [200,}), method: 'interval' }
|
47
|
+
field :category_string, facet: { sort: 'bucket', size: 10_000 }
|
48
|
+
field :created_at
|
49
|
+
|
50
|
+
scope :men_tag, ->(date) { created_at date }
|
51
|
+
scope :and_mens do
|
52
|
+
and! { tags "men"}
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
class NewProduct < Product
|
60
|
+
load_definition_from Product
|
61
|
+
|
62
|
+
define_cloudsearch do
|
63
|
+
field :searchable_text, query: { weight: 4 }
|
64
|
+
field :name, as: :text1
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Example Query
|
69
|
+
query = Product.cloudsearch.query("children panasonic")
|
70
|
+
.and {
|
71
|
+
or!(boost: 2) {
|
72
|
+
# tags.not start_with "flash_deal"
|
73
|
+
tags.not.start_with "flash_deal"
|
74
|
+
# tags.near"sales"
|
75
|
+
# tags start_with("flash_deal"), near("sales")
|
76
|
+
}
|
77
|
+
or!.not {
|
78
|
+
currency "CAD", "EUR"
|
79
|
+
}
|
80
|
+
and! {
|
81
|
+
price r.gte(100).lt(200)
|
82
|
+
}
|
83
|
+
}.created_at(Date.today).description("wasup")
|
73
84
|
|
74
85
|
# binding.pry
|
75
86
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: CloudSesame
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Chu
|
@@ -108,38 +108,40 @@ files:
|
|
108
108
|
- lib/cloud_sesame/domain/config.rb
|
109
109
|
- lib/cloud_sesame/domain/context.rb
|
110
110
|
- lib/cloud_sesame/query/ast/and.rb
|
111
|
-
- lib/cloud_sesame/query/ast/
|
111
|
+
- lib/cloud_sesame/query/ast/block_chaining_relation.rb
|
112
112
|
- lib/cloud_sesame/query/ast/date_value.rb
|
113
|
-
- lib/cloud_sesame/query/ast/
|
113
|
+
- lib/cloud_sesame/query/ast/field_array.rb
|
114
114
|
- lib/cloud_sesame/query/ast/literal.rb
|
115
|
-
- lib/cloud_sesame/query/ast/multi_branch.rb
|
116
115
|
- lib/cloud_sesame/query/ast/multi_expression_operator.rb
|
117
116
|
- lib/cloud_sesame/query/ast/near.rb
|
118
117
|
- lib/cloud_sesame/query/ast/not.rb
|
118
|
+
- lib/cloud_sesame/query/ast/operator.rb
|
119
119
|
- lib/cloud_sesame/query/ast/or.rb
|
120
120
|
- lib/cloud_sesame/query/ast/phrase.rb
|
121
121
|
- lib/cloud_sesame/query/ast/prefix.rb
|
122
122
|
- lib/cloud_sesame/query/ast/range_value.rb
|
123
123
|
- lib/cloud_sesame/query/ast/root.rb
|
124
|
-
- lib/cloud_sesame/query/ast/single_branch.rb
|
125
124
|
- lib/cloud_sesame/query/ast/single_expression_operator.rb
|
126
125
|
- lib/cloud_sesame/query/ast/term.rb
|
127
126
|
- lib/cloud_sesame/query/ast/value.rb
|
128
127
|
- lib/cloud_sesame/query/builder.rb
|
129
|
-
- lib/cloud_sesame/query/dsl/and.rb
|
130
128
|
- lib/cloud_sesame/query/dsl/base.rb
|
131
|
-
- lib/cloud_sesame/query/dsl/
|
132
|
-
- lib/cloud_sesame/query/dsl/
|
133
|
-
- lib/cloud_sesame/query/dsl/
|
134
|
-
- lib/cloud_sesame/query/dsl/
|
135
|
-
- lib/cloud_sesame/query/dsl/
|
136
|
-
- lib/cloud_sesame/query/dsl/
|
137
|
-
- lib/cloud_sesame/query/dsl/
|
138
|
-
- lib/cloud_sesame/query/dsl/
|
139
|
-
- lib/cloud_sesame/query/dsl/
|
140
|
-
- lib/cloud_sesame/query/dsl/
|
129
|
+
- lib/cloud_sesame/query/dsl/block_chaining_methods.rb
|
130
|
+
- lib/cloud_sesame/query/dsl/block_methods.rb
|
131
|
+
- lib/cloud_sesame/query/dsl/field_array_methods.rb
|
132
|
+
- lib/cloud_sesame/query/dsl/field_methods.rb
|
133
|
+
- lib/cloud_sesame/query/dsl/filter_query_methods.rb
|
134
|
+
- lib/cloud_sesame/query/dsl/operator_methods.rb
|
135
|
+
- lib/cloud_sesame/query/dsl/page_methods.rb
|
136
|
+
- lib/cloud_sesame/query/dsl/query_methods.rb
|
137
|
+
- lib/cloud_sesame/query/dsl/return_methods.rb
|
138
|
+
- lib/cloud_sesame/query/dsl/scope_methods.rb
|
139
|
+
- lib/cloud_sesame/query/dsl/sort_methods.rb
|
140
|
+
- lib/cloud_sesame/query/dsl/value_methods.rb
|
141
|
+
- lib/cloud_sesame/query/error/invalid_syntax.rb
|
141
142
|
- lib/cloud_sesame/query/error/missing_operator_symbol.rb
|
142
143
|
- lib/cloud_sesame/query/error/missing_query.rb
|
144
|
+
- lib/cloud_sesame/query/fuzziness.rb
|
143
145
|
- lib/cloud_sesame/query/node/abstract.rb
|
144
146
|
- lib/cloud_sesame/query/node/facet.rb
|
145
147
|
- lib/cloud_sesame/query/node/filter_query.rb
|
@@ -154,16 +156,12 @@ files:
|
|
154
156
|
- spec/abstract_object_spec.rb
|
155
157
|
- spec/cloud_sesame/domain/base_spec.rb
|
156
158
|
- spec/cloud_sesame/domain/context_spec.rb
|
157
|
-
- spec/cloud_sesame/query/ast/and_spec.rb
|
158
|
-
- spec/cloud_sesame/query/ast/literal_spec.rb
|
159
|
-
- spec/cloud_sesame/query/ast/multi_branch_spec.rb
|
160
|
-
- spec/cloud_sesame/query/ast/multi_expression_operator_spec.rb
|
161
|
-
- spec/cloud_sesame/query/ast/or_spec.rb
|
162
|
-
- spec/cloud_sesame/query/ast/root_spec.rb
|
163
|
-
- spec/cloud_sesame/query/ast/value_spec.rb
|
164
159
|
- spec/cloud_sesame/query/builder_spec.rb
|
165
160
|
- spec/cloud_sesame/query/dsl/base_spec.rb
|
166
|
-
- spec/cloud_sesame/query/dsl/
|
161
|
+
- spec/cloud_sesame/query/dsl/block_chaining_methods_spec.rb
|
162
|
+
- spec/cloud_sesame/query/dsl/block_methods_spec.rb
|
163
|
+
- spec/cloud_sesame/query/dsl/field_array_methods_spec.rb
|
164
|
+
- spec/cloud_sesame/query/dsl/field_methods_spec.rb
|
167
165
|
- spec/cloud_sesame/query/dsl_spec.rb
|
168
166
|
- spec/cloud_sesame/query/node/abstract_spec.rb
|
169
167
|
- spec/cloud_sesame/query/node/facet_spec.rb
|
@@ -173,7 +171,6 @@ files:
|
|
173
171
|
- spec/cloud_sesame/query/node/query_options_spec.rb
|
174
172
|
- spec/cloud_sesame/query/node/query_parser_spec.rb
|
175
173
|
- spec/cloud_sesame/query/node/query_spec.rb
|
176
|
-
- spec/cloud_sesame/query/node/request_spec.rb
|
177
174
|
- spec/cloud_sesame/query/node/sort_spec.rb
|
178
175
|
- spec/cloud_sesame_spec.rb
|
179
176
|
- spec/spec_helper.rb
|
@@ -205,16 +202,12 @@ test_files:
|
|
205
202
|
- spec/abstract_object_spec.rb
|
206
203
|
- spec/cloud_sesame/domain/base_spec.rb
|
207
204
|
- spec/cloud_sesame/domain/context_spec.rb
|
208
|
-
- spec/cloud_sesame/query/ast/and_spec.rb
|
209
|
-
- spec/cloud_sesame/query/ast/literal_spec.rb
|
210
|
-
- spec/cloud_sesame/query/ast/multi_branch_spec.rb
|
211
|
-
- spec/cloud_sesame/query/ast/multi_expression_operator_spec.rb
|
212
|
-
- spec/cloud_sesame/query/ast/or_spec.rb
|
213
|
-
- spec/cloud_sesame/query/ast/root_spec.rb
|
214
|
-
- spec/cloud_sesame/query/ast/value_spec.rb
|
215
205
|
- spec/cloud_sesame/query/builder_spec.rb
|
216
206
|
- spec/cloud_sesame/query/dsl/base_spec.rb
|
217
|
-
- spec/cloud_sesame/query/dsl/
|
207
|
+
- spec/cloud_sesame/query/dsl/block_chaining_methods_spec.rb
|
208
|
+
- spec/cloud_sesame/query/dsl/block_methods_spec.rb
|
209
|
+
- spec/cloud_sesame/query/dsl/field_array_methods_spec.rb
|
210
|
+
- spec/cloud_sesame/query/dsl/field_methods_spec.rb
|
218
211
|
- spec/cloud_sesame/query/dsl_spec.rb
|
219
212
|
- spec/cloud_sesame/query/node/abstract_spec.rb
|
220
213
|
- spec/cloud_sesame/query/node/facet_spec.rb
|
@@ -224,7 +217,6 @@ test_files:
|
|
224
217
|
- spec/cloud_sesame/query/node/query_options_spec.rb
|
225
218
|
- spec/cloud_sesame/query/node/query_parser_spec.rb
|
226
219
|
- spec/cloud_sesame/query/node/query_spec.rb
|
227
|
-
- spec/cloud_sesame/query/node/request_spec.rb
|
228
220
|
- spec/cloud_sesame/query/node/sort_spec.rb
|
229
221
|
- spec/cloud_sesame_spec.rb
|
230
222
|
- spec/spec_helper.rb
|
@@ -1,77 +0,0 @@
|
|
1
|
-
module CloudSesame
|
2
|
-
module Query
|
3
|
-
module AST
|
4
|
-
class CompoundArray < Array
|
5
|
-
|
6
|
-
attr_reader :scope, :field
|
7
|
-
|
8
|
-
def for_field(field)
|
9
|
-
parents.clear
|
10
|
-
@field = field
|
11
|
-
end
|
12
|
-
|
13
|
-
def parents
|
14
|
-
@parents ||= []
|
15
|
-
end
|
16
|
-
|
17
|
-
def scope_to(scope)
|
18
|
-
@scope = scope
|
19
|
-
return self
|
20
|
-
end
|
21
|
-
|
22
|
-
# SINGLE BRANCH OPERATOR
|
23
|
-
# =======================================
|
24
|
-
|
25
|
-
# NEAR
|
26
|
-
# =======================================
|
27
|
-
def near(*values)
|
28
|
-
parents[1] = AST::Near
|
29
|
-
insert_and_return_children values
|
30
|
-
end
|
31
|
-
|
32
|
-
alias_method :sloppy, :near
|
33
|
-
|
34
|
-
# NOT
|
35
|
-
# =======================================
|
36
|
-
def not(*values)
|
37
|
-
parents[0] = AST::Not
|
38
|
-
insert_and_return_children values
|
39
|
-
end
|
40
|
-
|
41
|
-
alias_method :is_not, :not
|
42
|
-
|
43
|
-
# PREFIX
|
44
|
-
# =======================================
|
45
|
-
def prefix(*values)
|
46
|
-
parents[1] = AST::Prefix
|
47
|
-
insert_and_return_children values
|
48
|
-
end
|
49
|
-
|
50
|
-
alias_method :start_with, :prefix
|
51
|
-
alias_method :begin_with, :prefix
|
52
|
-
|
53
|
-
def insert_and_return_children(values = [])
|
54
|
-
values.each do |value|
|
55
|
-
value.child.field = field if value.kind_of?(AST::SingleExpressionOperator)
|
56
|
-
child = value.kind_of?(AST::SingleExpressionOperator) || value.kind_of?(AST::Literal) ? value : AST::Literal.new(field, value, options)
|
57
|
-
|
58
|
-
current_scope = self
|
59
|
-
parents.compact.each do |parent|
|
60
|
-
current_scope << (node = parent.new scope.context)
|
61
|
-
current_scope = node
|
62
|
-
end
|
63
|
-
current_scope << child
|
64
|
-
end
|
65
|
-
return self
|
66
|
-
end
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
def options
|
71
|
-
scope.context[:fields][field]
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module CloudSesame
|
2
|
-
module Query
|
3
|
-
module AST
|
4
|
-
class MultiBranch
|
5
|
-
include DSL::Base
|
6
|
-
include DSL::FilterQuery
|
7
|
-
include DSL::Scope
|
8
|
-
|
9
|
-
attr_reader :context
|
10
|
-
|
11
|
-
def initialize(context, &block)
|
12
|
-
@context = context
|
13
|
-
instance_eval &block if block_given?
|
14
|
-
end
|
15
|
-
|
16
|
-
def children
|
17
|
-
@children ||= CompoundArray.new.scope_to self
|
18
|
-
end
|
19
|
-
|
20
|
-
def compile_children
|
21
|
-
children.map(&:compile).join(' ')
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module CloudSesame
|
2
|
-
module Query
|
3
|
-
module AST
|
4
|
-
class SingleBranch
|
5
|
-
attr_accessor :child
|
6
|
-
attr_reader :context
|
7
|
-
|
8
|
-
def initialize(context, &block)
|
9
|
-
@context = context
|
10
|
-
instance_eval &block if block_given?
|
11
|
-
end
|
12
|
-
|
13
|
-
def child=(object)
|
14
|
-
if object.kind_of? Literal
|
15
|
-
(object.options[:excluded] ||= []) << object.options[:included].delete(object.value)
|
16
|
-
end
|
17
|
-
@child = object
|
18
|
-
end
|
19
|
-
|
20
|
-
def <<(object)
|
21
|
-
self.child= object
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module CloudSesame
|
2
|
-
module Query
|
3
|
-
module DSL
|
4
|
-
module And
|
5
|
-
|
6
|
-
# CLAUSE: AND
|
7
|
-
# =========================================
|
8
|
-
def and(&block)
|
9
|
-
method_scope.children << AST::And.new(method_context, &block)
|
10
|
-
method_return
|
11
|
-
end
|
12
|
-
|
13
|
-
alias_method :all, :and
|
14
|
-
alias_method :and!, :and
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module CloudSesame
|
2
|
-
module Query
|
3
|
-
module DSL
|
4
|
-
module Boost
|
5
|
-
|
6
|
-
def compile_boost
|
7
|
-
" boost=#{ @boost }" if @boost
|
8
|
-
end
|
9
|
-
|
10
|
-
def boost(value)
|
11
|
-
@boost = value.to_i
|
12
|
-
return self
|
13
|
-
end
|
14
|
-
|
15
|
-
alias_method :weight, :boost
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module CloudSesame
|
2
|
-
module Query
|
3
|
-
module DSL
|
4
|
-
module Literal
|
5
|
-
|
6
|
-
# LITERAL: creates a single LITERAL node
|
7
|
-
# =======================================
|
8
|
-
def literal(value)
|
9
|
-
field = method_scope.children.field
|
10
|
-
AST::Literal.new field, value, fields[field]
|
11
|
-
end
|
12
|
-
|
13
|
-
alias_method :l, :literal
|
14
|
-
alias_method :field, :literal
|
15
|
-
|
16
|
-
# NEAR: creates a single NEAR node
|
17
|
-
# =======================================
|
18
|
-
def near(value)
|
19
|
-
create_literal_with_operator AST::Near, value
|
20
|
-
end
|
21
|
-
|
22
|
-
alias_method :n, :near
|
23
|
-
alias_method :sloppy, :near
|
24
|
-
|
25
|
-
# PREFIX: creates a single PREFIX node
|
26
|
-
# =======================================
|
27
|
-
def prefix(value)
|
28
|
-
create_literal_with_operator AST::Prefix, value
|
29
|
-
end
|
30
|
-
|
31
|
-
alias_method :p, :prefix
|
32
|
-
alias_method :start_with, :prefix
|
33
|
-
alias_method :begin_with, :prefix
|
34
|
-
|
35
|
-
# PHRASE: creates a single PHRASE node
|
36
|
-
# =======================================
|
37
|
-
def phrase(value)
|
38
|
-
create_literal_with_operator AST::Phrase, value
|
39
|
-
end
|
40
|
-
|
41
|
-
# TERM: creates a single TERM node
|
42
|
-
# =======================================
|
43
|
-
def term(value)
|
44
|
-
create_literal_with_operator AST::Term, value
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def fields
|
50
|
-
method_context[:fields]
|
51
|
-
end
|
52
|
-
|
53
|
-
def create_literal_with_operator(klass, value)
|
54
|
-
field = method_scope.children.field
|
55
|
-
literal = AST::Literal.new field, value, fields[field]
|
56
|
-
(node = klass.new method_context) << literal
|
57
|
-
node
|
58
|
-
end
|
59
|
-
|
60
|
-
def method_missing(field, *values, &block)
|
61
|
-
if fields && (options = fields[field])
|
62
|
-
method_scope.children.for_field field
|
63
|
-
method_scope.children.insert_and_return_children values
|
64
|
-
else
|
65
|
-
super
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module CloudSesame
|
2
|
-
module Query
|
3
|
-
module DSL
|
4
|
-
module Or
|
5
|
-
|
6
|
-
# CLAUSE: OR
|
7
|
-
# =========================================
|
8
|
-
def or(&block)
|
9
|
-
method_scope.children << AST::Or.new(method_context, &block)
|
10
|
-
method_return
|
11
|
-
end
|
12
|
-
|
13
|
-
alias_method :any, :or
|
14
|
-
alias_method :or!, :or
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|