CloudSesame 0.4.6 → 0.5.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 +4 -1
- data/cloud_sesame.gemspec +2 -2
- data/lib/cloud_sesame/domain/base.rb +40 -30
- data/lib/cloud_sesame/query/ast/field_array.rb +4 -5
- data/lib/cloud_sesame/query/ast/literal.rb +11 -12
- data/lib/cloud_sesame/query/ast/multi_expression_operator.rb +4 -9
- data/lib/cloud_sesame/query/ast/near.rb +3 -1
- data/lib/cloud_sesame/query/ast/not.rb +3 -1
- data/lib/cloud_sesame/query/ast/root.rb +1 -1
- data/lib/cloud_sesame/query/ast/single_expression_operator.rb +3 -3
- data/lib/cloud_sesame/query/builder.rb +20 -12
- data/lib/cloud_sesame/query/domain/block.rb +65 -0
- data/lib/cloud_sesame/query/domain/chaining_block.rb +44 -0
- data/lib/cloud_sesame/query/domain/literal.rb +39 -0
- data/lib/cloud_sesame/query/dsl/block_methods.rb +6 -27
- data/lib/cloud_sesame/query/dsl/field_accessors.rb +24 -0
- data/lib/cloud_sesame/query/dsl/field_array_methods.rb +5 -9
- data/lib/cloud_sesame/query/dsl/filter_query_methods.rb +3 -3
- data/lib/cloud_sesame/query/dsl/operator_methods.rb +8 -15
- data/lib/cloud_sesame/query/dsl/range_methods.rb +4 -4
- data/lib/cloud_sesame/query/dsl/response_methods.rb +1 -1
- data/lib/cloud_sesame/query/dsl/scope_accessors.rb +28 -0
- data/lib/cloud_sesame/query/error/scope_not_defined.rb +8 -0
- data/lib/cloud_sesame/query/scope.rb +21 -0
- data/lib/cloud_sesame.rb +14 -7
- data/spec/cloud_sesame/query/ast/single_expression_operator_spec.rb +1 -1
- data/spec/cloud_sesame/query/dsl/block_methods_spec.rb +54 -70
- data/spec/cloud_sesame/query/dsl/{field_methods_spec.rb → field_accessors_spec.rb} +1 -1
- data/spec/cloud_sesame_spec.rb +35 -22
- metadata +30 -34
- data/lib/cloud_sesame/query/ast/block_chaining_relation.rb +0 -30
- data/lib/cloud_sesame/query/dsl/base.rb +0 -27
- data/lib/cloud_sesame/query/dsl/block_chaining_methods.rb +0 -26
- data/lib/cloud_sesame/query/dsl/field_methods.rb +0 -16
- data/lib/cloud_sesame/query/dsl/scope_methods.rb +0 -33
- data/spec/cloud_sesame/query/ast/block_chaining_relation_spec.rb +0 -44
- data/spec/cloud_sesame/query/dsl/base_spec.rb +0 -31
- data/spec/cloud_sesame/query/dsl/block_chaining_methods_spec.rb +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e496630f0f95249813a64396a44c5afb138ac417
|
4
|
+
data.tar.gz: 8b1ea78470d4452d2328fc3f64b7966064028e3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9fda75e99cc51ab852b0b08603d661c6ae9b554af033c6dbd1ecace4768a9f3d2067ff5ad31d138be426095d4222b697d2436c6e998fb31879932d97c3b5f3a
|
7
|
+
data.tar.gz: 398c9345b3d76df8114c2d83077749ed8923f22f4a8f21112b58fed691ca3a8b58d1e430923481e08632434ac3711723a5ae1437ecf77e2630e52e5b1e6da34c
|
data/Gemfile.lock
CHANGED
data/cloud_sesame.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'CloudSesame'
|
3
|
-
s.version = '0.
|
4
|
-
s.date = '2016-01
|
3
|
+
s.version = '0.5.0'
|
4
|
+
s.date = '2016-02-01'
|
5
5
|
s.summary = "AWS CloudSearch Query DSL"
|
6
6
|
s.description = "AWS CloudSearch Query DSL"
|
7
7
|
s.authors = ['Scott Chu', 'Emily Fan', 'Greg Ward', 'David McHoull',
|
@@ -3,11 +3,14 @@ module CloudSesame
|
|
3
3
|
class Base
|
4
4
|
extend Forwardable
|
5
5
|
|
6
|
-
attr_reader :searchable, :result
|
7
|
-
|
8
6
|
def_delegator :client, :config
|
9
7
|
|
10
|
-
|
8
|
+
attr_accessor :_caller
|
9
|
+
attr_reader :searchable
|
10
|
+
|
11
|
+
def self.definitions
|
12
|
+
@definitions ||= {}
|
13
|
+
end
|
11
14
|
|
12
15
|
def initialize(searchable)
|
13
16
|
@searchable = searchable
|
@@ -27,29 +30,28 @@ module CloudSesame
|
|
27
30
|
|
28
31
|
# DEFAULT CONTEXT METHODS
|
29
32
|
# =========================================
|
33
|
+
|
30
34
|
def default_size(value)
|
31
35
|
(context[:page] ||= {})[:size] = value
|
32
36
|
end
|
33
37
|
|
34
|
-
def field(name, options = {})
|
35
|
-
field_name = (options[:as] || name)
|
36
|
-
add_query field_name, options.delete(:query)
|
37
|
-
add_facet field_name, options.delete(:facet)
|
38
|
-
|
39
|
-
add_field_expression name.to_sym, options
|
40
|
-
end
|
41
|
-
|
42
38
|
def define_sloppiness(value)
|
43
39
|
(context[:query] ||= {})[:sloppiness] = value.to_i
|
44
40
|
end
|
45
41
|
|
46
|
-
def define_fuzziness(
|
47
|
-
block = proc unless block_given?
|
42
|
+
def define_fuzziness(&block)
|
48
43
|
(context[:query] ||= {})[:fuzziness] = Query::Node::Fuzziness.new(&block)
|
49
44
|
end
|
50
45
|
|
46
|
+
# TODO
|
51
47
|
def default_scope(proc, &block)
|
52
|
-
|
48
|
+
end
|
49
|
+
|
50
|
+
def field(name, options = {})
|
51
|
+
field_name = (options[:as] || name)
|
52
|
+
add_query field_name, options.delete(:query)
|
53
|
+
add_facet field_name, options.delete(:facet)
|
54
|
+
add_field name.to_sym, options
|
53
55
|
end
|
54
56
|
|
55
57
|
def scope(name, proc = nil, &block)
|
@@ -59,48 +61,56 @@ module CloudSesame
|
|
59
61
|
|
60
62
|
private
|
61
63
|
|
62
|
-
def
|
64
|
+
def to_hash(options)
|
63
65
|
options.is_a?(Hash) ? options : {}
|
64
66
|
end
|
65
67
|
|
66
68
|
def add_query(name, options)
|
67
|
-
((context[:query_options] ||= {})[:fields] ||= {})[name] =
|
69
|
+
((context[:query_options] ||= {})[:fields] ||= {})[name] = to_hash(options) if options
|
68
70
|
end
|
69
71
|
|
70
72
|
def add_facet(name, options)
|
71
|
-
(context[:facet] ||= {})[name] =
|
73
|
+
(context[:facet] ||= {})[name] = to_hash(options) if options
|
72
74
|
end
|
73
75
|
|
74
|
-
def
|
75
|
-
|
76
|
-
|
77
|
-
|
76
|
+
def add_field(name, options)
|
77
|
+
replace_existing_field name, options
|
78
|
+
create_default_literal name, options
|
79
|
+
create_field_accessor name
|
80
|
+
(context[:filter_query][:fields] ||= {})[name] = options
|
78
81
|
end
|
79
82
|
|
80
|
-
def
|
83
|
+
def replace_existing_field(name, options)
|
81
84
|
fields = ((context[:filter_query] ||= {})[:fields] ||= {})
|
82
85
|
if (as = options[:as]) && (existing = fields.delete(as))
|
83
86
|
options.merge! existing
|
84
87
|
end
|
85
88
|
end
|
86
89
|
|
87
|
-
def
|
90
|
+
def create_default_literal(name, options)
|
88
91
|
if (block = options.delete(:default))
|
89
|
-
|
92
|
+
caller = block.binding.eval "self"
|
93
|
+
node = Query::Domain::Literal.new(name, options, caller)._eval(&block)
|
94
|
+
filter_query_defaults << node
|
90
95
|
end
|
91
96
|
end
|
92
97
|
|
93
|
-
def
|
94
|
-
|
95
|
-
|
96
|
-
|
98
|
+
def filter_query_defaults
|
99
|
+
context[:filter_query][:defaults] ||= []
|
100
|
+
end
|
101
|
+
|
102
|
+
def create_field_accessor(name)
|
103
|
+
Query::DSL::FieldAccessors.send(:define_method, name) do |*values, &block|
|
104
|
+
literal name, *values, &block
|
97
105
|
end
|
98
106
|
end
|
99
107
|
|
100
108
|
def method_missing(name, *args, &block)
|
101
109
|
builder.send(name, *args, &block)
|
102
|
-
|
103
|
-
|
110
|
+
rescue NoMethodError => e
|
111
|
+
_caller.send(name, *args, &block) if _caller
|
112
|
+
rescue NoMethodError => e
|
113
|
+
super
|
104
114
|
end
|
105
115
|
|
106
116
|
end
|
@@ -4,8 +4,8 @@ module CloudSesame
|
|
4
4
|
class FieldArray < Array
|
5
5
|
include DSL::FieldArrayMethods
|
6
6
|
|
7
|
-
attr_accessor :
|
8
|
-
attr_reader :field
|
7
|
+
attr_accessor :_scope, :_return
|
8
|
+
attr_reader :field
|
9
9
|
|
10
10
|
def field=(field)
|
11
11
|
parents.clear
|
@@ -16,9 +16,8 @@ module CloudSesame
|
|
16
16
|
@parents ||= []
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
|
21
|
-
@dsl_scope = dsl_scope
|
19
|
+
def _context
|
20
|
+
_scope && _scope.context
|
22
21
|
end
|
23
22
|
|
24
23
|
def compile
|
@@ -9,18 +9,21 @@ module CloudSesame
|
|
9
9
|
attr_accessor :field
|
10
10
|
attr_reader :options, :value
|
11
11
|
|
12
|
-
def initialize(field, value, options = {}
|
13
|
-
@field = field
|
14
|
-
|
15
|
-
|
12
|
+
def initialize(field, value = nil, options = {})
|
13
|
+
@field, @options = field, options
|
14
|
+
self.value = value
|
15
|
+
end
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
def value=(value)
|
18
|
+
if value
|
19
|
+
@value = Value.parse value
|
20
|
+
is_included
|
21
|
+
end
|
19
22
|
end
|
20
23
|
|
21
24
|
def is_for(field, options = {})
|
22
25
|
@field = field
|
23
|
-
@options
|
26
|
+
@options.merge! options
|
24
27
|
end
|
25
28
|
|
26
29
|
def is_included
|
@@ -36,7 +39,7 @@ module CloudSesame
|
|
36
39
|
end
|
37
40
|
|
38
41
|
def compile(detailed = false)
|
39
|
-
detailed ? detailed_format : standard_format
|
42
|
+
(detailed ? detailed_format : standard_format) if value
|
40
43
|
end
|
41
44
|
|
42
45
|
private
|
@@ -57,10 +60,6 @@ module CloudSesame
|
|
57
60
|
"'#{ data.gsub(SINGLE_QUATE) { ESCAPE_QUATE } }'"
|
58
61
|
end
|
59
62
|
|
60
|
-
class ValueEvaluator
|
61
|
-
include DSL::RangeMethods
|
62
|
-
end
|
63
|
-
|
64
63
|
end
|
65
64
|
end
|
66
65
|
end
|
@@ -2,20 +2,15 @@ module CloudSesame
|
|
2
2
|
module Query
|
3
3
|
module AST
|
4
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::RangeMethods
|
11
|
-
include DSL::ScopeMethods
|
12
5
|
|
13
6
|
def children
|
14
7
|
@children ||= create_children
|
15
8
|
end
|
16
9
|
|
17
10
|
def compile
|
18
|
-
|
11
|
+
if !children.empty? && (compiled = children.compile) && !compiled.empty?
|
12
|
+
"(#{ symbol }#{ boost } #{ compiled })"
|
13
|
+
end
|
19
14
|
end
|
20
15
|
|
21
16
|
def <<(object)
|
@@ -30,7 +25,7 @@ module CloudSesame
|
|
30
25
|
|
31
26
|
def create_children
|
32
27
|
array = FieldArray.new
|
33
|
-
array.
|
28
|
+
array._scope = self
|
34
29
|
array
|
35
30
|
end
|
36
31
|
|
@@ -6,7 +6,9 @@ module CloudSesame
|
|
6
6
|
SYMBOL = :near
|
7
7
|
|
8
8
|
def compile(detailed = nil)
|
9
|
-
|
9
|
+
if child && (compiled = child.compile operator_detailed) && !compiled.empty?
|
10
|
+
"(#{ symbol }#{ boost }#{ distance } #{ compiled })"
|
11
|
+
end
|
10
12
|
end
|
11
13
|
|
12
14
|
def distance
|
@@ -2,8 +2,6 @@ module CloudSesame
|
|
2
2
|
module Query
|
3
3
|
module AST
|
4
4
|
class SingleExpressionOperator < Operator
|
5
|
-
include DSL::Base
|
6
|
-
include DSL::BlockMethods
|
7
5
|
|
8
6
|
DETAILED = false
|
9
7
|
|
@@ -22,7 +20,9 @@ module CloudSesame
|
|
22
20
|
end
|
23
21
|
|
24
22
|
def compile(detailed = nil)
|
25
|
-
|
23
|
+
if child && (compiled = child.compile operator_detailed) && !compiled.empty?
|
24
|
+
"(#{ symbol }#{ boost } #{ compiled })"
|
25
|
+
end
|
26
26
|
end
|
27
27
|
|
28
28
|
def operator_detailed
|
@@ -1,20 +1,17 @@
|
|
1
1
|
module CloudSesame
|
2
2
|
module Query
|
3
3
|
class Builder
|
4
|
-
include DSL::Base
|
5
|
-
include DSL::PageMethods
|
6
4
|
include DSL::QueryMethods
|
7
|
-
include DSL::
|
8
|
-
include DSL::SortMethods
|
9
|
-
|
10
|
-
# # Filter Query DSL
|
5
|
+
include DSL::ResponseMethods
|
11
6
|
include DSL::BlockMethods
|
12
|
-
include DSL::
|
7
|
+
include DSL::FieldAccessors
|
13
8
|
include DSL::FilterQueryMethods
|
14
|
-
include DSL::
|
15
|
-
include DSL::
|
9
|
+
include DSL::ScopeAccessors
|
10
|
+
include DSL::PageMethods
|
11
|
+
include DSL::SortMethods
|
12
|
+
include DSL::ReturnMethods
|
16
13
|
|
17
|
-
attr_reader :context
|
14
|
+
attr_reader :context
|
18
15
|
|
19
16
|
def initialize(context, searchable)
|
20
17
|
@context = Context.new.duplicate context
|
@@ -35,11 +32,22 @@ module CloudSesame
|
|
35
32
|
|
36
33
|
private
|
37
34
|
|
38
|
-
def
|
35
|
+
def _block_domain(block)
|
36
|
+
if block
|
37
|
+
caller = block.binding.eval("self")
|
38
|
+
Domain::Block.new caller, _context
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def _scope
|
39
43
|
request.filter_query.root
|
40
44
|
end
|
41
45
|
|
42
|
-
def
|
46
|
+
def _context
|
47
|
+
_scope.context
|
48
|
+
end
|
49
|
+
|
50
|
+
def _return
|
43
51
|
self
|
44
52
|
end
|
45
53
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module CloudSesame
|
2
|
+
module Query
|
3
|
+
module Domain
|
4
|
+
class Block
|
5
|
+
include DSL::BlockMethods
|
6
|
+
include DSL::FieldAccessors
|
7
|
+
include DSL::ScopeAccessors
|
8
|
+
include DSL::OperatorMethods
|
9
|
+
include DSL::RangeMethods
|
10
|
+
include DSL::FilterQueryMethods
|
11
|
+
|
12
|
+
attr_reader :_caller, :_context, :_scopes
|
13
|
+
|
14
|
+
def initialize(_caller, _context)
|
15
|
+
@_caller = _caller
|
16
|
+
@_context = _context
|
17
|
+
@_scopes = []
|
18
|
+
|
19
|
+
@_caller.instance_variables.each do |name|
|
20
|
+
value = @_caller.instance_variable_get name
|
21
|
+
instance_variable_set name, value
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def _eval(node, _scope, _return = _scope, &block)
|
27
|
+
_scopes.push node
|
28
|
+
|
29
|
+
# must build the subtree before push (<<) to it's
|
30
|
+
# parents (_scope) in order for the parent properly
|
31
|
+
# propagate message down to all the children.
|
32
|
+
# ===============================================
|
33
|
+
instance_eval &block
|
34
|
+
_scope << node
|
35
|
+
|
36
|
+
_scopes.pop
|
37
|
+
_scope.is_a?(AST::Root) ? _return : node
|
38
|
+
end
|
39
|
+
|
40
|
+
def _scope
|
41
|
+
_scopes[-1]
|
42
|
+
end
|
43
|
+
|
44
|
+
def _return
|
45
|
+
_scope
|
46
|
+
end
|
47
|
+
|
48
|
+
def _block_domain(block)
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# ACCESS CALLER'S METHODS
|
55
|
+
# =========================================
|
56
|
+
def method_missing(name, *args, &block)
|
57
|
+
_caller.send(name, *args, &block)
|
58
|
+
rescue NoMethodError
|
59
|
+
super
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module CloudSesame
|
2
|
+
module Query
|
3
|
+
module Domain
|
4
|
+
class ChainingBlock
|
5
|
+
|
6
|
+
attr_reader :_orphan_node, :_scope, :_return
|
7
|
+
|
8
|
+
def initialize(_orphan_node, _scope, _return, _block_domain)
|
9
|
+
@_orphan_node = _orphan_node
|
10
|
+
@_scope = _scope
|
11
|
+
@_return = _return
|
12
|
+
@_block_domain = _block_domain
|
13
|
+
end
|
14
|
+
|
15
|
+
# CLAUSE: NOT
|
16
|
+
# =========================================
|
17
|
+
|
18
|
+
def not(options = {}, &block)
|
19
|
+
raise missing_block unless block_given?
|
20
|
+
|
21
|
+
node = AST::Not.new _scope.context, options
|
22
|
+
_block_domain(block)._eval _orphan_node, node, &block
|
23
|
+
_scope << node
|
24
|
+
|
25
|
+
_return || node
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def _block_domain(block)
|
31
|
+
@_block_domain ||= (
|
32
|
+
caller = block.binding.eval("self")
|
33
|
+
Domain::Block.new caller, _scope.context
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def missing_block
|
38
|
+
Error::InvalidSyntax.new("#{ orphan_node.class::SYMBOL }.not requires a block")
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module CloudSesame
|
2
|
+
module Query
|
3
|
+
module Domain
|
4
|
+
class Literal
|
5
|
+
include DSL::RangeMethods
|
6
|
+
|
7
|
+
attr_reader :_name, :_options, :_caller
|
8
|
+
|
9
|
+
def initialize(_name, _options, _caller)
|
10
|
+
@_name = _name
|
11
|
+
@_options = _options
|
12
|
+
@_caller = _caller
|
13
|
+
|
14
|
+
_caller.instance_variables.each do |name|
|
15
|
+
value = _caller.instance_variable_get name
|
16
|
+
instance_variable_set name, value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def _eval(&block)
|
21
|
+
if block_given? && (_value = instance_exec &block)
|
22
|
+
AST::Literal.new _name, _value, _options
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# ACCESS CALLER'S METHODS
|
29
|
+
# =========================================
|
30
|
+
def method_missing(name, *args, &block)
|
31
|
+
_caller.send(name, *args, &block)
|
32
|
+
rescue NoMethodError
|
33
|
+
super
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -3,12 +3,10 @@ module CloudSesame
|
|
3
3
|
module DSL
|
4
4
|
module BlockMethods
|
5
5
|
|
6
|
-
attr_accessor :orphan_node
|
7
|
-
|
8
6
|
# CLAUSE: AND
|
9
7
|
# =========================================
|
10
8
|
def and(options = {}, &block)
|
11
|
-
|
9
|
+
_block_style_clause AST::And, options, &block
|
12
10
|
end
|
13
11
|
|
14
12
|
alias_method :all, :and
|
@@ -17,7 +15,7 @@ module CloudSesame
|
|
17
15
|
# CLAUSE: OR
|
18
16
|
# =========================================
|
19
17
|
def or(options = {}, &block)
|
20
|
-
|
18
|
+
_block_style_clause AST::Or, options, &block
|
21
19
|
end
|
22
20
|
|
23
21
|
alias_method :any, :or
|
@@ -25,34 +23,15 @@ module CloudSesame
|
|
25
23
|
|
26
24
|
private
|
27
25
|
|
28
|
-
def
|
29
|
-
node = klass.new
|
26
|
+
def _block_style_clause(klass, options, &block)
|
27
|
+
node = klass.new _context, options
|
30
28
|
if block_given?
|
31
|
-
|
32
|
-
node.instance_eval &block
|
33
|
-
dsl_scope << node
|
34
|
-
dsl_return node
|
29
|
+
_block_domain(block)._eval node, _scope, _return, &block
|
35
30
|
else
|
36
|
-
|
31
|
+
Domain::ChainingBlock.new node, _scope, (_return if _scope.is_a?(AST::Root)), _block_domain(nil)
|
37
32
|
end
|
38
33
|
end
|
39
34
|
|
40
|
-
def chaining_relation_for(node)
|
41
|
-
AST::BlockChainingRelation.new(dsl_scope, dsl_return, node)
|
42
|
-
end
|
43
|
-
|
44
|
-
def on_root_level?
|
45
|
-
dsl_scope.is_a?(AST::Root)
|
46
|
-
end
|
47
|
-
|
48
|
-
def extract_caller_from(block)
|
49
|
-
dsl_context[:caller] = block.binding.eval "self"
|
50
|
-
end
|
51
|
-
|
52
|
-
def method_missing(name, *args, &block)
|
53
|
-
dsl_caller ? dsl_caller.send(name, *args, &block) : super
|
54
|
-
end
|
55
|
-
|
56
35
|
end
|
57
36
|
end
|
58
37
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module CloudSesame
|
2
|
+
module Query
|
3
|
+
module DSL
|
4
|
+
module FieldAccessors
|
5
|
+
|
6
|
+
def literal(name, *values, &block)
|
7
|
+
name = name.to_sym
|
8
|
+
|
9
|
+
if block_given?
|
10
|
+
caller = block.binding.eval "self"
|
11
|
+
options = _scope.context[:fields][name]
|
12
|
+
node = Domain::Literal.new(name, options, caller)._eval(&block)
|
13
|
+
values << node
|
14
|
+
end
|
15
|
+
|
16
|
+
_scope.children.field = name
|
17
|
+
_scope.children._return = _return
|
18
|
+
_scope.children.insert values
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -38,10 +38,10 @@ module CloudSesame
|
|
38
38
|
|
39
39
|
def insert(values = [])
|
40
40
|
values.each do |value|
|
41
|
-
|
41
|
+
_scope << create_parents(build_literal(value))
|
42
42
|
end
|
43
43
|
parents.clear unless values.empty?
|
44
|
-
|
44
|
+
_return != _scope ? _return : self
|
45
45
|
end
|
46
46
|
|
47
47
|
private
|
@@ -52,7 +52,7 @@ module CloudSesame
|
|
52
52
|
|
53
53
|
def create_parents(child)
|
54
54
|
parents.compact.each do |parent|
|
55
|
-
node = parent[:klass].new
|
55
|
+
node = parent[:klass].new _context, parent[:options]
|
56
56
|
node << child
|
57
57
|
child = node
|
58
58
|
end
|
@@ -61,17 +61,13 @@ module CloudSesame
|
|
61
61
|
|
62
62
|
def build_literal(value)
|
63
63
|
if value.kind_of?(AST::SingleExpressionOperator) || value.is_a?(AST::Literal)
|
64
|
-
value.is_for field,
|
64
|
+
value.is_for field, _context[:fields][field]
|
65
65
|
value
|
66
66
|
else
|
67
|
-
AST::Literal.new field, value,
|
67
|
+
AST::Literal.new field, value, _context[:fields][field]
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
def field_options
|
72
|
-
dsl_context[:fields][field]
|
73
|
-
end
|
74
|
-
|
75
71
|
end
|
76
72
|
end
|
77
73
|
end
|