Sha256: 0b96f5844ab7e2c6d1d156651bc0a3a44e11e89eb6c95f7d8e089658b01e3d79

Contents?: true

Size: 1.96 KB

Versions: 13

Compression:

Stored size: 1.96 KB

Contents

require 'tsort'

module Spider; module Model
    
    class UnitOfWork
        include TSort
        
        def initialize(&proc)
            @objects = {}
            if (proc)
                Thread.current[:unit_of_work] = self
                yield self
                Thread.current[:unit_of_work] = nil
            end
        end
        
        def run() #(&proc)
            #proc.call
            @tasks = {}
            @processed_tasks = {}
            @objects.each do |obj_id, obj|
                next unless obj.mapper && obj.mapper.class.write?
                task = Spider::Model::MapperTask.new(obj, :save)
                @tasks[task] ||= task
                find_dependencies(task)
            end
            tasks = tsort()
            tasks.each{ |task| p task}
            tasks.each do |task|
                Spider::Logger.debug("Executing task #{task.inspect}")
                task.execute()
            end
        end
        
        def find_dependencies(model_task)
            return if (@processed_tasks[model_task])
            @processed_tasks[model_task] = true
            dependencies = model_task.object.mapper.get_dependencies(model_task.object, model_task.action)
            dependencies.each do |dep|
                @tasks[dep[0]] ||= dep[0]
                @tasks[dep[1]] ||= dep[1]
                @tasks[dep[0]] << @tasks[dep[1]]
                find_dependencies(dep[1])
            end
        end
                
        
        def add(obj)
            if (obj.class == QuerySet)
                obj.each do |item|
                    @objects[item.object_id] = item
                end
            else
                @objects[obj.object_id] = obj
            end
        end
        
        
        def tsort_each_node(&block)
            @tasks.values.each(&block)
        end
        
        def tsort_each_child(node, &block)
            node.dependencies.each(&block)
        end
        
        
        
    end

    

    
    
end; end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
spiderfw-0.5.13 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.12 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.11 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.10 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.9 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.7 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.6 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.5 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.4 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.3 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.2 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5.1 lib/spiderfw/model/unit_of_work.rb
spiderfw-0.5 lib/spiderfw/model/unit_of_work.rb