CloudSesame 0.1.6 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/cloud_sesame.gemspec +1 -1
  4. data/lib/cloud_sesame/domain/base.rb +9 -0
  5. data/lib/cloud_sesame/query/ast/and.rb +1 -1
  6. data/lib/cloud_sesame/query/ast/block_chaining_relation.rb +30 -0
  7. data/lib/cloud_sesame/query/ast/field_array.rb +31 -0
  8. data/lib/cloud_sesame/query/ast/literal.rb +15 -9
  9. data/lib/cloud_sesame/query/ast/multi_expression_operator.rb +26 -8
  10. data/lib/cloud_sesame/query/ast/near.rb +5 -10
  11. data/lib/cloud_sesame/query/ast/not.rb +11 -1
  12. data/lib/cloud_sesame/query/ast/operator.rb +26 -0
  13. data/lib/cloud_sesame/query/ast/or.rb +1 -1
  14. data/lib/cloud_sesame/query/ast/phrase.rb +2 -6
  15. data/lib/cloud_sesame/query/ast/prefix.rb +2 -6
  16. data/lib/cloud_sesame/query/ast/range_value.rb +1 -1
  17. data/lib/cloud_sesame/query/ast/root.rb +7 -3
  18. data/lib/cloud_sesame/query/ast/single_expression_operator.rb +16 -7
  19. data/lib/cloud_sesame/query/ast/term.rb +2 -6
  20. data/lib/cloud_sesame/query/ast/value.rb +5 -5
  21. data/lib/cloud_sesame/query/builder.rb +18 -8
  22. data/lib/cloud_sesame/query/dsl/base.rb +6 -6
  23. data/lib/cloud_sesame/query/dsl/block_chaining_methods.rb +26 -0
  24. data/lib/cloud_sesame/query/dsl/block_methods.rb +41 -0
  25. data/lib/cloud_sesame/query/dsl/field_array_methods.rb +70 -0
  26. data/lib/cloud_sesame/query/dsl/field_methods.rb +25 -0
  27. data/lib/cloud_sesame/query/dsl/{filter_query.rb → filter_query_methods.rb} +3 -9
  28. data/lib/cloud_sesame/query/dsl/operator_methods.rb +53 -0
  29. data/lib/cloud_sesame/query/dsl/{page.rb → page_methods.rb} +12 -1
  30. data/lib/cloud_sesame/query/dsl/{query.rb → query_methods.rb} +1 -1
  31. data/lib/cloud_sesame/query/dsl/{return.rb → return_methods.rb} +1 -1
  32. data/lib/cloud_sesame/query/dsl/{scope.rb → scope_methods.rb} +3 -3
  33. data/lib/cloud_sesame/query/dsl/{sort.rb → sort_methods.rb} +1 -1
  34. data/lib/cloud_sesame/query/dsl/{value.rb → value_methods.rb} +1 -4
  35. data/lib/cloud_sesame/query/{ast/leaf.rb → error/invalid_syntax.rb} +2 -2
  36. data/lib/cloud_sesame/query/fuzziness.rb +54 -0
  37. data/lib/cloud_sesame/query/node/page.rb +6 -6
  38. data/lib/cloud_sesame/query/node/query.rb +14 -10
  39. data/lib/cloud_sesame/query/node/sort.rb +1 -1
  40. data/lib/cloud_sesame.rb +19 -16
  41. data/spec/cloud_sesame/query/dsl/base_spec.rb +2 -2
  42. data/spec/cloud_sesame/query/dsl/block_chaining_methods_spec.rb +73 -0
  43. data/spec/cloud_sesame/query/dsl/block_methods_spec.rb +117 -0
  44. data/spec/cloud_sesame/query/dsl/field_array_methods_spec.rb +69 -0
  45. data/spec/cloud_sesame/query/dsl/field_methods_spec.rb +54 -0
  46. data/spec/cloud_sesame/query/node/query_spec.rb +16 -9
  47. data/spec/cloud_sesame_spec.rb +79 -68
  48. metadata +26 -34
  49. data/lib/cloud_sesame/query/ast/compound_array.rb +0 -77
  50. data/lib/cloud_sesame/query/ast/multi_branch.rb +0 -27
  51. data/lib/cloud_sesame/query/ast/single_branch.rb +0 -27
  52. data/lib/cloud_sesame/query/dsl/and.rb +0 -19
  53. data/lib/cloud_sesame/query/dsl/boost.rb +0 -20
  54. data/lib/cloud_sesame/query/dsl/literal.rb +0 -72
  55. data/lib/cloud_sesame/query/dsl/or.rb +0 -19
  56. data/spec/cloud_sesame/query/ast/and_spec.rb +0 -13
  57. data/spec/cloud_sesame/query/ast/literal_spec.rb +0 -37
  58. data/spec/cloud_sesame/query/ast/multi_branch_spec.rb +0 -65
  59. data/spec/cloud_sesame/query/ast/multi_expression_operator_spec.rb +0 -26
  60. data/spec/cloud_sesame/query/ast/or_spec.rb +0 -13
  61. data/spec/cloud_sesame/query/ast/root_spec.rb +0 -43
  62. data/spec/cloud_sesame/query/ast/value_spec.rb +0 -40
  63. data/spec/cloud_sesame/query/dsl/filter_query_spec.rb +0 -108
  64. 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 terms if query is empty' do
14
- expect(node.terms).to eq []
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 terms' do
16
+ it 'should accept query as args and initialize query' do
17
17
  arguments[:query] = "hello world"
18
- expect(node.terms).to eq ["hello", "world"]
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.terms).to eq []
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 a string with all the terms added' do
30
- node.terms = ["term1", " term2", "term3 ", "-term4"]
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 '#run' do
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.terms = ["term1", " term2", "term3 ", "-term4"]
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
@@ -2,74 +2,85 @@ require 'spec_helper'
2
2
 
3
3
  describe CloudSesame do
4
4
 
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
- # # describe_fuzziness do
31
- # # max_fuzziness 3
32
- # # min_word_length 6
33
- # # fuzzy_percentage 0.17
34
- # # end
35
-
36
- # field :searchable_text, query: { weight: 2 }
37
- # field :description, query: true
38
- # field :tags
39
-
40
- # field :affiliate_advertiser_ext_id, facet: { size: 50 }
41
- # field :currency, facet: true
42
- # field :discount_percentage, facet: { buckets: %w([10,100] [25,100] [50,100] [70,100]), method: 'interval' }
43
- # field :manufacturer_name, facet: { size: 50 }
44
- # field :price, facet: { buckets: %w([0,25] [25,50] [50,100] [100,200] [200,}), method: 'interval' }
45
- # field :category_string, facet: { sort: 'bucket', size: 10_000 }
46
- # field :created_at
47
-
48
- # scope :men_tag, ->(date) { created_at date }
49
- # scope :and_mens do
50
- # and! { tags "men"}
51
- # end
52
- # scope :men_stuff, -> { query("men").sort().page }
53
-
54
- # end
55
-
56
- # end
57
-
58
- # class NewProduct < Product
59
- # load_definition_from Product
60
-
61
- # define_cloudsearch do
62
- # field :searchable_text, query: { weight: 4 }
63
- # field :name, as: :text1
64
- # end
65
- # end
66
-
67
-
68
-
69
-
70
- # # Example Query
71
- # query = Product.cloudsearch.query("nike pants").create_at(Date.today)
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.1.6
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/compound_array.rb
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/leaf.rb
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/boost.rb
132
- - lib/cloud_sesame/query/dsl/filter_query.rb
133
- - lib/cloud_sesame/query/dsl/literal.rb
134
- - lib/cloud_sesame/query/dsl/or.rb
135
- - lib/cloud_sesame/query/dsl/page.rb
136
- - lib/cloud_sesame/query/dsl/query.rb
137
- - lib/cloud_sesame/query/dsl/return.rb
138
- - lib/cloud_sesame/query/dsl/scope.rb
139
- - lib/cloud_sesame/query/dsl/sort.rb
140
- - lib/cloud_sesame/query/dsl/value.rb
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/filter_query_spec.rb
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/filter_query_spec.rb
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
@@ -1,13 +0,0 @@
1
- require "spec_helper"
2
-
3
- module CloudSesame
4
- module Query
5
- module AST
6
- describe And do
7
- it 'should set the symbol to :and' do
8
- expect(And.symbol).to eq :and
9
- end
10
- end
11
- end
12
- end
13
- end