CloudSesame 0.4.6 → 0.5.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 +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
|