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 | 
