diff options
| -rw-r--r-- | app/models/merge.rb | 111 | ||||
| -rw-r--r-- | spec/models/merge_spec.rb | 7 |
2 files changed, 58 insertions, 60 deletions
diff --git a/app/models/merge.rb b/app/models/merge.rb index e87f83402..0733ae8bf 100644 --- a/app/models/merge.rb +++ b/app/models/merge.rb @@ -35,11 +35,12 @@ class Merge < ActiveRecord::Base Rails.logger.debug "Create a new output" # 'empty' one attributes = { + workbench: workbench, organisation: workbench.organisation, # TODO could be workbench.organisation by default name: I18n.t("merges.referential_name"), slug: "output_#{workbench.id}_#{Time.now.to_i}" } - workbench.referentials.new attributes + workbench.output.referentials.new attributes end new.save! @@ -52,13 +53,21 @@ class Merge < ActiveRecord::Base Rails.logger.debug "Merge #{referential.slug}" puts referential.metadatas.inspect - metadata_merger = MetadatasMerger.new new.metadatas, referential.metadatas + metadata_merger = MetadatasMerger.new new, referential metadata_merger.merge - metadata_merger.conflits.each do |line_id, periods| - # clean new on given period + new.metadatas.delete metadata_merger.empty_metadatas + + new.save! + puts new.metadatas.inspect + + referential.metadatas.each do |metadata| + metadata.line_ids.each do |line_id| + metadata.periodes.each do |period| + puts "Clean data for #{line_id} #{period}" + end + end end - metadata_merger.destroyed_metadatas.each(&:destroy) # let's merge data :) end @@ -80,76 +89,66 @@ class Merge < ActiveRecord::Base class MetadatasMerger - attr_reader :merge, :metadatas - def initialize(merge, metadatas) - @merge, @metadatas = merge, metadatas + attr_reader :merge_metadatas, :referential + def initialize(merge_referential, referential) + @merge_metadatas = merge_referential.metadatas + @referential = referential end + delegate :metadatas, to: :referential, prefix: :referential + def merge - metadatas.each do |metadata| + referential_metadatas.each do |metadata| merge_one metadata end end - def line_metadatas(line_id) - merge.select do |m| + def merged_line_metadatas(line_id) + merge_metadatas.select do |m| m.line_ids.include? line_id end end - def conflits - @conflits ||= Hash.new { |h,k| h[k] = [] } - end - - def destroyed_metadatas - @destroyed_metadatas ||= [] - end - def merge_one(metadata) metadata.line_ids.each do |line_id| - line_metadatas = line_metadatas(line_id) - - metadata.periodes do |period| - before = line_metadatas.find do |m| - m.periodes.any? { |p| p.include? period.begin } + line_metadatas = merged_line_metadatas(line_id) + + metadata.periodes.each do |period| + puts "#{line_id} #{period}" + + line_metadatas.each do |m| + m.periodes = m.periodes.map do |existing_period| + if period.begin <= existing_period.begin and + existing_period.end <= period.end + # between + nil + elsif existing_period.include? period.begin + # before + Range.new existing_period.begin, period.begin - 1 + elsif existing_period.include? period.end + # after + Range.new period.end + 1, existing_period.end + end + end.compact end - if before - before.end = period.begin - 1 - end - - between = line_metadatas.select do |m| - m.periodes.any? do |p| - period.begin < p.begin && p.end < period.end - end - end - - destroyed_metadatas.concat between - - after = line_metadatas.find do |m| - m.periodes.any? { |p| p.include? period.end } - end - - if after - after.begin = period.end + 1 - end - - if [before, between, after].any?(&:present?) - conflits[line_id] << period - - attributes = { - line_ids: line_id, - periodes: [period], - referential_source_id: metadata.referential_source_id, - created_at: metadata.created_at - } - # line_metadatas should not contain conflicted metadatas - metadatas << ReferentialMetadata.new(attributes) - end + attributes = { + line_ids: [line_id], + periodes: [period], + referential_source_id: referential.id, + created_at: metadata.created_at + } + # line_metadatas should not contain conflicted metadatas + merge_metadatas << ReferentialMetadata.new(attributes) end end end + def empty_metadatas + merge_metadatas.select { |m| m.periodes.empty? } + end + + end end diff --git a/spec/models/merge_spec.rb b/spec/models/merge_spec.rb index 674311f38..caa623357 100644 --- a/spec/models/merge_spec.rb +++ b/spec/models/merge_spec.rb @@ -3,11 +3,10 @@ require "rails_helper" RSpec.describe Merge do it "should work" do - workbench = FactoryGirl.create :workbench - referential = FactoryGirl.create :referential, workbench: workbench, organisation: workbench.organisation - - merge = Merge.create!(workbench: workbench, referentials: [referential]) + referential_metadata = FactoryGirl.create(:referential_metadata) + referential = FactoryGirl.create :workbench_referential, metadatas: [referential_metadata] + merge = Merge.create!(workbench: referential.workbench, referentials: [referential, referential]) merge.merge! end |
