aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/clean_up.rb
blob: 70c76314629ff165cec3ddf040d699f2677b9ca6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
class CleanUp
  include ActiveModel::Validations  
  include ActiveModel::Conversion  
  extend ActiveModel::Naming
  
    
  attr_accessor :expected_date, :keep_lines, :keep_stops , :keep_companies
  attr_accessor :keep_networks, :keep_group_of_lines
  
  validates_presence_of :expected_date

  def initialize(attributes = {})
    attributes.each do |name, value|  
      send("#{name}=", value)  
    end  
  end  
    
  def persisted?  
    false  
  end 

  def clean
    # as foreign keys are presents , delete method can be used for faster performance
    result = CleanUpResult.new
    # find and remove time_tables 
    tms = Chouette::TimeTable.validity_out_from_on?(Date.parse(expected_date))
    result.time_table_count = tms.size
    tms.each do |tm|
      tm.delete
    end
    # remove vehiclejourneys without timetables
    Chouette::VehicleJourney.find_each(:conditions => "id not in (select distinct vehicle_journey_id from time_tables_vehicle_journeys)") do |vj|
      if vj.time_tables.size == 0
        result.vehicle_journey_count += 1
        vj.delete
      end
    end
    # remove journeypatterns without vehicle journeys
    Chouette::JourneyPattern.find_each(:conditions => "id not in (select distinct journey_pattern_id from vehicle_journeys)") do |jp|
      if jp.vehicle_journeys.size == 0
        result.journey_pattern_count += 1
        jp.delete
      end
    end
    # remove routes without journeypatterns 
    Chouette::Route.find_each(:conditions => "id not in (select distinct route_id from journey_patterns)") do |r|
      if r.journey_patterns.size == 0
        result.route_count += 1
        r.delete
      end
    end
    # if asked remove lines without routes
    if keep_lines == "0" 
      Chouette::Line.find_each(:conditions => "id not in (select distinct line_id from routes)") do |l|
        if l.routes.size == 0
          result.line_count += 1
          l.delete
        end
      end
    end
    # if asked remove stops without children (recurse) 
    if keep_stops == "0" 
      Chouette::StopArea.find_each(:conditions => { :area_type => "BoardingPosition" }) do |bp|
        if bp.stop_points.size == 0
          result.stop_count += 1
          bp.delete
        end
      end
      Chouette::StopArea.find_each(:conditions => { :area_type => "Quay" }) do |q|
        if q.stop_points.size == 0
          result.stop_count += 1
          q.delete
        end
      end
      Chouette::StopArea.find_each(:conditions => { :area_type => "CommercialStopPoint" }) do |csp|
        if csp.children.size == 0
          result.stop_count += 1
          csp.delete
        end
      end
      Chouette::StopArea.find_each(:conditions => { :area_type => "StopPlace" }) do |sp|
        if sp.children.size == 0
          result.stop_count += 1
          sp.delete
        end
      end
      Chouette::StopArea.find_each(:conditions => { :area_type => "ITL" }) do |itl|
        if itl.routing_stops.size == 0
          result.stop_count += 1
          itl.delete
        end
      end
    end
    # if asked remove companies without lines or vehicle journeys
    if keep_companies == "0" 
      Chouette::Company.find_each do |c|
        if c.lines.size == 0
          result.company_count += 1
          c.delete
        end
      end
    end
    
    # if asked remove networks without lines
    if keep_networks == "0" 
      Chouette::Network.find_each do |n|
        if n.lines.size == 0
          result.network_count += 1
          n.delete
        end
      end
    end
    
    # if asked remove group_of_lines without lines
    if keep_group_of_lines == "0" 
      Chouette::GroupOfLine.find_each do |n|
        if n.lines.size == 0
          result.group_of_line_count += 1
          n.delete
        end
      end
    end
    result
  end
  
end