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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 335fe9bf3866f40f945537d47a8e70ad3f23e083
|
4
|
+
data.tar.gz: 69a8cb804d0b705e7981a1fd798557f3fa4c622c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3fa0153147426b81b495bec9e07b903f397e6fbb03f4bf66fd9e18e3b23654603abd7eaf1dcfcefb196259bd8886695775896af02b3f0198dea2d71ac8d9d01
|
7
|
+
data.tar.gz: aff567e8ba321f8928ad36e1ef8447668a4b467eff93d9c8c0c0f1fb29b71d477f7514620c0aee85b10471ed399957c7e2f4929cde9c0a345bb55bdd8c321e39
|
data/Gemfile.lock
CHANGED
data/cloud_sesame.gemspec
CHANGED
@@ -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
|
@@ -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
|
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
|
-
|
12
|
+
@options = options || {}
|
13
|
+
(@options[:included] ||= []) << @value
|
13
14
|
end
|
14
15
|
|
15
|
-
def
|
16
|
-
|
16
|
+
def is_for(field, options)
|
17
|
+
@field = field
|
18
|
+
@options = options.merge @options
|
17
19
|
end
|
18
20
|
|
19
|
-
def
|
20
|
-
options[:
|
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
|
-
|
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 <
|
5
|
-
include DSL::
|
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
|
8
|
-
@
|
13
|
+
def children
|
14
|
+
@children ||= create_children
|
9
15
|
end
|
10
16
|
|
11
|
-
def
|
12
|
-
|
17
|
+
def compile
|
18
|
+
"(#{ self.class::SYMBOL }#{ boost } #{ children.compile })" unless children.empty?
|
13
19
|
end
|
14
20
|
|
15
|
-
def
|
16
|
-
|
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
|
-
|
5
|
+
DETAILED = true
|
6
|
+
SYMBOL = :near
|
6
7
|
|
7
8
|
def compile
|
8
|
-
|
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
|
13
|
-
|
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
|
-
|
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
|
@@ -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 <
|
5
|
-
|
4
|
+
class Root < MultiExpressionOperator
|
5
|
+
SYMBOL = :and # default operator for root
|
6
6
|
|
7
7
|
def compile
|
8
|
-
|
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 <
|
5
|
-
include DSL::
|
4
|
+
class SingleExpressionOperator < Operator
|
5
|
+
include DSL::Base
|
6
|
+
include DSL::BlockMethods
|
6
7
|
|
7
|
-
|
8
|
-
|
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
|
12
|
-
|
20
|
+
def <<(object)
|
21
|
+
self.child = object
|
13
22
|
end
|
14
23
|
|
15
24
|
def compile
|
16
|
-
"(#{ self.class
|
25
|
+
"(#{ self.class::SYMBOL }#{ boost } #{ child.compile self.class::DETAILED })" if child
|
17
26
|
end
|
18
27
|
|
19
28
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module CloudSesame
|
2
2
|
module Query
|
3
3
|
module AST
|
4
|
-
class Value
|
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::
|
6
|
-
include DSL::
|
7
|
-
include DSL::
|
8
|
-
include DSL::
|
9
|
-
|
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 ||= (
|
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
|
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
|
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
|
9
|
-
|
8
|
+
def dsl_scope
|
9
|
+
self
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
|
12
|
+
def dsl_context
|
13
|
+
dsl_scope.context
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
|
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
|