CloudSesame 0.1.6 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|