diff options
| author | Alban Peignier | 2018-03-15 17:09:34 +0100 |
|---|---|---|
| committer | GitHub | 2018-03-15 17:09:34 +0100 |
| commit | f011f7e9806ffeaaba3ad73510bc818211f55dbd (patch) | |
| tree | b59a6a71f82b7121fb3a0ffa3a65b9d7cedaa3aa /app | |
| parent | d3d3c0f40c37d716cfccbf9297bfbdc98c692521 (diff) | |
| parent | 9291d45e825edbaf52cb556c102498366985496f (diff) | |
| download | chouette-core-f011f7e9806ffeaaba3ad73510bc818211f55dbd.tar.bz2 | |
Merge pull request #379 from af83/6095-route--calculate-distance-and-time-cost-between-stops
Calculate distance and time cost between Route stops. Refs #6095
Diffstat (limited to 'app')
| -rw-r--r-- | app/models/chouette/route.rb | 32 | ||||
| -rw-r--r-- | app/services/route_way_cost_calculator.rb | 12 | ||||
| -rw-r--r-- | app/workers/route_way_cost_worker.rb | 16 |
3 files changed, 46 insertions, 14 deletions
diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb index 26b80733d..f814d5160 100644 --- a/app/models/chouette/route.rb +++ b/app/models/chouette/route.rb @@ -1,4 +1,3 @@ - module Chouette class Route < Chouette::TridentActiveRecord has_paper_trail @@ -76,19 +75,20 @@ module Chouette validates :wayback, inclusion: { in: self.wayback.values } - def duplicate - overrides = { - 'opposite_route_id' => nil, - 'name' => I18n.t('activerecord.copy', name: self.name) - } - keys_for_create = attributes.keys - %w{id objectid created_at updated_at} - atts_for_create = attributes - .slice(*keys_for_create) - .merge(overrides) - new_route = self.class.create!(atts_for_create) - duplicate_stop_points(for_route: new_route) - new_route - end + after_save :calculate_costs!, if: ->() { TomTom.enabled? } + + def duplicate + overrides = { + 'opposite_route_id' => nil, + 'name' => I18n.t('activerecord.copy', name: self.name) + } + atts_for_create = attributes + .slice!(*%w{id objectid created_at updated_at}) + .merge(overrides) + new_route = self.class.create!(atts_for_create) + duplicate_stop_points(for_route: new_route) + new_route + end def duplicate_stop_points(for_route:) stop_points.each(&duplicate_stop_point(for_route: for_route)) @@ -189,6 +189,10 @@ module Chouette journey_pattern end + def calculate_costs! + RouteWayCostWorker.perform_async(referential.id, id) + end + protected def self.vehicle_journeys_timeless(stop_point_id) diff --git a/app/services/route_way_cost_calculator.rb b/app/services/route_way_cost_calculator.rb new file mode 100644 index 000000000..2e30c94fc --- /dev/null +++ b/app/services/route_way_cost_calculator.rb @@ -0,0 +1,12 @@ +class RouteWayCostCalculator + def initialize(route) + @route = route + end + + def calculate! + way_costs = StopAreasToWayCostsConverter.new(@route.stop_areas).convert + way_costs = TomTom.batch(way_costs) + way_costs = WayCostCollectionJSONSerializer.dump(way_costs) + @route.update(costs: way_costs) + end +end diff --git a/app/workers/route_way_cost_worker.rb b/app/workers/route_way_cost_worker.rb new file mode 100644 index 000000000..d6bfed592 --- /dev/null +++ b/app/workers/route_way_cost_worker.rb @@ -0,0 +1,16 @@ +class RouteWayCostWorker + include Sidekiq::Worker + + def perform(referential_id, route_id) + Referential.find(referential_id).switch + route = Chouette::Route.find(route_id) + + # Prevent recursive worker spawning since this call updates the + # `costs` field of the route. + Chouette::Route.skip_callback(:save, :after, :calculate_costs!) + + RouteWayCostCalculator.new(route).calculate! + + Chouette::Route.set_callback(:save, :after, :calculate_costs!) + end +end |
