From e2cbcdb4dc32db05e2c6d7a7bb57952e1da6dab3 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Fri, 23 Mar 2018 17:01:16 +0100 Subject: TomTom::Matrix#points_from_way_costs: Include stop IDs with points We need to persist stop IDs in order to properly construct `WayCost` objects from the costs returned from the TomTom matrix API. In order to persist stop IDs, my idea here is to group together a point and its corresponding ID into a bucket. When we later `#extract_costs_to_way_costs!`, we'll be able to grab the correct ID for a given coordinate to create a `WayCost` from it. Here, we create a new `TomTom::Matrix::Point` class that encapsulates a coordinate and an ID, and build a `Set` of those. I needed an `#eql?` and `#hash` method on `Point` as described in the `Set` documentation (https://ruby-doc.org/stdlib-1.9.3/libdoc/set/rdoc/Set.html) in order to properly maintain a unique set. Refs #6222 --- lib/tom_tom/matrix/point.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 lib/tom_tom/matrix/point.rb (limited to 'lib/tom_tom/matrix/point.rb') diff --git a/lib/tom_tom/matrix/point.rb b/lib/tom_tom/matrix/point.rb new file mode 100644 index 000000000..4e9d11e68 --- /dev/null +++ b/lib/tom_tom/matrix/point.rb @@ -0,0 +1,24 @@ +module TomTom + class Matrix + class Point + attr_reader :coordinates, :id + + def initialize(coordinates, id) + @coordinates = coordinates + @id = id + end + + def ==(other) + other.is_a?(self.class) && + @coordinates == other.coordinates && + @id == other.id + end + + alias :eql? :== + + def hash + @coordinates.hash + @id.hash + end + end + end +end -- cgit v1.2.3 From ebd46f068fbf11ea8793e9f7982b3a5291e21398 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Mon, 26 Mar 2018 15:52:43 +0200 Subject: 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 --- lib/tom_tom/matrix/point.rb | 6 ------ 1 file changed, 6 deletions(-) (limited to 'lib/tom_tom/matrix/point.rb') 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 -- cgit v1.2.3