aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeddy Wing2018-03-26 15:52:43 +0200
committerTeddy Wing2018-03-27 16:46:18 +0200
commitebd46f068fbf11ea8793e9f7982b3a5291e21398 (patch)
tree2d2fa975fb936b130f0df7e5ba735cbb51280ceb
parentddfc41f75cb52f02511e2acd6429270bc9c0ab19 (diff)
downloadchouette-core-ebd46f068fbf11ea8793e9f7982b3a5291e21398.tar.bz2
TomTom::Matrix#points_from_way_costs: Use array instead of set
Using a set ended up not working out. I needed to be able to index into the list in `#extract_costs_to_way_costs!`, and sets aren't indexable. This is because they're supposed to be unordered, though modern Ruby implements `Set` with `Hash` under the hood, which is ordered in Ruby. I like the idea of having a data structure that automatically eliminates duplicates, but it wasn't meant to be, because for the extraction to `WayCost`s, I need an ordered list. Rather than create a new `OrderedSet` type, I just went the simple route and used an Array, eliminating the duplicates manually because I know when duplicates are supposed to occur due to the nature of the data set. Remove the `#eql?` and `#hash` methods from `TomTom::Matrix::Point`. Because we're not longer using `Set`, these methods don't need to be implemented. Refs #6222
-rw-r--r--lib/tom_tom/matrix.rb29
-rw-r--r--lib/tom_tom/matrix/point.rb6
-rw-r--r--spec/lib/tom_tom/matrix_spec.rb8
3 files changed, 22 insertions, 21 deletions
diff --git a/lib/tom_tom/matrix.rb b/lib/tom_tom/matrix.rb
index 55568ab66..8e0331cca 100644
--- a/lib/tom_tom/matrix.rb
+++ b/lib/tom_tom/matrix.rb
@@ -29,23 +29,30 @@ module TomTom
end
def points_from_way_costs(way_costs)
- points = Set.new
+ points = []
way_costs.each do |way_cost|
departure_id, arrival_id = way_cost.id.split('-')
- points.add(
- TomTom::Matrix::Point.new(
- way_cost.departure,
- departure_id
- )
+ departure = TomTom::Matrix::Point.new(
+ way_cost.departure,
+ departure_id
)
- points.add(
- TomTom::Matrix::Point.new(
- way_cost.arrival,
- arrival_id
- )
+ arrival = TomTom::Matrix::Point.new(
+ way_cost.arrival,
+ arrival_id
)
+
+ # Don't add duplicate coordinates. This assumes that
+ # `way_costs` consists of an ordered route of points where
+ # each departure coordinate is the same as the preceding
+ # arrival coordinate.
+ if points.empty? ||
+ points.last.coordinates != departure.coordinates
+ points << departure
+ end
+
+ points << arrival
end
points
diff --git a/lib/tom_tom/matrix/point.rb b/lib/tom_tom/matrix/point.rb
index 4e9d11e68..435b4d4b0 100644
--- a/lib/tom_tom/matrix/point.rb
+++ b/lib/tom_tom/matrix/point.rb
@@ -13,12 +13,6 @@ module TomTom
@coordinates == other.coordinates &&
@id == other.id
end
-
- alias :eql? :==
-
- def hash
- @coordinates.hash + @id.hash
- end
end
end
end
diff --git a/spec/lib/tom_tom/matrix_spec.rb b/spec/lib/tom_tom/matrix_spec.rb
index e67e539b7..b63ebc70b 100644
--- a/spec/lib/tom_tom/matrix_spec.rb
+++ b/spec/lib/tom_tom/matrix_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe TomTom::Matrix do
expect(
matrix.points_from_way_costs(way_costs)
- ).to eq(Set.new([
+ ).to eq([
TomTom::Matrix::Point.new(
Geokit::LatLng.new(48.85086, 2.36143),
'44'
@@ -31,13 +31,13 @@ RSpec.describe TomTom::Matrix do
Geokit::LatLng.new(52.50867, 13.42879),
'88'
)
- ]))
+ ])
end
end
describe "#points_as_params" do
it "transforms a set of LatLng points into a hash for use by TomTom Matrix" do
- points = Set.new([
+ points = [
TomTom::Matrix::Point.new(
Geokit::LatLng.new(48.85086, 2.36143),
'44'
@@ -50,7 +50,7 @@ RSpec.describe TomTom::Matrix do
Geokit::LatLng.new(52.50867, 13.42879),
'88'
)
- ])
+ ]
expect(
matrix.points_as_params(points)