graphoid 0.0.2 → 0.0.4
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/README.md +46 -32
- data/Rakefile +2 -6
- data/lib/graphoid/argument.rb +3 -0
- data/lib/graphoid/config.rb +2 -0
- data/lib/graphoid/definitions/filters.rb +7 -8
- data/lib/graphoid/definitions/inputs.rb +8 -6
- data/lib/graphoid/definitions/orders.rb +5 -5
- data/lib/graphoid/definitions/types.rb +46 -40
- data/lib/graphoid/drivers/active_record.rb +37 -37
- data/lib/graphoid/drivers/mongoid.rb +75 -53
- data/lib/graphoid/graphield.rb +6 -6
- data/lib/graphoid/grapho.rb +2 -0
- data/lib/graphoid/main.rb +6 -4
- data/lib/graphoid/mapper.rb +5 -2
- data/lib/graphoid/mutations/create.rb +12 -14
- data/lib/graphoid/mutations/delete.rb +12 -14
- data/lib/graphoid/mutations/processor.rb +3 -1
- data/lib/graphoid/mutations/structure.rb +2 -0
- data/lib/graphoid/mutations/update.rb +2 -0
- data/lib/graphoid/operators/attribute.rb +6 -5
- data/lib/graphoid/operators/inherited/belongs_to.rb +10 -8
- data/lib/graphoid/operators/inherited/embeds_many.rb +17 -3
- data/lib/graphoid/operators/inherited/embeds_one.rb +17 -3
- data/lib/graphoid/operators/inherited/has_many.rb +4 -2
- data/lib/graphoid/operators/inherited/has_one.rb +9 -7
- data/lib/graphoid/operators/inherited/many_to_many.rb +4 -2
- data/lib/graphoid/operators/relation.rb +8 -9
- data/lib/graphoid/queries/operation.rb +2 -0
- data/lib/graphoid/queries/processor.rb +7 -5
- data/lib/graphoid/queries/queries.rb +16 -17
- data/lib/graphoid/scalars.rb +28 -26
- data/lib/graphoid/utils.rb +6 -4
- data/lib/graphoid/version.rb +3 -1
- data/lib/graphoid.rb +2 -0
- metadata +15 -28
@@ -1,68 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
module MongoidDriver
|
3
5
|
class << self
|
4
|
-
def through?(
|
6
|
+
def through?(_type)
|
5
7
|
false
|
6
8
|
end
|
7
9
|
|
10
|
+
def mongo_constants
|
11
|
+
begin
|
12
|
+
{
|
13
|
+
many_to_many: Mongoid::Relations::Referenced::ManyToMany,
|
14
|
+
has_many: Mongoid::Relations::Referenced::Many,
|
15
|
+
belongs_to: Mongoid::Relations::Referenced::In,
|
16
|
+
has_one: Mongoid::Relations::Referenced::One,
|
17
|
+
embeds_one: Mongoid::Relations::Embedded::One,
|
18
|
+
embeds_many: Mongoid::Relations::Embedded::Many,
|
19
|
+
embedded_in: Mongoid::Relations::Embedded::In
|
20
|
+
}
|
21
|
+
rescue
|
22
|
+
{
|
23
|
+
many_to_many: Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy,
|
24
|
+
has_many: Mongoid::Association::Referenced::HasMany::Proxy,
|
25
|
+
belongs_to: Mongoid::Association::Referenced::BelongsTo::Proxy,
|
26
|
+
has_one: Mongoid::Association::Referenced::HasOne::Proxy,
|
27
|
+
embeds_one: Mongoid::Association::Embedded::EmbedsOne::Proxy,
|
28
|
+
embeds_many: Mongoid::Association::Embedded::EmbedsMany::Proxy,
|
29
|
+
embedded_in: Mongoid::Association::Embedded::EmbeddedIn::Proxy
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
8
34
|
def has_and_belongs_to_many?(type)
|
9
|
-
type ==
|
35
|
+
type == mongo_constants[:many_to_many]
|
10
36
|
end
|
11
37
|
|
12
38
|
def has_many?(type)
|
13
|
-
type ==
|
39
|
+
type == mongo_constants[:has_many]
|
14
40
|
end
|
15
41
|
|
16
42
|
def belongs_to?(type)
|
17
|
-
type ==
|
43
|
+
type == mongo_constants[:belongs_to]
|
44
|
+
|
18
45
|
end
|
19
46
|
|
20
47
|
def has_one?(type)
|
21
|
-
type ==
|
48
|
+
type == mongo_constants[:has_one]
|
22
49
|
end
|
23
50
|
|
24
51
|
def embeds_one?(type)
|
25
|
-
type ==
|
52
|
+
type == mongo_constants[:embeds_one]
|
26
53
|
end
|
27
54
|
|
28
55
|
def embeds_many?(type)
|
29
|
-
type ==
|
56
|
+
type == mongo_constants[:embeds_many]
|
30
57
|
end
|
31
58
|
|
32
59
|
def embedded_in?(type)
|
33
|
-
type ==
|
60
|
+
type == mongo_constants[:embedded_in]
|
34
61
|
end
|
35
62
|
|
36
63
|
def types_map
|
37
64
|
{
|
38
|
-
BSON::ObjectId
|
65
|
+
BSON::ObjectId => GraphQL::Types::ID,
|
39
66
|
Mongoid::Boolean => GraphQL::Types::Boolean,
|
40
|
-
#Graphoid::Upload
|
67
|
+
# Graphoid::Upload => ApolloUploadServer::Upload,
|
41
68
|
|
42
|
-
Boolean
|
43
|
-
Float
|
44
|
-
Integer
|
45
|
-
String
|
46
|
-
Object
|
47
|
-
Symbol
|
69
|
+
Boolean => GraphQL::Types::Boolean,
|
70
|
+
Float => GraphQL::Types::Float,
|
71
|
+
Integer => GraphQL::Types::Int,
|
72
|
+
String => GraphQL::Types::String,
|
73
|
+
Object => GraphQL::Types::String,
|
74
|
+
Symbol => GraphQL::Types::String,
|
48
75
|
|
49
76
|
DateTime => Graphoid::Scalars::DateTime,
|
50
|
-
Time
|
51
|
-
Date
|
52
|
-
Array
|
53
|
-
Hash
|
77
|
+
Time => Graphoid::Scalars::DateTime,
|
78
|
+
Date => Graphoid::Scalars::DateTime,
|
79
|
+
Array => Graphoid::Scalars::Array,
|
80
|
+
Hash => Graphoid::Scalars::Hash
|
54
81
|
}
|
55
82
|
end
|
56
83
|
|
57
84
|
def class_of(relation)
|
58
85
|
{
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
86
|
+
mongo_constants[:many_to_many] => ManyToMany,
|
87
|
+
mongo_constants[:has_many] => HasMany,
|
88
|
+
mongo_constants[:has_one] => HasOne,
|
89
|
+
mongo_constants[:belongs_to] => BelongsTo,
|
90
|
+
mongo_constants[:embeds_many] => EmbedsMany,
|
91
|
+
mongo_constants[:embeds_one] => EmbedsOne,
|
92
|
+
mongo_constants[:embedded_in] => Relation
|
66
93
|
}[relation.relation] || Relation
|
67
94
|
end
|
68
95
|
|
@@ -88,10 +115,10 @@ module Graphoid
|
|
88
115
|
|
89
116
|
def eager_load(selection, model)
|
90
117
|
referenced_relations = [
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
118
|
+
mongo_constants[:many_to_many],
|
119
|
+
mongo_constants[:has_many],
|
120
|
+
mongo_constants[:has_one],
|
121
|
+
mongo_constants[:belongs_to]
|
95
122
|
]
|
96
123
|
|
97
124
|
properties = Graphoid::Queries::Processor.children_of(selection)
|
@@ -108,7 +135,7 @@ module Graphoid
|
|
108
135
|
if (relations & children).empty?
|
109
136
|
model = model.includes(name)
|
110
137
|
else
|
111
|
-
model = model.includes(name, with: ->
|
138
|
+
model = model.includes(name, with: ->(instance) { Graphoid::Queries::Processor.eager_load(subselection, instance) })
|
112
139
|
end
|
113
140
|
end
|
114
141
|
|
@@ -126,17 +153,18 @@ module Graphoid
|
|
126
153
|
scope.any_of(list)
|
127
154
|
end
|
128
155
|
|
129
|
-
def parse(attribute, value, operator)
|
156
|
+
def parse(attribute, value, operator, prefix = nil)
|
130
157
|
field = attribute.name
|
158
|
+
field = "#{prefix}.#{field}" if prefix
|
131
159
|
parsed = {}
|
132
160
|
case operator
|
133
|
-
when
|
161
|
+
when 'gt', 'gte', 'lt', 'lte', 'in', 'nin'
|
134
162
|
parsed[field.to_sym.send(operator)] = value
|
135
|
-
when
|
163
|
+
when 'regex'
|
136
164
|
parsed[field.to_sym] = Regexp.new(value.to_s, Regexp::IGNORECASE)
|
137
|
-
when
|
165
|
+
when 'contains'
|
138
166
|
parsed[field.to_sym] = Regexp.new(Regexp.quote(value.to_s), Regexp::IGNORECASE)
|
139
|
-
when
|
167
|
+
when 'not'
|
140
168
|
if value.present? && !value.is_a?(Numeric)
|
141
169
|
parsed[field.to_sym.send(operator)] = Regexp.new(Regexp.quote(value.to_s), Regexp::IGNORECASE)
|
142
170
|
else
|
@@ -167,17 +195,11 @@ module Graphoid
|
|
167
195
|
field = relation.name
|
168
196
|
parsed = {}
|
169
197
|
|
170
|
-
if relation.embeds_one?
|
171
|
-
parsed = relate_embedded(scope, relation, value)
|
172
|
-
end
|
198
|
+
parsed = relate_embedded(scope, relation, value) if relation.embeds_one?
|
173
199
|
|
174
|
-
if relation.belongs_to?
|
175
|
-
parsed = relation.exec(scope, value)
|
176
|
-
end
|
200
|
+
parsed = relation.exec(scope, value) if relation.belongs_to?
|
177
201
|
|
178
|
-
if relation.has_one?
|
179
|
-
parsed = relation.exec(scope, value)
|
180
|
-
end
|
202
|
+
parsed = relation.exec(scope, value) if relation.has_one?
|
181
203
|
|
182
204
|
parsed
|
183
205
|
end
|
@@ -191,20 +213,20 @@ module Graphoid
|
|
191
213
|
end
|
192
214
|
|
193
215
|
if relation.many_to_many?
|
194
|
-
field_name = field_name.to_s.singularize +
|
195
|
-
ids = target.map(&
|
216
|
+
field_name = field_name.to_s.singularize + '_ids'
|
217
|
+
ids = target.map(&field_name.to_sym)
|
196
218
|
ids.flatten!.uniq!
|
197
219
|
else
|
198
|
-
field_name = field_name.to_s +
|
199
|
-
ids = target.map(&
|
220
|
+
field_name = field_name.to_s + '_id'
|
221
|
+
ids = target.map(&field_name.to_sym)
|
200
222
|
end
|
201
223
|
|
202
224
|
parsed = {}
|
203
|
-
if operator ==
|
225
|
+
if operator == 'none'
|
204
226
|
parsed[:id.nin] = ids
|
205
|
-
elsif operator ==
|
227
|
+
elsif operator == 'some'
|
206
228
|
parsed[:id.in] = ids
|
207
|
-
elsif operator ==
|
229
|
+
elsif operator == 'every'
|
208
230
|
# missing implementation
|
209
231
|
end
|
210
232
|
parsed
|
data/lib/graphoid/graphield.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
module Graphield
|
3
5
|
extend ActiveSupport::Concern
|
@@ -7,20 +9,18 @@ module Graphoid
|
|
7
9
|
@forbidden = {}
|
8
10
|
|
9
11
|
class << self
|
10
|
-
def graphield
|
12
|
+
def graphield(name, type)
|
11
13
|
@graphields << Graphoid::Attribute.new(name: name.to_s, type: type)
|
12
14
|
end
|
13
15
|
|
14
|
-
def graphorbid
|
16
|
+
def graphorbid(field, *actions)
|
15
17
|
@forbidden[field] = actions
|
16
18
|
end
|
17
19
|
|
18
|
-
|
19
|
-
@graphields
|
20
|
-
end
|
20
|
+
attr_reader :graphields
|
21
21
|
|
22
22
|
def graphfiles
|
23
|
-
@graphields.select{ |field| field.type == Graphoid::Upload }
|
23
|
+
@graphields.select { |field| field.type == Graphoid::Upload }
|
24
24
|
end
|
25
25
|
|
26
26
|
def forbidden_fields
|
data/lib/graphoid/grapho.rb
CHANGED
data/lib/graphoid/main.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
|
-
|
4
|
+
@graphs = {}
|
3
5
|
|
4
6
|
class << self
|
5
|
-
|
7
|
+
attr_reader :driver
|
6
8
|
|
7
9
|
def initialize
|
8
10
|
Graphoid.driver = configuration&.driver
|
@@ -10,8 +12,8 @@ module Graphoid
|
|
10
12
|
Graphoid::Scalars.generate
|
11
13
|
end
|
12
14
|
|
13
|
-
def build(model,
|
14
|
-
|
15
|
+
def build(model, _action = nil)
|
16
|
+
@graphs[model] ||= Graphoid::Grapho.new(model)
|
15
17
|
end
|
16
18
|
|
17
19
|
def driver=(driver)
|
data/lib/graphoid/mapper.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
module Mapper
|
3
5
|
class << self
|
4
|
-
def convert
|
5
|
-
return GraphQL::Types::ID if field.name.end_with?(
|
6
|
+
def convert(field)
|
7
|
+
return GraphQL::Types::ID if field.name.end_with?('id')
|
8
|
+
|
6
9
|
Graphoid.driver.types_map[field.type] || GraphQL::Types::String
|
7
10
|
end
|
8
11
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
module Mutations
|
3
5
|
module Create
|
@@ -22,25 +24,21 @@ module Graphoid
|
|
22
24
|
|
23
25
|
type.class_eval do
|
24
26
|
define_method :"#{name}" do |data: {}|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
GraphQL::ExecutionError.new(ex.message)
|
30
|
-
end
|
27
|
+
user = context[:current_user]
|
28
|
+
Graphoid::Mutations::Processor.execute(model, grapho, data, user)
|
29
|
+
rescue Exception => ex
|
30
|
+
GraphQL::ExecutionError.new(ex.message)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
type.class_eval do
|
35
35
|
define_method :"#{plural_name}" do |data: []|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
GraphQL::ExecutionError.new(ex.message)
|
43
|
-
end
|
36
|
+
user = context[:current_user]
|
37
|
+
result = []
|
38
|
+
data.each { |d| result << Graphoid::Mutations::Processor.execute(model, grapho, d, user) }
|
39
|
+
result
|
40
|
+
rescue Exception => ex
|
41
|
+
GraphQL::ExecutionError.new(ex.message)
|
44
42
|
end
|
45
43
|
end
|
46
44
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
module Mutations
|
3
5
|
module Delete
|
@@ -22,25 +24,21 @@ module Graphoid
|
|
22
24
|
|
23
25
|
type.class_eval do
|
24
26
|
define_method :"#{name}" do |id:|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
GraphQL::ExecutionError.new(ex.message)
|
31
|
-
end
|
27
|
+
result = model.find(id)
|
28
|
+
result.destroy!
|
29
|
+
result
|
30
|
+
rescue Exception => ex
|
31
|
+
GraphQL::ExecutionError.new(ex.message)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
type.class_eval do
|
36
36
|
define_method :"#{plural}" do |where: {}|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
GraphQL::ExecutionError.new(ex.message)
|
43
|
-
end
|
37
|
+
objects = Graphoid::Queries::Processor.execute(model, where.to_h)
|
38
|
+
objects.destroy_all
|
39
|
+
objects.all.to_a
|
40
|
+
rescue Exception => ex
|
41
|
+
GraphQL::ExecutionError.new(ex.message)
|
44
42
|
end
|
45
43
|
end
|
46
44
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
module Mutations
|
3
5
|
module Processor
|
@@ -11,7 +13,7 @@ module Graphoid
|
|
11
13
|
root_object << item if item.present?
|
12
14
|
end
|
13
15
|
|
14
|
-
root_object = root_object.reduce(
|
16
|
+
root_object = root_object.reduce({}, :merge)
|
15
17
|
|
16
18
|
fieldnames = Attribute.fieldnames_of(model)
|
17
19
|
root_object['created_by_id'] = user.id if fieldnames.include?('created_by_id')
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
class Attribute
|
3
5
|
attr_reader :name, :type
|
4
6
|
|
5
|
-
PERMS = [
|
7
|
+
PERMS = %i[read create update delete]
|
6
8
|
|
7
9
|
def initialize(name:, type:)
|
8
10
|
@name = name.to_s
|
@@ -21,13 +23,12 @@ module Graphoid
|
|
21
23
|
def relation?
|
22
24
|
false
|
23
25
|
end
|
24
|
-
|
26
|
+
|
25
27
|
def precreate(value)
|
26
|
-
{
|
28
|
+
{ name.to_sym => value }
|
27
29
|
end
|
28
30
|
|
29
|
-
def create(_,_,_)
|
30
|
-
end
|
31
|
+
def create(_, _, _); end
|
31
32
|
|
32
33
|
class << self
|
33
34
|
def fields_of(model, action = :read)
|
@@ -1,15 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
class BelongsTo < Relation
|
3
5
|
def precreate(value)
|
4
|
-
sanitized = Attribute.correct(
|
5
|
-
foreign_id =
|
6
|
-
{ :"#{
|
6
|
+
sanitized = Attribute.correct(klass, value)
|
7
|
+
foreign_id = klass.create!(sanitized).id
|
8
|
+
{ :"#{name}_id" => foreign_id }
|
7
9
|
end
|
8
|
-
|
10
|
+
|
9
11
|
def exec(_, value)
|
10
|
-
ids = Graphoid::Queries::Processor.execute(
|
11
|
-
attribute = Attribute.new(name: "#{
|
12
|
-
Graphoid.driver.parse(attribute, ids,
|
12
|
+
ids = Graphoid::Queries::Processor.execute(klass, value).to_a.map(&:id)
|
13
|
+
attribute = Attribute.new(name: "#{name.underscore}_id", type: nil)
|
14
|
+
Graphoid.driver.parse(attribute, ids, 'in')
|
13
15
|
end
|
14
16
|
end
|
15
|
-
end
|
17
|
+
end
|
@@ -1,10 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
class EmbedsMany < Relation
|
3
5
|
def create(parent, values, _)
|
4
6
|
values.each do |value|
|
5
|
-
attributes = Attribute.correct(
|
6
|
-
parent.send(:"#{
|
7
|
+
attributes = Attribute.correct(klass, value)
|
8
|
+
parent.send(:"#{name}").create!(attributes)
|
7
9
|
end
|
8
10
|
end
|
11
|
+
|
12
|
+
def exec(_scope, value)
|
13
|
+
_hash = {}
|
14
|
+
|
15
|
+
value.each do |key, _value|
|
16
|
+
operation = Operation.new(klass, key, _value)
|
17
|
+
parsed = Graphoid.driver.parse(operation.operand, operation.value, operation.operator, klass.to_s.underscore.pluralize)
|
18
|
+
_hash.merge!(parsed)
|
19
|
+
end
|
20
|
+
|
21
|
+
_hash
|
22
|
+
end
|
9
23
|
end
|
10
|
-
end
|
24
|
+
end
|
@@ -1,8 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
class EmbedsOne < Relation
|
3
5
|
def create(parent, value, _)
|
4
|
-
attrs = Attribute.correct(
|
5
|
-
parent.send(:"#{
|
6
|
+
attrs = Attribute.correct(klass, value)
|
7
|
+
parent.send(:"#{name}=", attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def exec(_scope, value)
|
11
|
+
_hash = {}
|
12
|
+
|
13
|
+
value.each do |key, _value|
|
14
|
+
operation = Operation.new(klass, key, _value)
|
15
|
+
parsed = Graphoid.driver.parse(operation.operand, operation.value, operation.operator, klass.to_s.underscore)
|
16
|
+
_hash.merge!(parsed)
|
17
|
+
end
|
18
|
+
|
19
|
+
_hash
|
6
20
|
end
|
7
21
|
end
|
8
|
-
end
|
22
|
+
end
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
class HasMany < Relation
|
3
5
|
def create(parent, values, grapho)
|
4
6
|
values.each do |value|
|
5
|
-
attributes = Attribute.correct(
|
7
|
+
attributes = Attribute.correct(klass, value)
|
6
8
|
attributes[:"#{grapho.name}_id"] = parent.id
|
7
|
-
|
9
|
+
klass.create!(attributes)
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -1,16 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
class HasOne < Relation
|
3
5
|
def create(parent, value, grapho)
|
4
|
-
attributes = Attribute.correct(
|
6
|
+
attributes = Attribute.correct(klass, value)
|
5
7
|
attributes[:"#{grapho.name}_id"] = parent.id
|
6
|
-
|
8
|
+
klass.create!(attributes)
|
7
9
|
end
|
8
|
-
|
10
|
+
|
9
11
|
def exec(scope, value)
|
10
|
-
field_name =
|
11
|
-
ids = Graphoid::Queries::Processor.execute(
|
12
|
-
attribute = Attribute.new(name:
|
13
|
-
Graphoid.driver.parse(attribute, ids,
|
12
|
+
field_name = inverse_name || scope.name.underscore
|
13
|
+
ids = Graphoid::Queries::Processor.execute(klass, value).to_a.map(&"#{field_name}_id".to_sym)
|
14
|
+
attribute = Attribute.new(name: 'id', type: nil)
|
15
|
+
Graphoid.driver.parse(attribute, ids, 'in')
|
14
16
|
end
|
15
17
|
end
|
16
18
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
class ManyToMany < Relation
|
3
5
|
def create(parent, values, grapho)
|
4
6
|
values.each do |value|
|
5
|
-
attributes = Attribute.correct(
|
7
|
+
attributes = Attribute.correct(klass, value)
|
6
8
|
attributes[:"#{grapho.name}_ids"] = [parent.id]
|
7
|
-
|
9
|
+
klass.create!(attributes)
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module Graphoid
|
3
4
|
class Relation
|
4
5
|
attr_reader :name, :klass, :type, :inverse_name
|
5
6
|
|
@@ -11,7 +12,7 @@ module Graphoid
|
|
11
12
|
@type = Graphoid.driver.relation_type(relation)
|
12
13
|
end
|
13
14
|
|
14
|
-
[
|
15
|
+
%i[has_and_belongs_to_many through has_many belongs_to has_one embeds_one embeds_many embedded_in].each do |type|
|
15
16
|
type = :"#{type}?"
|
16
17
|
define_method type do
|
17
18
|
Graphoid.driver.send(type, @type)
|
@@ -43,19 +44,17 @@ module Graphoid
|
|
43
44
|
embeds_one? || embeds_many? || embedded_in?
|
44
45
|
end
|
45
46
|
|
46
|
-
def precreate(_)
|
47
|
-
|
48
|
-
|
49
|
-
def create(_,_,_)
|
50
|
-
end
|
47
|
+
def precreate(_); end
|
48
|
+
|
49
|
+
def create(_, _, _); end
|
51
50
|
|
52
51
|
def resolve(operation)
|
53
|
-
if one?
|
52
|
+
if one? || operation.operand.embedded?
|
54
53
|
return operation.operand.exec(operation.scope, operation.value)
|
55
54
|
end
|
56
55
|
|
57
56
|
if many?
|
58
|
-
return Graphoid.driver.relate_many(
|
57
|
+
return Graphoid.driver.relate_many(operation.scope, operation.operand, operation.value, operation.operator)
|
59
58
|
end
|
60
59
|
end
|
61
60
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Graphoid
|
2
4
|
module Queries
|
3
5
|
module Processor
|
@@ -8,7 +10,7 @@ module Graphoid
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def execute_array(scope, list, action)
|
11
|
-
if action ==
|
13
|
+
if action == 'OR'
|
12
14
|
scope = Graphoid.driver.execute_or(scope, list)
|
13
15
|
else
|
14
16
|
list.each { |object| scope = execute(scope, object) }
|
@@ -17,7 +19,7 @@ module Graphoid
|
|
17
19
|
end
|
18
20
|
|
19
21
|
def process(scope, value, key = nil)
|
20
|
-
if key && [
|
22
|
+
if key && %w[OR AND].exclude?(key)
|
21
23
|
operation = Operation.new(scope, key, value)
|
22
24
|
filter = operation.resolve
|
23
25
|
return Graphoid.driver.execute_and(scope, filter)
|
@@ -25,12 +27,12 @@ module Graphoid
|
|
25
27
|
|
26
28
|
if operation.nil? || operation.type == :attribute
|
27
29
|
return execute(scope, value) if value.is_a?(Hash)
|
28
|
-
if value.is_a?(Array) && [
|
29
|
-
return execute_array(scope, value, key)
|
30
|
+
if value.is_a?(Array) && %w[in nin].exclude?(operation&.operator)
|
31
|
+
return execute_array(scope, value, key)
|
30
32
|
end
|
31
33
|
end
|
32
34
|
end
|
33
|
-
|
35
|
+
|
34
36
|
def children_of(selection)
|
35
37
|
selection.scoped_children.values[0]
|
36
38
|
end
|