Class: RulesEngine::Job

Inherits:
Object
  • Object
show all
Defined in:
lib/rules_engine/job.rb

Constant Summary collapse

@@max_rules =
500

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(re_job) ⇒ Job

Returns a new instance of Job.



8
9
10
11
# File 'lib/rules_engine/job.rb', line 8

def initialize(re_job)
  @re_job = re_job
  @audit_level = ReJobAudit::AUDIT_INFO
end

Instance Attribute Details

#audit_levelObject

Returns the value of attribute audit_level.



6
7
8
# File 'lib/rules_engine/job.rb', line 6

def audit_level
  @audit_level
end

#re_jobObject (readonly)

Returns the value of attribute re_job.



5
6
7
# File 'lib/rules_engine/job.rb', line 5

def re_job
  @re_job
end

#re_pipelineObject (readonly)

Returns the value of attribute re_pipeline.



5
6
7
# File 'lib/rules_engine/job.rb', line 5

def re_pipeline
  @re_pipeline
end

#re_ruleObject (readonly)

Returns the value of attribute re_rule.



5
6
7
# File 'lib/rules_engine/job.rb', line 5

def re_rule
  @re_rule
end

Class Method Details

.createObject



13
14
15
16
# File 'lib/rules_engine/job.rb', line 13

def self.create()
  re_job = ReJob.create(:job_status => ReJob::JOB_STATUS_NONE)
  RulesEngine::Job.new(re_job)
end

.open(job_id) ⇒ Object



18
19
20
21
22
23
# File 'lib/rules_engine/job.rb', line 18

def self.open(job_id)      
  re_job = ReJob.find_by_id(job_id) || ReJob.create(:job_status => ReJob::JOB_STATUS_NONE)
  re_job.update_attributes(:job_status => ReJob::JOB_STATUS_NONE)
  
  RulesEngine::Job.new(re_job)
end

Instance Method Details

#audit(message, code = ReJobAudit::AUDIT_INFO) ⇒ Object



113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/rules_engine/job.rb', line 113

def audit(message, code=ReJobAudit::AUDIT_INFO)
  if audit_level != ReJobAudit::AUDIT_NONE && code >= audit_level
    ReJobAudit.create({
      :re_job_id => re_job ? re_job.id : nil,
      :re_pipeline_id => re_pipeline ? re_pipeline.id : nil, 
      :re_rule_id => re_rule ? re_rule.id : nil,
      :audit_date => Time.now,  
      :audit_code => code,
      :audit_message => message});
  end
  # puts "#{'*' * 5} #{re_job ? re_job.id : nil}, #{re_pipeline ? re_pipeline.id : nil}, #{re_rule ? re_rule.id : nil}, #{code}, #{message}"
end

#run(pipeline_code, data = {}) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/rules_engine/job.rb', line 25

def run(pipeline_code, data = {})
  if @re_job.nil?
    audit("Job missing", ReJobAudit::AUDIT_FAILURE)
    return false
  end
  
  rule_count = 0
  done = false
  error = false
        
  @re_job.update_attributes(:job_status => ReJob::JOB_STATUS_RUNNING)  
  
  while (!done && rule_count < @@max_rules)
    rule_count += 1 
    
    activated_pipeline = RePipelineActivated.find_by_code(pipeline_code)
    unless activated_pipeline
      if RePipeline.find_by_code(pipeline_code)
        audit("Pipleine : #{pipeline_code} not activated", ReJobAudit::AUDIT_FAILURE) 
      else
        audit("Pipleine : #{pipeline_code} not found", ReJobAudit::AUDIT_FAILURE) 
      end  
      error = done = true 
      next
    end  
    
    
    if activated_pipeline.re_rules.empty?
      audit("Pipleine : #{pipeline_code} has no rules", ReJobAudit::AUDIT_FAILURE) 
      error = done = true 
      next
    end

    @re_pipeline = activated_pipeline.re_pipeline
    audit("Pipleine : #{pipeline_code} started", ReJobAudit::AUDIT_SUCCESS)
    
    activated_pipeline.re_rules.each do | re_rule |
      rule = re_rule.rule
      unless rule
        audit("Rule : #{re_rule.rule_class_name} not found", ReJobAudit::AUDIT_FAILURE) 
        error = done = true 
        break 
      end  
    
      @re_rule = re_rule
      audit("Rule : #{re_rule.title} starting")                    
      rule_outcome = rule.process(self, data)
      audit("Rule : #{re_rule.title} finished")
      @re_rule = nil
      
      if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::RuleOutcome::OUTCOME_STOP_SUCCESS
        audit("Pipeline : #{pipeline_code} stop success", ReJobAudit::AUDIT_SUCCESS)
        done = true 
        break
      end
    
      if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::RuleOutcome::OUTCOME_STOP_FAILURE
        audit("Pipeline : #{pipeline_code} stop failure", ReJobAudit::AUDIT_FAILURE)
        error = done = true 
        break
      end
    
      if !rule_outcome.nil? && rule_outcome.outcome == RulesEngine::RuleOutcome::OUTCOME_START_PIPELINE
        audit("Pipeline : #{pipeline_code} start pipeline #{rule_outcome.pipeline_code}", ReJobAudit::AUDIT_SUCCESS)
        pipeline_code = rule_outcome.pipeline_code
        break
      end
      
      if activated_pipeline.re_rules[-1] == re_rule
        audit("Pipeline : #{pipeline_code} complete", ReJobAudit::AUDIT_SUCCESS)
        done = true 
        break
      end                  
    end
    
    @re_pipeline = nil
  end  

  if rule_count >= @@max_rules
    audit("Maximum pipeline depth #{@@max_rules} exceeded", ReJob::JOB_STATUS_FAILURE)
    error = true
  end
  
  @re_job.update_attributes(:job_status => error ? ReJob::JOB_STATUS_FAILURE : ReJob::JOB_STATUS_SUCCESS)
  
  !error
end