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
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