diff options
| -rw-r--r-- | app/models/import/gtfs.rb | 144 | 
1 files changed, 81 insertions, 63 deletions
| diff --git a/app/models/import/gtfs.rb b/app/models/import/gtfs.rb index a35e84b61..e6552f936 100644 --- a/app/models/import/gtfs.rb +++ b/app/models/import/gtfs.rb @@ -117,48 +117,54 @@ class Import::Gtfs < Import::Base    end    def import_agencies -    source.agencies.each do |agency| -      company = line_referential.companies.find_or_initialize_by(registration_number: agency.id) -      company.attributes = { name: agency.name } +    Chouette::Company.transaction do +      source.agencies.each do |agency| +        company = line_referential.companies.find_or_initialize_by(registration_number: agency.id) +        company.attributes = { name: agency.name } -      save_model company +        save_model company +      end      end    end    def import_stops -    source.stops.each do |stop| -      stop_area = stop_area_referential.stop_areas.find_or_initialize_by(registration_number: stop.id) +    Chouette::StopArea.transaction do +      source.stops.each do |stop| +        stop_area = stop_area_referential.stop_areas.find_or_initialize_by(registration_number: stop.id) -      stop_area.name = stop.name -      stop_area.area_type = stop.location_type == "1" ? "zdlp" : "zdep" -      stop_area.parent = stop_area_referential.stop_areas.find_by!(registration_number: stop.parent_station) if stop.parent_station.present? -      stop_area.latitude, stop_area.longitude = stop.lat, stop.lon -      stop_area.kind = "commercial" +        stop_area.name = stop.name +        stop_area.area_type = stop.location_type == "1" ? "zdlp" : "zdep" +        stop_area.parent = stop_area_referential.stop_areas.find_by!(registration_number: stop.parent_station) if stop.parent_station.present? +        stop_area.latitude, stop_area.longitude = stop.lat, stop.lon +        stop_area.kind = "commercial" -      # TODO correct default timezone +        # TODO correct default timezone -      save_model stop_area +        save_model stop_area +      end      end    end    def import_routes -    source.routes.each do |route| -      line = line_referential.lines.find_or_initialize_by(registration_number: route.id) -      line.name = route.long_name.presence || route.short_name -      line.number = route.short_name -      line.published_name = route.long_name +    Chouette::Line.transaction do +      source.routes.each do |route| +        line = line_referential.lines.find_or_initialize_by(registration_number: route.id) +        line.name = route.long_name.presence || route.short_name +        line.number = route.short_name +        line.published_name = route.long_name -      line.company = line_referential.companies.find_by(registration_number: route.agency_id) if route.agency_id.present? +        line.company = line_referential.companies.find_by(registration_number: route.agency_id) if route.agency_id.present? -      # TODO transport mode +        # TODO transport mode -      line.comment = route.desc +        line.comment = route.desc -      # TODO colors +        # TODO colors -      line.url = route.url +        line.url = route.url -      save_model line +        save_model line +      end      end    end @@ -167,53 +173,61 @@ class Import::Gtfs < Import::Base    end    def import_trips -    source.trips.each do |trip| -      line = line_referential.lines.find_by registration_number: trip.route_id +    source.trips.each_slice(100) do |slice| +      slice.each do |trip| +        Chouette::Route.transaction do +          line = line_referential.lines.find_by registration_number: trip.route_id -      route = referential.routes.build line: line -      route.wayback = (trip.direction_id == "0" ? :outbound : :inbound) -      # TODO better name ? -      name = route.published_name = trip.short_name.presence || trip.headsign.presence || route.wayback.to_s.capitalize -      route.name = name -      save_model route +          route = referential.routes.build line: line +          route.wayback = (trip.direction_id == "0" ? :outbound : :inbound) +          # TODO better name ? +          name = route.published_name = trip.short_name.presence || trip.headsign.presence || route.wayback.to_s.capitalize +          route.name = name +          save_model route -      journey_pattern = route.journey_patterns.build name: name -      save_model journey_pattern +          journey_pattern = route.journey_patterns.build name: name +          save_model journey_pattern -      vehicle_journey = journey_pattern.vehicle_journeys.build route: route -      vehicle_journey.published_journey_name = trip.headsign.presence || trip.id -      save_model vehicle_journey +          vehicle_journey = journey_pattern.vehicle_journeys.build route: route +          vehicle_journey.published_journey_name = trip.headsign.presence || trip.id +          save_model vehicle_journey -      vehicle_journey.time_tables << referential.time_tables.find(time_tables_by_service_id[trip.service_id]) +          vehicle_journey.time_tables << referential.time_tables.find(time_tables_by_service_id[trip.service_id]) -      vehicle_journey_by_trip_id[trip.id] = vehicle_journey.id +          vehicle_journey_by_trip_id[trip.id] = vehicle_journey.id +        end +      end      end    end    def import_stop_times -    source.stop_times.group_by(&:trip_id).each do |trip_id, stop_times| -      vehicle_journey = referential.vehicle_journeys.find vehicle_journey_by_trip_id[trip_id] -      journey_pattern = vehicle_journey.journey_pattern -      route = journey_pattern.route +    source.stop_times.group_by(&:trip_id).each_slice(50) do |slice| +      slice.each do |trip_id, stop_times| +        Chouette::VehicleJourneyAtStop.transaction do +          vehicle_journey = referential.vehicle_journeys.find vehicle_journey_by_trip_id[trip_id] +          journey_pattern = vehicle_journey.journey_pattern +          route = journey_pattern.route -      stop_times.sort_by!(&:stop_sequence) +          stop_times.sort_by! { |s| s.stop_sequence.to_i } -      stop_times.each do |stop_time| -        stop_area = stop_area_referential.stop_areas.find_by(registration_number: stop_time.stop_id) +          stop_times.each do |stop_time| +            stop_area = stop_area_referential.stop_areas.find_by(registration_number: stop_time.stop_id) -        stop_point = route.stop_points.build stop_area: stop_area -        save_model stop_point +            stop_point = route.stop_points.build stop_area: stop_area +            save_model stop_point -        journey_pattern.stop_points << stop_point +            journey_pattern.stop_points << stop_point -        # JourneyPattern#vjas_add creates automaticaly VehicleJourneyAtStop -        vehicle_journey_at_stop = journey_pattern.vehicle_journey_at_stops.find_by(stop_point_id: stop_point.id) -        vehicle_journey_at_stop.departure_time = stop_time.departure_time -        vehicle_journey_at_stop.arrival_time = stop_time.arrival_time +            # JourneyPattern#vjas_add creates automaticaly VehicleJourneyAtStop +            vehicle_journey_at_stop = journey_pattern.vehicle_journey_at_stops.find_by(stop_point_id: stop_point.id) +            vehicle_journey_at_stop.departure_time = stop_time.departure_time +            vehicle_journey_at_stop.arrival_time = stop_time.arrival_time -        # TODO offset +            # TODO offset -        save_model vehicle_journey_at_stop +            save_model vehicle_journey_at_stop +          end +        end        end      end    end @@ -223,16 +237,20 @@ class Import::Gtfs < Import::Base    end    def import_calendars -    source.calendars.each do |calendar| -      time_table = referential.time_tables.build comment: "Calendar #{calendar.service_id}" -      Chouette::TimeTable.all_days.each do |day| -        time_table.send("#{day}=", calendar.send(day)) -      end -      time_table.periods.build period_start: calendar.start_date, period_end: calendar.end_date +    source.calendars.each_slice(500) do |slice| +      Chouette::TimeTable.transaction do +        slice.each do |calendar| +          time_table = referential.time_tables.build comment: "Calendar #{calendar.service_id}" +          Chouette::TimeTable.all_days.each do |day| +            time_table.send("#{day}=", calendar.send(day)) +          end +          time_table.periods.build period_start: calendar.start_date, period_end: calendar.end_date -      save_model time_table +          save_model time_table -      time_tables_by_service_id[calendar.service_id] = time_table.id +          time_tables_by_service_id[calendar.service_id] = time_table.id +        end +      end      end    end | 
