solis 0.72.0 → 0.73.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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/solis/model.rb +130 -39
  3. data/lib/solis/version.rb +1 -1
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa7c729b1acbe8c1881ebf3cc00ac228830bf04d269447f55b2f029c7eef703c
4
- data.tar.gz: 81ceb99f9f6284b8c4163bfe4d263f6703edbe1733eb42fcc6c31530be2c8d91
3
+ metadata.gz: a91e5038f9e0a152b51ad35d25c6bdd99ef383bfb0da8fb7baf1d08baddbf49a
4
+ data.tar.gz: b4b1a434aae6a337358815e8b0dc5ff37edea7e0ffb56d85a9d7d1590677ea92
5
5
  SHA512:
6
- metadata.gz: 6a5fe949952a2931c1189644690446ddc0b63ca719eb2f4b15f5cab83779d81b50872c3b57d4b677278cc4c6ca1e54ff8f14ff4b8c09ce842e8e5a3226835177
7
- data.tar.gz: 03af55e0505d6e987522e8d799450be43a83b9968c60f7741b7c5bb2d75f0874d7d127b955f31ad028a35b2993b2ecdefb91653edf5e9941c4e7dfc796658696
6
+ metadata.gz: 35f713d36e731ac83203fec6f3d82bd6ad5f321c68ccf1424fd8f0c6b82183392e2c76d62cdd7eac6542318810c62940d9a4e1badb5dd817177509bf65753c9e
7
+ data.tar.gz: 5a9efc223d46e01936aed52e649e856344c7847307f6a39d7b094b48d2b553542a8059ce846bd483634cfb7046f9ab9646ed2130bab81de5c196b43af48b95c2
data/lib/solis/model.rb CHANGED
@@ -71,9 +71,9 @@ module Solis
71
71
  def query
72
72
  raise "I need a SPARQL endpoint" if self.class.sparql_endpoint.nil?
73
73
 
74
- #before_read_proc&.call(self)
74
+ # before_read_proc&.call(self)
75
75
  result = Solis::Query.new(self)
76
- #after_read_proc&.call(result)
76
+ # after_read_proc&.call(result)
77
77
  result
78
78
  end
79
79
 
@@ -111,7 +111,7 @@ module Solis
111
111
  sparql = SPARQL::Client.new(self.class.sparql_endpoint)
112
112
 
113
113
  raise Solis::Error::QueryError, "#{self.id} is still referenced, refusing to delete" if is_referenced?(sparql)
114
- #sparql.query('delete{}')
114
+ # sparql.query('delete{}')
115
115
  before_delete_proc&.call(self)
116
116
  # graph = as_graph(self, false)
117
117
  # Solis::LOGGER.info graph.dump(:ttl) if ConfigFile[:debug]
@@ -136,8 +136,8 @@ values ?s {<#{self.graph_id}>}
136
136
 
137
137
  before_create_proc&.call(self)
138
138
 
139
- if exists?(sparql)
140
- data = Model.properties_to_hash(self)
139
+ if self.exists?(sparql)
140
+ data = properties_to_hash(self)
141
141
 
142
142
  result = update(data)
143
143
  else
@@ -174,46 +174,139 @@ values ?s {<#{self.graph_id}>}
174
174
  updated_klass = original_klass.deep_dup
175
175
 
176
176
  attributes.each_pair do |key, value|
177
+ if value.is_a?(Hash)
178
+ embedded = self.class.graph.shape_as_model(original_klass.class.metadata[:attributes][key][:datatype].to_s).new(value)
179
+ if embedded.exists?(sparql)
180
+ embedded_data = properties_to_hash(embedded)
181
+ embedded.update(embedded_data)
182
+ else
183
+ embedded.save
184
+ end
185
+ end
186
+
177
187
  updated_klass.instance_variable_set("@#{key}", value)
178
188
  end
179
189
 
190
+ # attributes.each_pair do |key, value|
191
+ # updated_klass.instance_variable_set("@#{key}", value)
192
+ # end
193
+ # properties_original_klass=Model.properties_to_hash(original_klass)
194
+ # properties_updated_klass = Model.properties_to_hash(updated_klass)
195
+ # changes = Hashdiff.diff(properties_original_klass, properties_updated_klass)
196
+ # pp changes
197
+ #
198
+ # #a=self.class.graph.shape_as_model('Identificatienummer').new
199
+ # changes.each do |change|
200
+ # change_type = change[0]
201
+ # original_change_entity = change[1]
202
+ # change_entity = original_change_entity.split('.').last
203
+ # change[1] = change_object
204
+ # data = change[2]
205
+ #
206
+ # case change_type
207
+ # when '+' # new
208
+ # new_entity_hash = {} #self.class.graph.shape_as_model(change_object.classify).new
209
+ # Hashdiff.patch!(new_entity_hash, [change])
210
+ #
211
+ # new_entity = self.class.graph.shape_as_model(change_entity.classify).new(new_entity_hash[change_entity])
212
+ # new_entity.save
213
+ # when '-' # delete
214
+ # when '~' # change
215
+ # else
216
+ # raise RuntimeError, "Unknown change type(#{change_type}) for #{change[1]}"
217
+ # end
218
+ #
219
+ # end
220
+
221
+ # attributes.each_pair do |key, value|
222
+ # updated_klass.instance_variable_set("@#{key}", value)
223
+ # unless original_klass.class.metadata[:attributes][key][:node_kind].nil?
224
+ # inner_model = self.class.graph.shape_as_model(original_klass.class.metadata[:attributes][key][:datatype].to_s)
225
+ # if value.is_a?(Hash)
226
+ # value.each_pair do |inner_key, inner_value|
227
+ # next unless inner_model.metadata[:attributes][inner_key][:node_kind].is_a?(RDF::URI)
228
+ # inner_inner_model = self.class.graph.shape_as_model(inner_model.metadata[:attributes][inner_key][:datatype].to_s)
229
+ # # if inner_inner_model.class.ancestors.include?(Codetabel) && inner_value.key?('id')
230
+ # # inner_data = inner_inner_model.query.filter({ language: nil, filters: { id: [inner_value['id']] } }).find_all.map { |m| m }&.first
231
+ # # else
232
+ # inner_value = inner_value.first if inner_value.is_a?(Array)
233
+ # inner_data = inner_inner_model.new(inner_value)
234
+ # inner_data.save
235
+ # # end
236
+ # end
237
+ # elsif value.is_a?(Array)
238
+ # data = value.map do |m|
239
+ # if m.is_a?(Hash)
240
+ # m.each do |inner_key, inner_value|
241
+ # #next if inner_model.metadata[:attributes][inner_key][:class].nil?
242
+ # next unless inner_model.metadata[:attributes][inner_key][:node_kind].is_a?(RDF::URI)
243
+ # inner_inner_model = self.class.graph.shape_as_model(inner_model.class.metadata[:attributes][inner_key][:datatype].to_s)
244
+ # # if inner_inner_model.class.ancestors.include?(Codetabel) && inner_value.key?('id')
245
+ # # inner_data = inner_inner_model.query.filter({ language: nil, filters: { id: [inner_value['id']] } }).find_all.map { |m| m }&.first
246
+ # # else
247
+ # inner_value = inner_value.first if inner_value.is_a?(Array)
248
+ # inner_data = inner_inner_model.new(inner_value)
249
+ # inner_data.save
250
+ # # end
251
+ #
252
+ # inner_data
253
+ # end
254
+ # else
255
+ # m
256
+ # end
257
+ # end
258
+ # elsif value.is_a?(Object)
259
+ # value.save
260
+ # end
261
+ # end
262
+ # end
263
+
180
264
  before_update_proc&.call(original_klass, updated_klass)
181
265
 
182
- delete_graph = as_graph(original_klass, false)
266
+ properties_orignal_klass = properties_to_hash(original_klass)
267
+ properties_updated_klsss = properties_to_hash(updated_klass)
268
+
269
+ if Hashdiff.best_diff(properties_orignal_klass, properties_updated_klsss).empty?
270
+ Solis::LOGGER.info("#{original_klass.class.name} unchanged, skipping")
271
+ data = self.query.filter({ filters: { id: [id] } }).find_all.map { |m| m }&.first
272
+ else
273
+
274
+ delete_graph = as_graph(original_klass, false)
183
275
 
184
- where_graph = RDF::Graph.new(graph_name: RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{id}"), data: RDF::Repository.new)
276
+ where_graph = RDF::Graph.new(graph_name: RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{id}"), data: RDF::Repository.new)
185
277
 
186
- if id.is_a?(Array)
187
- id.each do |i|
188
- where_graph << [RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{i}"), :p, :o]
278
+ if id.is_a?(Array)
279
+ id.each do |i|
280
+ where_graph << [RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{i}"), :p, :o]
281
+ end
282
+ else
283
+ where_graph << [RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{id}"), :p, :o]
189
284
  end
190
- else
191
- where_graph << [RDF::URI("#{self.class.graph_name}#{self.name.tableize}/#{id}"), :p, :o]
192
- end
193
285
 
194
- insert_graph = as_graph(updated_klass, true)
286
+ insert_graph = as_graph(updated_klass, true)
195
287
 
196
- puts delete_graph.dump(:ttl) #if ConfigFile[:debug]
197
- puts insert_graph.dump(:ttl) #if ConfigFile[:debug]
198
- puts where_graph.dump(:ttl) #if ConfigFile[:debug]
288
+ # puts delete_graph.dump(:ttl) #if ConfigFile[:debug]
289
+ # puts insert_graph.dump(:ttl) #if ConfigFile[:debug]
290
+ # puts where_graph.dump(:ttl) #if ConfigFile[:debug]
199
291
 
200
- #if ConfigFile[:debug]
201
- delete_insert_query = SPARQL::Client::Update::DeleteInsert.new(delete_graph, insert_graph, where_graph, graph: insert_graph.name).to_s
202
- delete_insert_query.gsub!('_:p', '?p')
203
- puts delete_insert_query
204
- data = sparql.query(delete_insert_query)
205
- #pp data
206
- #end
292
+ # if ConfigFile[:debug]
293
+ delete_insert_query = SPARQL::Client::Update::DeleteInsert.new(delete_graph, insert_graph, where_graph, graph: insert_graph.name).to_s
294
+ delete_insert_query.gsub!('_:p', '?p')
295
+ # puts delete_insert_query
296
+ data = sparql.query(delete_insert_query)
297
+ # pp data
298
+ # end
207
299
 
208
- # sparql.delete_insert(delete_graph, insert_graph, where_graph, graph: insert_graph.name)
300
+ # sparql.delete_insert(delete_graph, insert_graph, where_graph, graph: insert_graph.name)
209
301
 
210
- data = self.query.filter({ filters: { id: [id] } }).find_all.map { |m| m }&.first
211
- if data.nil?
212
- sparql.insert_data(insert_graph, graph: insert_graph.name)
213
302
  data = self.query.filter({ filters: { id: [id] } }).find_all.map { |m| m }&.first
303
+ if data.nil?
304
+ sparql.insert_data(insert_graph, graph: insert_graph.name)
305
+ data = self.query.filter({ filters: { id: [id] } }).find_all.map { |m| m }&.first
306
+ end
214
307
  end
215
-
216
308
  after_update_proc&.call(updated_klass, data)
309
+
217
310
  data
218
311
  rescue StandardError => e
219
312
  original_graph = as_graph(original_klass, false)
@@ -386,7 +479,7 @@ values ?s {<#{self.graph_id}>}
386
479
 
387
480
  graph << [id, RDF::RDFV.type, klass_metadata[:target_class]]
388
481
 
389
- #load existing object and overwrite
482
+ # load existing object and overwrite
390
483
  original_klass = klass.query.filter({ filters: { id: [uuid] } }).find_all { |f| f.id == uuid }.first || nil
391
484
 
392
485
  if original_klass.nil?
@@ -411,11 +504,9 @@ values ?s {<#{self.graph_id}>}
411
504
  def make_graph(graph, hierarchy, id, klass, klass_metadata, resolve_all)
412
505
  klass_metadata[:attributes].each do |attribute, metadata|
413
506
  data = klass.instance_variable_get("@#{attribute}")
414
-
415
- raise Solis::Error::InvalidAttributeError,
416
- "#{hierarchy.join('.')}.#{attribute} min=#{metadata[:mincount]} and max=#{metadata[:maxcount]}" if data.nil? &&
417
- metadata[:mincount] > 0 &&
418
- graph.query(RDF::Query.new({ attribute.to_sym => { RDF.type => metadata[:node] } })).size == 0
507
+ if data.nil? && metadata[:mincount] > 0 && graph.query(RDF::Query.new({ attribute.to_sym => { RDF.type => metadata[:node] } })).size == 0
508
+ raise Solis::Error::InvalidAttributeError, "#{hierarchy.join('.')}.#{attribute} min=#{metadata[:mincount]} and max=#{metadata[:maxcount]}"
509
+ end
419
510
 
420
511
  # skip if nil or an object that is empty
421
512
  next if data.nil? || ([Hash, Array, String].include?(data.class) && data&.empty?)
@@ -427,7 +518,7 @@ values ?s {<#{self.graph_id}>}
427
518
  data = data.to_json
428
519
  end
429
520
 
430
- #make it an object
521
+ # make it an object
431
522
  unless metadata[:node_kind].nil?
432
523
  model = self.class.graph.shape_as_model(metadata[:datatype].to_s)
433
524
  if data.is_a?(Hash)
@@ -449,7 +540,7 @@ values ?s {<#{self.graph_id}>}
449
540
  internal_resolve = false
450
541
  d = build_ttl_objekt2(graph, d, hierarchy, internal_resolve)
451
542
  else
452
- #d = "#{klass.class.graph_name}#{attribute.tableize}/#{d.id}"
543
+ # d = "#{klass.class.graph_name}#{attribute.tableize}/#{d.id}"
453
544
  d = "#{klass.class.graph_name}#{d.name.tableize}/#{d.id}"
454
545
  end
455
546
  elsif defined?(d.name) && self.class.graph.shape?(d.name)
@@ -554,7 +645,7 @@ values ?s {<#{self.graph_id}>}
554
645
  end
555
646
 
556
647
  if model && d.is_a?(Hash)
557
- #TODO: figure out in what use case we need the parent_model
648
+ # TODO: figure out in what use case we need the parent_model
558
649
  # model_instance = if parent_model
559
650
  # parent_model.new(d)
560
651
  # else
@@ -606,7 +697,7 @@ values ?s {<#{self.graph_id}>}
606
697
  id
607
698
  end
608
699
 
609
- def self.properties_to_hash(model)
700
+ def properties_to_hash(model)
610
701
  n = {}
611
702
  model.class.metadata[:attributes].each_key do |m|
612
703
  if model.instance_variable_get("@#{m}").is_a?(Array)
data/lib/solis/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Solis
2
- VERSION = "0.72.0"
2
+ VERSION = "0.73.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.72.0
4
+ version: 0.73.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mehmet Celik
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-28 00:00:00.000000000 Z
11
+ date: 2024-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport