diff --git a/lib/tel_selections.rb b/lib/tel_selections.rb index 54945aa39fdd6e35474d2786d3286191798b8c0e..ef7aa49fe7108719c8070be413b4d7e85660cd3d 100644 --- a/lib/tel_selections.rb +++ b/lib/tel_selections.rb @@ -237,7 +237,7 @@ class TelSelections end end - def initialize(q) + def initialize(q, **) @q = q end @@ -248,9 +248,7 @@ class TelSelections { areaCode: [:AreaCode, /\A[2-9][0-9]{2}\Z/], npaNxx: [:NpaNxx, /\A(?:[2-9][0-9]{2}){2}\Z/], - npaNxxx: [:NpaNxxx, /\A(?:[2-9][0-9]{2}){2}[0-9]\Z/], - zip: [:PostalCode, /\A\d{5}(?:-\d{4})?\Z/], - localVanity: [:LocalVanity, /\A~(.+)\Z/] + npaNxxx: [:NpaNxxx, /\A(?:[2-9][0-9]{2}){2}[0-9]\Z/] }.each do |k, args| klass = const_set( args[0], @@ -258,6 +256,10 @@ class TelSelections define_method(:iris_query) do { k => @q } end + + define_method(:sql_query) do + ["SELECT * FROM tel_inventory WHERE tel LIKE ?", "+1#{@q}%"] + end } ) @@ -266,6 +268,42 @@ class TelSelections end end + class PostalCode < Q + Q.register(/\A\d{5}(?:-\d{4})?\Z/, &method(:new)) + + def iris_query + { zip: @q } + end + + def sql_query + nil + end + end + + class LocalVanity < Q + Q.register(/\A~(.+)\Z/, &method(:new)) + + def iris_query + { localVanity: @q } + end + + def sql_query + ["SELECT * FROM tel_inventory WHERE tel LIKE ?", "%#{q_digits}%"] + end + + def q_digits + @q + .gsub(/[ABC]/i, "2") + .gsub(/[DEF]/i, "3") + .gsub(/[GHI]/i, "4") + .gsub(/[JKL]/i, "5") + .gsub(/[MNO]/i, "6") + .gsub(/[PQRS]/i, "7") + .gsub(/[TUV]/i, "8") + .gsub(/[WXYZ]/i, "9") + end + end + class State Q.register(/\A[a-zA-Z]{2}\Z/, &method(:new)) @@ -285,6 +323,10 @@ class TelSelections { state: @state } end + def sql_query + ["SELECT * FROM tel_inventory WHERE region = ?", @state] + end + def to_s @state end @@ -328,6 +370,13 @@ class TelSelections @state.iris_query.merge(city: @city) end + def sql_query + [ + "SELECT * FROM tel_inventory WHERE region = ? AND locality = ?", + @state.to_s, @city + ] + end + def to_s "#{@city}, #{@state}" end diff --git a/test/test_tel_selections.rb b/test/test_tel_selections.rb index a421cbf2cb79c59c46e0f761d26aa81295c94b1d..00d960cf8f11f56e110d9b570c75c481d0853e6e 100644 --- a/test/test_tel_selections.rb +++ b/test/test_tel_selections.rb @@ -168,41 +168,102 @@ class TelSelectionsTest < Minitest::Test assert_equal({ areaCode: "226" }, q.iris_query) end + def test_for_area_code_sql + q = TelSelections::ChooseTel::Q.for("226") + assert_equal( + ["SELECT * FROM tel_inventory WHERE tel LIKE ?", "+1226%"], + q.sql_query + ) + end + def test_for_npanxx q = TelSelections::ChooseTel::Q.for("226666") assert_equal({ npaNxx: "226666" }, q.iris_query) end + def test_for_npanxx_sql + q = TelSelections::ChooseTel::Q.for("226666") + assert_equal( + ["SELECT * FROM tel_inventory WHERE tel LIKE ?", "+1226666%"], + q.sql_query + ) + end + def test_for_npanxxx q = TelSelections::ChooseTel::Q.for("2266667") assert_equal({ npaNxxx: "2266667" }, q.iris_query) end + def test_for_npanxxx_sql + q = TelSelections::ChooseTel::Q.for("2266667") + assert_equal( + ["SELECT * FROM tel_inventory WHERE tel LIKE ?", "+12266667%"], + q.sql_query + ) + end + def test_for_zip q = TelSelections::ChooseTel::Q.for("90210") assert_equal({ zip: "90210" }, q.iris_query) end + def test_for_zip_sql + q = TelSelections::ChooseTel::Q.for("90210") + refute q.sql_query + end + def test_for_localvanity q = TelSelections::ChooseTel::Q.for("~mboa") assert_equal({ localVanity: "mboa" }, q.iris_query) end + def test_for_localvanity_sql + q = TelSelections::ChooseTel::Q.for("~mboa") + assert_equal( + ["SELECT * FROM tel_inventory WHERE tel LIKE ?", "%6262%"], + q.sql_query + ) + end + def test_for_state q = TelSelections::ChooseTel::Q.for("ON") assert_equal({ state: "ON" }, q.iris_query) end + def test_for_state_sql + q = TelSelections::ChooseTel::Q.for("ON") + assert_equal( + ["SELECT * FROM tel_inventory WHERE region = ?", "ON"], + q.sql_query + ) + end + def test_for_state_name q = TelSelections::ChooseTel::Q.for("ontario") assert_equal({ state: "ON" }, q.iris_query) end + def test_for_state_name_sql + q = TelSelections::ChooseTel::Q.for("ontario") + assert_equal( + ["SELECT * FROM tel_inventory WHERE region = ?", "ON"], + q.sql_query + ) + end + def test_for_new_york q = TelSelections::ChooseTel::Q.for("New York") assert_equal({ state: "NY" }, q.iris_query) end + def test_for_new_york_sql + q = TelSelections::ChooseTel::Q.for("New York") + assert_equal( + ["SELECT * FROM tel_inventory WHERE region = ?", "NY"], + q.sql_query + ) + end + def test_for_new_york_ny q = TelSelections::ChooseTel::Q.for( "New York, NY", @@ -212,6 +273,21 @@ class TelSelectionsTest < Minitest::Test assert_equal({ city: "New York City", state: "NY" }, q.iris_query) end + def test_for_new_york_ny_sql + q = TelSelections::ChooseTel::Q.for( + "New York, NY", + db: FakeDB.new, + memcache: FakeMemcache.new + ) + assert_equal( + [ + "SELECT * FROM tel_inventory WHERE region = ? AND locality = ?", + "NY", "New York City" + ], + q.sql_query + ) + end + def test_for_new_york_new_york q = TelSelections::ChooseTel::Q.for( "New York, New York", @@ -221,6 +297,21 @@ class TelSelectionsTest < Minitest::Test assert_equal({ city: "New York City", state: "NY" }, q.iris_query) end + def test_for_new_york_new_york_sql + q = TelSelections::ChooseTel::Q.for( + "New York, New York", + db: FakeDB.new, + memcache: FakeMemcache.new + ) + assert_equal( + [ + "SELECT * FROM tel_inventory WHERE region = ? AND locality = ?", + "NY", "New York City" + ], + q.sql_query + ) + end + def test_for_citystate q = TelSelections::ChooseTel::Q.for( "Toronto, ON", @@ -230,6 +321,21 @@ class TelSelectionsTest < Minitest::Test assert_equal({ city: "Toronto", state: "ON" }, q.iris_query) end + def test_for_citystate_sql + q = TelSelections::ChooseTel::Q.for( + "Toronto, ON", + db: FakeDB.new, + memcache: FakeMemcache.new + ) + assert_equal( + [ + "SELECT * FROM tel_inventory WHERE region = ? AND locality = ?", + "ON", "Toronto" + ], + q.sql_query + ) + end + def test_for_citystate_name q = TelSelections::ChooseTel::Q.for( "Toronto, Ontario", @@ -239,6 +345,21 @@ class TelSelectionsTest < Minitest::Test assert_equal({ city: "Toronto", state: "ON" }, q.iris_query) end + def test_for_citystate_name_sql + q = TelSelections::ChooseTel::Q.for( + "Toronto, Ontario", + db: FakeDB.new, + memcache: FakeMemcache.new + ) + assert_equal( + [ + "SELECT * FROM tel_inventory WHERE region = ? AND locality = ?", + "ON", "Toronto" + ], + q.sql_query + ) + end + def test_for_garbage assert_raises { TelSelections::ChooseTel::Q.for("garbage") } end