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.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d640359762a517c60a26d82969d821678bb14871
4
- data.tar.gz: 7d9e1082e91951cd4d61061de81cba3416f8c93b
3
+ metadata.gz: 335fe9bf3866f40f945537d47a8e70ad3f23e083
4
+ data.tar.gz: 69a8cb804d0b705e7981a1fd798557f3fa4c622c
5
5
  SHA512:
6
- metadata.gz: 392b5a7c410506f2a4c0547853c31e1ce282063191251eb3fa0f30b64cf3aa503d41bdb13e52ebaec879fa9de7f8dce00a34f846d667d6e0ea334d9b8dc4b55c
7
- data.tar.gz: 064717d64e27d0ae3f172b7ab0d0bd870dd40240b93d17b5e4ff6fb6f75b7dd9cd6c4b5e0d1352dc9934997ef1c460a0ffab50c5f4b65a85736f34a7493ea1a6
6
+ metadata.gz: d3fa0153147426b81b495bec9e07b903f397e6fbb03f4bf66fd9e18e3b23654603abd7eaf1dcfcefb196259bd8886695775896af02b3f0198dea2d71ac8d9d01
7
+ data.tar.gz: aff567e8ba321f8928ad36e1ef8447668a4b467eff93d9c8c0c0f1fb29b71d477f7514620c0aee85b10471ed399957c7e2f4929cde9c0a345bb55bdd8c321e39
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- CloudSesame (0.1.6)
4
+ CloudSesame (0.2.0)
5
5
  aws-sdk (~> 2)
6
6
 
7
7
  GEM
data/cloud_sesame.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'CloudSesame'
3
- s.version = '0.1.6'
3
+ s.version = '0.2.0'
4
4
  s.date = '2016-01-14'
5
5
  s.summary = "AWS CloudSearch Query Interface"
6
6
  s.description = "AWS CloudSearch Query Interface"
@@ -35,6 +35,15 @@ module CloudSesame
35
35
  define_filter_query_field(name, options)
36
36
  end
37
37
 
38
+ def define_sloppiness(value)
39
+ context[:query, true][:sloppiness] = value.to_i
40
+ end
41
+
42
+ def define_fuzziness(proc = nil, &block)
43
+ block = proc unless block_given?
44
+ context[:query, true][:fuzziness] = Query::Fuzziness.new(&block)
45
+ end
46
+
38
47
  def default_scope(proc, &block)
39
48
  scope :default, proc, &block
40
49
  end
@@ -2,7 +2,7 @@ module CloudSesame
2
2
  module Query
3
3
  module AST
4
4
  class And < MultiExpressionOperator
5
- self.symbol = :and
5
+ SYMBOL = :and
6
6
  end
7
7
  end
8
8
  end
@@ -0,0 +1,30 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ class BlockChainingRelation
5
+ include DSL::BlockChainingMethods
6
+
7
+ attr_reader :orphan_node
8
+
9
+ def initialize(dsl_scope, dsl_return, orphan_node)
10
+ @dsl_scope = dsl_scope
11
+ @dsl_return = dsl_return
12
+ @orphan_node = orphan_node
13
+ end
14
+
15
+ def dsl_scope
16
+ @dsl_scope
17
+ end
18
+
19
+ def dsl_context
20
+ dsl_scope.context
21
+ end
22
+
23
+ def dsl_return(node = nil)
24
+ @dsl_scope.is_a?(Root) || !node ? @dsl_return : node
25
+ end
26
+
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ class FieldArray < Array
5
+ include DSL::FieldArrayMethods
6
+
7
+ attr_accessor :dsl_return
8
+ attr_reader :field, :dsl_scope, :dsl_context
9
+
10
+ def field=(field)
11
+ parents.clear
12
+ @field = field
13
+ end
14
+
15
+ def parents
16
+ @parents ||= []
17
+ end
18
+
19
+ def dsl_scope=(dsl_scope)
20
+ @dsl_context = dsl_scope.context
21
+ @dsl_scope = dsl_scope
22
+ end
23
+
24
+ def compile
25
+ map(&:compile).join(' ')
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,7 +1,7 @@
1
1
  module CloudSesame
2
2
  module Query
3
3
  module AST
4
- class Literal < SingleBranch
4
+ class Literal
5
5
 
6
6
  attr_accessor :field
7
7
  attr_reader :options, :value
@@ -9,20 +9,26 @@ module CloudSesame
9
9
  def initialize(field = nil, value = nil, options = {})
10
10
  @field = field
11
11
  @value = to_value value
12
- ((@options = options || {})[:included] ||= []) << @value
12
+ @options = options || {}
13
+ (@options[:included] ||= []) << @value
13
14
  end
14
15
 
15
- def as_field
16
- options[:as] || field
16
+ def is_for(field, options)
17
+ @field = field
18
+ @options = options.merge @options
17
19
  end
18
20
 
19
- def compile
20
- options[:detailed] ? detailed_format : standard_format
21
+ def is_excluded
22
+ options[:included].delete value
23
+ (options[:excluded] ||= []) << value
24
+ end
25
+
26
+ def as_field
27
+ options[:as] || field
21
28
  end
22
29
 
23
- def detailed
24
- options[:detailed] = true
25
- return self
30
+ def compile(detailed = false)
31
+ detailed ? detailed_format : standard_format
26
32
  end
27
33
 
28
34
  private
@@ -1,19 +1,37 @@
1
1
  module CloudSesame
2
2
  module Query
3
3
  module AST
4
- class MultiExpressionOperator < MultiBranch
5
- include DSL::Boost
4
+ class MultiExpressionOperator < Operator
5
+ include DSL::Base
6
+ include DSL::BlockMethods
7
+ include DSL::FieldMethods
8
+ include DSL::FilterQueryMethods
9
+ include DSL::OperatorMethods
10
+ include DSL::ScopeMethods
11
+ include DSL::ValueMethods
6
12
 
7
- def self.symbol=(symbol)
8
- @symbol = symbol
13
+ def children
14
+ @children ||= create_children
9
15
  end
10
16
 
11
- def self.symbol
12
- @symbol
17
+ def compile
18
+ "(#{ self.class::SYMBOL }#{ boost } #{ children.compile })" unless children.empty?
13
19
  end
14
20
 
15
- def compile
16
- "(#{ self.class.symbol }#{ compile_boost } #{ compile_children })" unless children.empty?
21
+ def <<(object)
22
+ children << object
23
+ end
24
+
25
+ def is_excluded
26
+ children.map(&:is_excluded)
27
+ end
28
+
29
+ private
30
+
31
+ def create_children
32
+ array = FieldArray.new
33
+ array.dsl_scope = dsl_scope
34
+ array
17
35
  end
18
36
 
19
37
  end
@@ -2,20 +2,15 @@ module CloudSesame
2
2
  module Query
3
3
  module AST
4
4
  class Near < SingleExpressionOperator
5
- self.symbol = :near
5
+ DETAILED = true
6
+ SYMBOL = :near
6
7
 
7
8
  def compile
8
- child.detailed if child.kind_of?(Literal)
9
- "(#{ self.class.symbol }#{ compile_boost }#{ compile_distance } #{ child.compile })" if child
9
+ "(#{ SYMBOL }#{ boost }#{ distance } #{ child.compile DETAILED })" if child
10
10
  end
11
11
 
12
- def distance(value)
13
- @distance = value.to_i
14
- return self
15
- end
16
-
17
- def compile_distance
18
- " distance=#{ @distance }" if @distance
12
+ def distance
13
+ " distance=#{ options[:distance] }" if options[:distance]
19
14
  end
20
15
 
21
16
  end
@@ -2,7 +2,17 @@ module CloudSesame
2
2
  module Query
3
3
  module AST
4
4
  class Not < SingleExpressionOperator
5
- self.symbol = :not
5
+ SYMBOL = :not
6
+
7
+ def <<(object)
8
+ object.is_excluded
9
+ super
10
+ end
11
+
12
+ def compile(detailed = nil)
13
+ "(#{ self.class::SYMBOL }#{ boost } #{ child.compile })" if child
14
+ end
15
+
6
16
  end
7
17
  end
8
18
  end
@@ -0,0 +1,26 @@
1
+ module CloudSesame
2
+ module Query
3
+ module AST
4
+ class Operator
5
+ SYMBOL = nil
6
+
7
+ attr_reader :context, :options
8
+
9
+ def initialize(context, options = {}, &block)
10
+ @context = context
11
+ @options = options
12
+ evaluate &block if block_given?
13
+ end
14
+
15
+ def boost
16
+ " boost=#{ options[:boost] }" if options[:boost]
17
+ end
18
+
19
+ def evaluate(&block)
20
+ instance_eval &block
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+ end
@@ -2,7 +2,7 @@ module CloudSesame
2
2
  module Query
3
3
  module AST
4
4
  class Or < MultiExpressionOperator
5
- self.symbol = :or
5
+ SYMBOL = :or
6
6
  end
7
7
  end
8
8
  end
@@ -2,12 +2,8 @@ module CloudSesame
2
2
  module Query
3
3
  module AST
4
4
  class Phrase < SingleExpressionOperator
5
- self.symbol = :phrase
6
-
7
- def compile
8
- child.detailed if child.kind_of?(Literal)
9
- super
10
- end
5
+ DETAILED = true
6
+ SYMBOL = :prefix
11
7
  end
12
8
  end
13
9
  end
@@ -2,12 +2,8 @@ module CloudSesame
2
2
  module Query
3
3
  module AST
4
4
  class Prefix < SingleExpressionOperator
5
- self.symbol = :prefix
6
-
7
- def compile
8
- child.detailed if child.kind_of?(Literal)
9
- super
10
- end
5
+ DETAILED = true
6
+ SYMBOL = :prefix
11
7
  end
12
8
  end
13
9
  end
@@ -4,7 +4,7 @@ module CloudSesame
4
4
  class RangeValue < Value
5
5
 
6
6
  def initialize(range = nil)
7
- @data = range ? [true, to_value(range.begin), to_value(range.end), !range.exclude_end?] : [false, nil, nil, false]
7
+ @data = range && range.kind_of?(Range) ? [true, to_value(range.begin), to_value(range.end), !range.exclude_end?] : [false, nil, nil, false]
8
8
  end
9
9
 
10
10
  def compile
@@ -1,11 +1,15 @@
1
1
  module CloudSesame
2
2
  module Query
3
3
  module AST
4
- class Root < And
5
- self.symbol = :and
4
+ class Root < MultiExpressionOperator
5
+ SYMBOL = :and # default operator for root
6
6
 
7
7
  def compile
8
- children.size > 1 ? super : compile_children
8
+ more_than_one_child? ? super : children.compile
9
+ end
10
+
11
+ def more_than_one_child?
12
+ children.size > 1
9
13
  end
10
14
 
11
15
  end
@@ -1,19 +1,28 @@
1
1
  module CloudSesame
2
2
  module Query
3
3
  module AST
4
- class SingleExpressionOperator < SingleBranch
5
- include DSL::Boost
4
+ class SingleExpressionOperator < Operator
5
+ include DSL::Base
6
+ include DSL::BlockMethods
6
7
 
7
- def self.symbol=(symbol)
8
- @symbol = symbol
8
+ DETAILED = false
9
+
10
+ attr_accessor :child
11
+
12
+ def is_for(field, field_options)
13
+ child.is_for field, field_options
14
+ end
15
+
16
+ def is_excluded
17
+ child.is_excluded
9
18
  end
10
19
 
11
- def self.symbol
12
- @symbol
20
+ def <<(object)
21
+ self.child = object
13
22
  end
14
23
 
15
24
  def compile
16
- "(#{ self.class.symbol }#{ compile_boost } #{ child.compile })" if child
25
+ "(#{ self.class::SYMBOL }#{ boost } #{ child.compile self.class::DETAILED })" if child
17
26
  end
18
27
 
19
28
  end
@@ -2,12 +2,8 @@ module CloudSesame
2
2
  module Query
3
3
  module AST
4
4
  class Term < SingleExpressionOperator
5
- self.symbol = :term
6
-
7
- def compile
8
- child.detailed if child.kind_of?(Literal)
9
- super
10
- end
5
+ DETAILED = true
6
+ SYMBOL = :term
11
7
  end
12
8
  end
13
9
  end
@@ -1,7 +1,7 @@
1
1
  module CloudSesame
2
2
  module Query
3
3
  module AST
4
- class Value < Leaf
4
+ class Value
5
5
 
6
6
  attr_reader :data
7
7
 
@@ -13,14 +13,14 @@ module CloudSesame
13
13
  format data
14
14
  end
15
15
 
16
- def ==(value)
17
- data == value || compile == value
18
- end
19
-
20
16
  def to_s
21
17
  compile
22
18
  end
23
19
 
20
+ def ==(value)
21
+ data == value || compile == value
22
+ end
23
+
24
24
  private
25
25
 
26
26
  def format(data)
@@ -2,11 +2,17 @@ module CloudSesame
2
2
  module Query
3
3
  module Builder
4
4
  include DSL::Base
5
- include DSL::FilterQuery
6
- include DSL::Page
7
- include DSL::Query
8
- include DSL::Sort
9
- include DSL::Return
5
+ include DSL::PageMethods
6
+ include DSL::QueryMethods
7
+ include DSL::ReturnMethods
8
+ include DSL::SortMethods
9
+
10
+ # Filter Query DSL
11
+ include DSL::BlockMethods
12
+ include DSL::FieldMethods
13
+ include DSL::FilterQueryMethods
14
+ include DSL::ScopeMethods
15
+ include DSL::ValueMethods
10
16
 
11
17
  attr_reader :result
12
18
 
@@ -16,7 +22,7 @@ module CloudSesame
16
22
  end
17
23
 
18
24
  def request
19
- @request ||= (clear_result; Node::Request.new context.dup)
25
+ @request ||= (clear_response; Node::Request.new context.dup)
20
26
  end
21
27
 
22
28
  def response
@@ -27,7 +33,7 @@ module CloudSesame
27
33
  @request = nil
28
34
  end
29
35
 
30
- def clear_result
36
+ def clear_response
31
37
  @response = nil
32
38
  end
33
39
 
@@ -67,10 +73,14 @@ module CloudSesame
67
73
 
68
74
  private
69
75
 
70
- def method_scope
76
+ def dsl_scope
71
77
  request.filter_query.root
72
78
  end
73
79
 
80
+ def dsl_return(node = nil)
81
+ self
82
+ end
83
+
74
84
  end
75
85
  end
76
86
  end
@@ -5,16 +5,16 @@ module CloudSesame
5
5
 
6
6
  private
7
7
 
8
- def method_context
9
- method_scope.context
8
+ def dsl_scope
9
+ self
10
10
  end
11
11
 
12
- def method_return
13
- self
12
+ def dsl_context
13
+ dsl_scope.context
14
14
  end
15
15
 
16
- def method_scope
17
- self
16
+ def dsl_return(node = nil)
17
+ node || dsl_scope
18
18
  end
19
19
 
20
20
  end
@@ -0,0 +1,26 @@
1
+ module CloudSesame
2
+ module Query
3
+ module DSL
4
+ module BlockChainingMethods
5
+
6
+ # CLAUSE: NOT
7
+ # =========================================
8
+ def not(options = {}, &block)
9
+ raise missing_block unless block_given?
10
+ node = AST::Not.new(dsl_context, options)
11
+ orphan_node.evaluate &block
12
+ node << orphan_node
13
+ dsl_scope << node
14
+ dsl_return node
15
+ end
16
+
17
+ private
18
+
19
+ def missing_block
20
+ Error::InvalidSyntax.new("#{ orphan_node.class::SYMBOL }.not requires a block")
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,41 @@
1
+ module CloudSesame
2
+ module Query
3
+ module DSL
4
+ module BlockMethods
5
+
6
+ attr_accessor :orphan_node
7
+
8
+ # CLAUSE: AND
9
+ # =========================================
10
+ def and(options = {}, &block)
11
+ block_style_dsl AST::And, options, &block
12
+ end
13
+
14
+ alias_method :all, :and
15
+ alias_method :and!, :and
16
+
17
+ # CLAUSE: OR
18
+ # =========================================
19
+ def or(options = {}, &block)
20
+ block_style_dsl AST::Or, options, &block
21
+ end
22
+
23
+ alias_method :any, :or
24
+ alias_method :or!, :or
25
+
26
+ private
27
+
28
+ def block_style_dsl(klass, options, &block)
29
+ node = klass.new dsl_context, options, &block
30
+ if block_given?
31
+ dsl_scope << node
32
+ dsl_return node
33
+ else
34
+ AST::BlockChainingRelation.new(dsl_scope, dsl_return, node)
35
+ end
36
+ end
37
+
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,70 @@
1
+ module CloudSesame
2
+ module Query
3
+ module DSL
4
+ module FieldArrayMethods
5
+
6
+ # NEAR
7
+ # =======================================
8
+ def near(*values)
9
+ parents[0] = { klass: AST::Near, options: extract_options(values) }
10
+ insert_and_return_children values
11
+ end
12
+
13
+ alias_method :sloppy, :near
14
+
15
+ # NOT
16
+ # =======================================
17
+ def not(*values)
18
+ parents[1] = { klass: AST::Not, options: extract_options(values) }
19
+ insert_and_return_children values
20
+ end
21
+
22
+ alias_method :is_not, :not
23
+
24
+ # PREFIX
25
+ # =======================================
26
+ def prefix(*values)
27
+ parents[0] = { klass: AST::Prefix, options: extract_options(values) }
28
+ insert_and_return_children values
29
+ end
30
+
31
+ alias_method :start_with, :prefix
32
+ alias_method :begin_with, :prefix
33
+
34
+ def insert_and_return_children(values = [])
35
+ values.each do |value|
36
+ child = ensure_not_raw_value value
37
+ parents.compact.each do |parent|
38
+ node = parent[:klass].new dsl_context, parent[:options]
39
+ node << child
40
+ child = node
41
+ end
42
+ dsl_scope << child
43
+ end
44
+ parents.clear unless values.empty?
45
+ dsl_return != dsl_scope ? dsl_return : self
46
+ end
47
+
48
+ private
49
+
50
+ def extract_options(values)
51
+ values[-1].is_a?(Hash) ? values.delete_at(-1) : {}
52
+ end
53
+
54
+ def ensure_not_raw_value(value)
55
+ if value.kind_of?(AST::SingleExpressionOperator) || value.is_a?(AST::Literal)
56
+ value.child.is_for field, field_options
57
+ value
58
+ else
59
+ AST::Literal.new field, value, field_options
60
+ end
61
+ end
62
+
63
+ def field_options
64
+ dsl_context[:fields][field]
65
+ end
66
+
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,25 @@
1
+ module CloudSesame
2
+ module Query
3
+ module DSL
4
+ module FieldMethods
5
+
6
+ private
7
+
8
+ def fields
9
+ dsl_context[:fields]
10
+ end
11
+
12
+ def method_missing(field, *values, &block)
13
+ if fields && (options = fields[field])
14
+ dsl_scope.children.field = field
15
+ dsl_scope.children.dsl_return = dsl_return
16
+ dsl_scope.children.insert_and_return_children values
17
+ else
18
+ super
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end