aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZakaria BOUZIANE2015-01-05 09:33:35 +0100
committerZakaria BOUZIANE2015-01-05 09:33:35 +0100
commit7dbbbf38529773b7e62b550f7d0efb42d7b6dd71 (patch)
treed2209cbf47d09bcf68a2bf672acb431007a1ecb4
parentec8d4b5d7941ba39a6d918e56a56418cf817aeed (diff)
downloadchouette-core-7dbbbf38529773b7e62b550f7d0efb42d7b6dd71.tar.bz2
Replace Object.all.count by Object.count for better performance
-rw-r--r--app/controllers/exports_controller.rb4
-rw-r--r--app/exporters/chouette/hub/exporter.rb319
-rw-r--r--app/views/exports/_fields_hub_export.erb2
3 files changed, 143 insertions, 182 deletions
diff --git a/app/controllers/exports_controller.rb b/app/controllers/exports_controller.rb
index e8c140dd7..bb9cff197 100644
--- a/app/controllers/exports_controller.rb
+++ b/app/controllers/exports_controller.rb
@@ -14,8 +14,8 @@ class ExportsController < ChouetteController
end
def create
- if (params[:export][:type] == "HubExport") && Chouette::VehicleJourneyAtStop.all.count > 50000
- flash[:notice] = I18n.t("formtastic.titles.export.vjas.size", size: Chouette::VehicleJourneyAtStop.all.count)
+ if (params[:export][:type] == "HubExport") && Chouette::VehicleJourneyAtStop.count > 50000
+ flash[:notice] = I18n.t("formtastic.titles.export.vjas.size", size: Chouette::VehicleJourneyAtStop.count)
redirect_to new_referential_export_path(@referential)
elsif (params[:export][:type] == "HubExport") && (params[:export][:start_date].empty? || params[:export][:end_date].empty?)
flash[:notice] = I18n.t("formtastic.titles.export.dates.not_nul")
diff --git a/app/exporters/chouette/hub/exporter.rb b/app/exporters/chouette/hub/exporter.rb
index 110ad6b61..3a9313762 100644
--- a/app/exporters/chouette/hub/exporter.rb
+++ b/app/exporters/chouette/hub/exporter.rb
@@ -1,10 +1,10 @@
class Chouette::Hub::Exporter
require "zip"
-
+
attr_reader :referential
attr_reader :hub_export, :lines, :routes, :journey_patterns
attr_reader :time_tables, :vehicle_journeys
-
+
def initialize(referential, hub_export)
@referential = referential
@hub_export = hub_export
@@ -14,9 +14,8 @@ class Chouette::Hub::Exporter
@time_tables = nil
@vehicle_journeys = nil
end
-
+
def select_time_tables(start_date, end_date)
- #TODO considere options[:o], options[:id]
all_time_tables = Chouette::TimeTable.all
time_tables = []
s_date = Date.strptime(start_date, "%Y-%m-%d")
@@ -27,225 +26,188 @@ class Chouette::Hub::Exporter
end
return time_tables
end
-
+
def select_lines(object, ids)
if object == "network"
- ids.present? ? Chouette::Line.includes(:routes).where( :network_id => ids.split(",")).order(:objectid) :
+ ids.present? ? Chouette::Line.includes(:routes).where(:network_id => ids.split(",")).order(:objectid) :
Chouette::Line.joins(:network).includes(:routes).order(:objectid)
elsif object == "company"
- ids.present? ? Chouette::Line.includes(:routes).where( :company_id => ids.split(",")).order(:objectid) :
+ ids.present? ? Chouette::Line.includes(:routes).where(:company_id => ids.split(",")).order(:objectid) :
Chouette::Line.joins(:company).includes(:routes).order(:objectid)
elsif object == "line" && ids.present?
- Chouette::Line.includes(:routes).where( :id => ids.split(",")).order(:objectid)
+ Chouette::Line.includes(:routes).where(:id => ids.split(",")).order(:objectid)
else
Chouette::Line.includes(:routes).order(:objectid)
end
end
-
+
def referential_exportable?
- Chouette::VehicleJourneyAtStop.all.count < 50000
+ Chouette::VehicleJourneyAtStop.count < 50000
end
def time_tables_exportable?
time_tables
end
-
+
def routes_exportable?
routes # && routes.size < 150
end
-
+
def lines_exportable?
lines # && lines.size < 150
end
-
+
def journey_patterns_exportable?
journey_patterns # && journey_patterns.size < 150
end
-
+
def vehicle_journeys_exportable?
vehicle_journeys
end
-
+
def log_overflow_warning( target_class)
- hub_export.log_messages.create( :severity => "warning", :key => "EXPORT_ERROR|EXCEPTION",
- :arguments => {"0" => I18n.t( 'export_log_messages.messages.overflow',
- :count => 150, :data => target_class.model_name.human.pluralize)})
+ hub_export.log_messages.create(:severity => "warning",
+ :key => "EXPORT_ERROR|EXCEPTION",
+ :arguments => {"0" => I18n.t('export_log_messages.messages.overflow',
+ :count => 150,
+ :data => target_class.model_name.human.pluralize)})
end
-
+
def export(zip_file_path, options = {})
begin
referential.switch
-
if referential_exportable? && options[:start_date] && options[:end_date]
-
FileUtils.rm(zip_file_path) if File.exists? zip_file_path
-
hub_export.log_messages.create( :severity => "ok", :key => "EXPORT", :arguments => {"0" => "HUB"})
-
- Dir.mktmpdir(nil, "/tmp"){ |temp_dir|
-
- @time_tables = select_time_tables(options[:start_date], options[:end_date])
-
- @lines = select_lines( options[:o], options[:id] )
-
- @routes = []
- if @lines
- @lines.each { |line| @routes << Chouette::Route.where( "line_id = ?", line.id ).order(:wayback) }
- end
-
- @journey_patterns = []
- if @routes
- @routes.each { |subroutes| @journey_patterns << Chouette::JourneyPattern.where( :route_id => subroutes.map(&:id) ).order(:objectid) }
- end
- @journey_patterns = @journey_patterns.flatten
-
- @routes = @routes.flatten
- @vehicle_journeys = Chouette::VehicleJourney.where(:route_id => @routes.map(&:id)).order(:objectid) if routes_exportable?
-
- rts = []
- jps = []
- vjs = []
- tts = []
- @vehicle_journeys.each do |vj|
- unless (vj.time_tables & @time_tables).empty?
- vjs << vj
- tts << (vj.time_tables & @time_tables)
- rts << vj.route_id
- jps << vj.journey_pattern_id
+ Dir.mktmpdir(nil, "/tmp") { |temp_dir|
+ @time_tables = select_time_tables(options[:start_date], options[:end_date])
+ @lines = select_lines(options[:o], options[:id])
+
+ @routes = []
+ if @lines
+ @lines.each { |line| @routes << Chouette::Route.where("line_id = ?", line.id).order(:wayback) }
+ end
+
+ @journey_patterns = []
+ if @routes
+ @routes.each { |subroutes| @journey_patterns << Chouette::JourneyPattern.where(:route_id => subroutes.map(&:id)).order(:objectid) }
+ end
+ @journey_patterns = @journey_patterns.flatten
+
+ @routes = @routes.flatten
+ @vehicle_journeys = Chouette::VehicleJourney.where(:route_id => @routes.map(&:id)).order(:objectid) if routes_exportable?
+
+ rts = []
+ jps = []
+ vjs = []
+ tts = []
+ @vehicle_journeys.each do |vj|
+ unless (vj.time_tables & @time_tables).empty?
+ vjs << vj
+ tts << (vj.time_tables & @time_tables)
+ rts << vj.route_id
+ jps << vj.journey_pattern_id
+ end
+ end
+ @time_tables = tts.flatten.uniq
+ @vehicle_journeys = vjs.uniq
+ rts = rts.flatten.uniq
+ jps = jps.flatten.uniq
+
+ @routes.delete_if {|r| !(rts.include?(r.id)) }
+ @journey_patterns.delete_if {|jp| !(jps.include?(jp.id)) }
+
+ vehicle_journey_at_stops = Chouette::VehicleJourneyAtStop.where( :vehicle_journey_id => @vehicle_journeys.map(&:id) ) #.order(:id) if vehicle_journeys_exportable?
+
+ if time_tables_exportable?
+ Chouette::Hub::TimeTableExporter.save(@time_tables, temp_dir, hub_export)
+ else
+ log_overflow_warning(Chouette::TimeTable)
end
- end
- @time_tables = tts.flatten.uniq
- @vehicle_journeys = vjs.uniq
- rts = rts.flatten.uniq
- jps = jps.flatten.uniq
-
- @routes.delete_if {|r| !(rts.include?(r.id)) }
- @journey_patterns.delete_if {|jp| !(jps.include?(jp.id)) }
-
-
- vehicle_journey_at_stops = Chouette::VehicleJourneyAtStop.where( :vehicle_journey_id => @vehicle_journeys.map(&:id) ) #.order(:id) if vehicle_journeys_exportable?
-
- if time_tables_exportable?
- Chouette::Hub::TimeTableExporter.save(@time_tables, temp_dir, hub_export)
- else
- log_overflow_warning(Chouette::TimeTable)
- end
-
- if journey_patterns_exportable?
- Chouette::Hub::RouteExporter.save(@routes, temp_dir, hub_export)
- Chouette::Hub::ItlExporter.save(@routes, temp_dir, hub_export)
- Chouette::Hub::JourneyPatternExporter.save(@journey_patterns, temp_dir, hub_export)
- Chouette::Hub::DirectionExporter.save(@journey_patterns, temp_dir, hub_export)
- else
- log_overflow_warning(Chouette::JourneyPattern) if routes_exportable?
- end
-
- if vehicle_journeys_exportable?
- Chouette::Hub::VehicleJourneyExporter.save(@vehicle_journeys, temp_dir, hub_export)
- Chouette::Hub::VehicleJourneyOperationExporter.save(@vehicle_journeys, temp_dir, hub_export)
- #Chouette::Hub::VehicleJourneyAtStopExporter.save(vehicle_journey_at_stops, temp_dir, hub_export)
- Chouette::Hub::VehicleJourneyAtStopExporter.save(@vehicle_journeys, temp_dir, hub_export, vehicle_journey_at_stops.count)
- else
- log_overflow_warning(Chouette::VehicleJourney)
- end
-
- stop_points = Chouette::StopPoint.where( :id => vehicle_journey_at_stops.map(&:stop_point_id)) #.order(:id)
- physical_stop_areas = Chouette::StopArea.where( :id => stop_points.map(&:stop_area_id)) #.order(:parent_id)
- commercial_stop_areas = Chouette::StopArea.where( :id => physical_stop_areas.map(&:parent_id)).order(:objectid)
-
- physical_stop_areas = []
- commercial_stop_areas.each { |commercial_stop_area| physical_stop_areas << Chouette::StopArea.where( :parent_id => [commercial_stop_area.id] ).order(:objectid) }
- physical_stop_areas = physical_stop_areas.flatten
-
- city_codes = Hash.new
- commercial_stop_areas.each { |commercial_stop_area| city_codes[commercial_stop_area.zip_code] = commercial_stop_area.city_name if commercial_stop_area.zip_code }
- physical_stop_areas.each { |physical_stop_area| city_codes[physical_stop_area.zip_code] = physical_stop_area.city_name if physical_stop_area.zip_code }
-
- Chouette::Hub::CityCodeExporter.save(city_codes, temp_dir, hub_export)
- Chouette::Hub::CommercialStopAreaExporter.save(commercial_stop_areas, temp_dir, hub_export)
- Chouette::Hub::PhysicalStopAreaExporter.save(physical_stop_areas, temp_dir, hub_export)
-
- connection_links = Chouette::ConnectionLink.where( "departure_id IN (?) AND arrival_id IN (?)", (physical_stop_areas.map(&:id) + commercial_stop_areas.map(&:id)), (physical_stop_areas.map(&:id) + commercial_stop_areas.map(&:id)) ).order(:id)
-
- Chouette::Hub::ConnectionLinkExporter.save(connection_links, temp_dir, hub_export)
+ if journey_patterns_exportable?
+ Chouette::Hub::RouteExporter.save(@routes, temp_dir, hub_export)
+ Chouette::Hub::ItlExporter.save(@routes, temp_dir, hub_export)
+ Chouette::Hub::JourneyPatternExporter.save(@journey_patterns, temp_dir, hub_export)
+ Chouette::Hub::DirectionExporter.save(@journey_patterns, temp_dir, hub_export)
+ else
+ log_overflow_warning(Chouette::JourneyPattern) if routes_exportable?
+ end
+
+ if vehicle_journeys_exportable?
+ Chouette::Hub::VehicleJourneyExporter.save(@vehicle_journeys, temp_dir, hub_export)
+ Chouette::Hub::VehicleJourneyOperationExporter.save(@vehicle_journeys, temp_dir, hub_export)
+ Chouette::Hub::VehicleJourneyAtStopExporter.save(@vehicle_journeys, temp_dir, hub_export, vehicle_journey_at_stops.count)
+ else
+ log_overflow_warning(Chouette::VehicleJourney)
+ end
- if lines_exportable?
- Chouette::Hub::LineExporter.save(@lines, temp_dir, hub_export)
+ stop_points = Chouette::StopPoint.where( :id => vehicle_journey_at_stops.map(&:stop_point_id)) #.order(:id)
+ physical_stop_areas = Chouette::StopArea.where( :id => stop_points.map(&:stop_area_id)) #.order(:parent_id)
+ commercial_stop_areas = Chouette::StopArea.where( :id => physical_stop_areas.map(&:parent_id)).order(:objectid)
- transport_modes = Hash.new
- @lines.each do |l|
- if l.transport_mode_name
- case l.transport_mode_name
- when "Coach"
- if transport_modes["CAR"]
- transport_modes["CAR"] += "|"+l.objectid.sub(/(\w*\:\w*\:)(\w*)/, '\2')
- else
- transport_modes["CAR"] = l.objectid.sub(/(\w*\:\w*\:)(\w*)/, '\2')
- end
- when "Bus"
- if transport_modes["BUS"]
- transport_modes["BUS"] += "|"+l.objectid.sub(/(\w*\:\w*\:)(\w*)/, '\2')
- else
- transport_modes["BUS"] = l.objectid.sub(/(\w*\:\w*\:)(\w*)/, '\2')
+ physical_stop_areas = []
+ commercial_stop_areas.each { |commercial_stop_area| physical_stop_areas << Chouette::StopArea.where( :parent_id => [commercial_stop_area.id] ).order(:objectid) }
+ physical_stop_areas = physical_stop_areas.flatten
+
+ city_codes = Hash.new
+ commercial_stop_areas.each { |commercial_stop_area| city_codes[commercial_stop_area.zip_code] = commercial_stop_area.city_name if commercial_stop_area.zip_code }
+ physical_stop_areas.each { |physical_stop_area| city_codes[physical_stop_area.zip_code] = physical_stop_area.city_name if physical_stop_area.zip_code }
+
+ Chouette::Hub::CityCodeExporter.save(city_codes, temp_dir, hub_export)
+ Chouette::Hub::CommercialStopAreaExporter.save(commercial_stop_areas, temp_dir, hub_export)
+ Chouette::Hub::PhysicalStopAreaExporter.save(physical_stop_areas, temp_dir, hub_export)
+
+ connection_links = Chouette::ConnectionLink.where( "departure_id IN (?) AND arrival_id IN (?)", (physical_stop_areas.map(&:id) + commercial_stop_areas.map(&:id)), (physical_stop_areas.map(&:id) + commercial_stop_areas.map(&:id)) ).order(:id)
+
+ Chouette::Hub::ConnectionLinkExporter.save(connection_links, temp_dir, hub_export)
+
+ if lines_exportable?
+ Chouette::Hub::LineExporter.save(@lines, temp_dir, hub_export)
+ transport_modes = Hash.new
+ @lines.each do |l|
+ if l.transport_mode_name
+ case l.transport_mode_name
+ when "Coach"
+ if transport_modes["CAR"]
+ transport_modes["CAR"] += "|"+l.objectid.sub(/(\w*\:\w*\:)(\w*)/, '\2')
+ else
+ transport_modes["CAR"] = l.objectid.sub(/(\w*\:\w*\:)(\w*)/, '\2')
+ end
+ when "Bus"
+ if transport_modes["BUS"]
+ transport_modes["BUS"] += "|"+l.objectid.sub(/(\w*\:\w*\:)(\w*)/, '\2')
+ else
+ transport_modes["BUS"] = l.objectid.sub(/(\w*\:\w*\:)(\w*)/, '\2')
+ end
end
end
end
+ Chouette::Hub::TransportModeExporter.save(transport_modes, temp_dir, hub_export)
+ networks = Chouette::Network.where( :id => @lines.map(&:network_id))
+ companies = Chouette::Company.where( :id => @lines.map(&:company_id))
+ groups_of_lines = []
+ @lines.each { |l| groups_of_lines << l.group_of_lines }
+ groups_of_lines = groups_of_lines.flatten.uniq
+ Chouette::Hub::GroupOfLinesExporter.save(groups_of_lines, temp_dir, hub_export)
+ Chouette::Hub::NetworkExporter.save(networks, temp_dir, hub_export)
+ Chouette::Hub::CompanyExporter.save(companies, temp_dir, hub_export)
+ else
+ log_overflow_warning(Chouette::Line)
end
- Chouette::Hub::TransportModeExporter.save(transport_modes, temp_dir, hub_export)
- networks = Chouette::Network.where( :id => @lines.map(&:network_id))
- companies = Chouette::Company.where( :id => @lines.map(&:company_id))
- groups_of_lines = []
- @lines.each { |l| groups_of_lines << l.group_of_lines }
- groups_of_lines = groups_of_lines.flatten.uniq
- Chouette::Hub::GroupOfLinesExporter.save(groups_of_lines, temp_dir, hub_export)
- Chouette::Hub::NetworkExporter.save(networks, temp_dir, hub_export)
- Chouette::Hub::CompanyExporter.save(companies, temp_dir, hub_export)
- else
- log_overflow_warning(Chouette::Line)
- end
-
- #if routes_exportable?
- # Chouette::Hub::RouteExporter.save( routes, temp_dir, hub_export)
- #else
- # log_overflow_warning(Chouette::Route) if lines_exportable?
- #end
-
- # if too many lines
- # there may be too many stop_areas
- if lines_exportable?
- stop_areas = Chouette::StopArea.joins( :stop_points => [:route => :line]).where(:lines => {:id => lines.map(&:id)}).uniq.order(:name)
- #Chouette::Hub::StopAreaExporter.save( stop_areas, temp_dir, hub_export, "Quay")
-
- commercial_stop_areas = Chouette::StopArea.where( :id => stop_areas.map(&:parent_id).compact.uniq).order(:name)
- #Chouette::Hub::StopAreaExporter.save( commercial_stop_areas, temp_dir, hub_export, "CommercialStopPoint")
- end
-
- if( options[:o] == "line" and not options[:id].present?) # Add all objects
- stop_places = referential.stop_areas.stop_place.order(:name)
- #Chouette::Hub::StopAreaExporter.save( stop_places, temp_dir, hub_export, "StopPlace")
-
- itls = referential.stop_areas.itl.order(:name)
- #Chouette::Hub::StopAreaExporter.save( itls, temp_dir, hub_export, "ITL")
-
- connection_links = referential.connection_links.order(:name)
- #Chouette::Hub::ConnectionLinkExporter.save( connection_links, temp_dir, hub_export)
-
- access_links = referential.access_links.order(:name)
- #Chouette::Hub::AccessLinkExporter.save(access_links, temp_dir, hub_export)
-
- access_points = referential.access_points.order(:name)
- #Chouette::Hub::AccessPointExporter.save(access_points, temp_dir, hub_export)
-
- end
-
- ::Zip::File.open(zip_file_path, ::Zip::File::CREATE) do |zipfile|
- Dir[File.join(temp_dir, '*.TXT')].each do |f|
- #Rails.logger.error("Adding File #{File.basename(f)}")
- zipfile.add(File.basename(f), f)
+
+ if lines_exportable?
+ stop_areas = Chouette::StopArea.joins( :stop_points => [:route => :line]).where(:lines => {:id => lines.map(&:id)}).uniq.order(:name)
+ commercial_stop_areas = Chouette::StopArea.where( :id => stop_areas.map(&:parent_id).compact.uniq).order(:name)
end
- end
- }
+
+ ::Zip::File.open(zip_file_path, ::Zip::File::CREATE) do |zipfile|
+ Dir[File.join(temp_dir, '*.TXT')].each do |f|
+ #Rails.logger.error("Adding File #{File.basename(f)}")
+ zipfile.add(File.basename(f), f)
+ end
+ end
+ }
end
ensure
# Always cleanup files
@@ -254,4 +216,3 @@ class Chouette::Hub::Exporter
end
end
-
diff --git a/app/views/exports/_fields_hub_export.erb b/app/views/exports/_fields_hub_export.erb
index 8f51c104b..4d6f6f177 100644
--- a/app/views/exports/_fields_hub_export.erb
+++ b/app/views/exports/_fields_hub_export.erb
@@ -1,3 +1,3 @@
-<%= I18n.t("formtastic.titles.export.vjas.size", size: Chouette::VehicleJourneyAtStop.all.count) if Chouette::VehicleJourneyAtStop.all.count > 50000 %>
+<%= I18n.t("formtastic.titles.export.vjas.size", size: Chouette::VehicleJourneyAtStop.count) if Chouette::VehicleJourneyAtStop.count > 50000 %>
<%= form.input :start_date, :as => :date_picker, :input_html => { :title => t("formtastic.titles.export.start_date")} %>
<%= form.input :end_date, :as => :date_picker, :input_html => { :title => t("formtastic.titles.export.end_date")} %>