Initial commit
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
require_relative '../../lib/internal-geocoder/input_type_resolver.rb'
|
||||
require_relative '../../../../spec/rspec_configuration.rb'
|
||||
|
||||
class String
|
||||
# We just need this instead of adding the whole rails thing
|
||||
def present?
|
||||
self && !empty?
|
||||
end
|
||||
end
|
||||
|
||||
describe CartoDB::InternalGeocoder::InputTypeResolver do
|
||||
|
||||
before(:each) do
|
||||
@internal_geocoder = mock
|
||||
@input_type_resolver = CartoDB::InternalGeocoder::InputTypeResolver.new(@internal_geocoder)
|
||||
end
|
||||
|
||||
describe '#type' do
|
||||
|
||||
it 'should return an array characterizing the inputs for <namedplace, country_name, region_name, point>' do
|
||||
@internal_geocoder.stubs('kind').once.returns(:namedplace)
|
||||
@internal_geocoder.stubs('geometry_type').once.returns(:point)
|
||||
@internal_geocoder.stubs('country_column').once.returns(nil)
|
||||
@internal_geocoder.stubs('region_column').once.returns(nil)
|
||||
@internal_geocoder.stubs('regions').once.returns('region')
|
||||
|
||||
@input_type_resolver.type.should == [:namedplace, :text, :text, :point]
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe '#kind' do
|
||||
it 'should return the type of the internal geocoding: namedplace' do
|
||||
@internal_geocoder.stubs('kind').once.returns(:namedplace)
|
||||
@input_type_resolver.kind.should == :namedplace
|
||||
end
|
||||
end
|
||||
|
||||
describe '#geometry_type' do
|
||||
it 'should return the type of the geometry to be geocoded: polygon' do
|
||||
@internal_geocoder.stubs('geometry_type').once.returns(:polygon)
|
||||
@input_type_resolver.geometry_type.should == :polygon
|
||||
end
|
||||
end
|
||||
|
||||
describe '#country_input_type' do
|
||||
it 'should return column if a column was passed' do
|
||||
@internal_geocoder.stubs('country_column').once.returns('any_column_name')
|
||||
@input_type_resolver.country_input_type.should == :column
|
||||
end
|
||||
|
||||
it 'should return column if no column was passed' do
|
||||
@internal_geocoder.stubs('country_column').once.returns(nil)
|
||||
@input_type_resolver.country_input_type.should == :text
|
||||
end
|
||||
end
|
||||
|
||||
describe '#region_input_type' do
|
||||
it 'should return :column if a column is present' do
|
||||
@internal_geocoder.stubs('region_column').once.returns('wadus')
|
||||
@input_type_resolver.region_input_type.should == :column
|
||||
end
|
||||
|
||||
it 'should return :text if regions are present' do
|
||||
@internal_geocoder.stubs('region_column').once.returns(nil)
|
||||
@internal_geocoder.stubs('regions').once.returns('minnesota')
|
||||
@input_type_resolver.region_input_type.should == :text
|
||||
end
|
||||
|
||||
it 'should return nil if no column or text are present' do
|
||||
@internal_geocoder.stubs('region_column').once.returns(nil)
|
||||
@internal_geocoder.stubs('regions').once.returns('')
|
||||
@input_type_resolver.region_input_type.should == nil
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,118 @@
|
||||
require_relative '../../lib/internal-geocoder/query_generator_factory.rb'
|
||||
require_relative '../../lib/internal-geocoder/abstract_query_generator.rb'
|
||||
require_relative '../../../../spec/rspec_configuration.rb'
|
||||
require 'active_support/core_ext' # Needed for string.blank?
|
||||
|
||||
RSpec.configure do |config|
|
||||
config.mock_with :mocha
|
||||
end
|
||||
|
||||
=begin
|
||||
The class should generate queries to be used by the InternalGeocoder depending on the inputs.
|
||||
|
||||
* Different types of inputs:
|
||||
- kind: namedplace, ipaddress, postalcode, admin0, admin1
|
||||
- country: column, freetext
|
||||
- geometry_type: point, polygon
|
||||
|
||||
* Where queries are needed:
|
||||
- to query the data-services
|
||||
- to import results into table
|
||||
=end
|
||||
|
||||
describe CartoDB::InternalGeocoder::QueryGeneratorFactory do
|
||||
|
||||
before(:each) do
|
||||
@internal_geocoder = mock
|
||||
end
|
||||
|
||||
describe '#dataservices' do
|
||||
|
||||
it 'should return a query template suitable for <namedplace, country_name, region_name, point>' do
|
||||
query_generator = CartoDB::InternalGeocoder::QueryGeneratorFactory.get(@internal_geocoder, [:namedplace, :text, :text, :point])
|
||||
query_generator.should be_a_kind_of CartoDB::InternalGeocoder::AbstractQueryGenerator
|
||||
@internal_geocoder.expects('countries').once.returns(%Q{'Spain'})
|
||||
@internal_geocoder.expects('regions').once.returns(%Q{'Madrid'})
|
||||
search_terms = [{city: %Q{'Madrid'}}, {city: %Q{'Granada'}}]
|
||||
|
||||
query = query_generator.dataservices_query(search_terms)
|
||||
|
||||
query.should == "WITH geo_function AS (SELECT (geocode_namedplace(Array['Madrid','Granada'], 'Madrid', 'Spain')).*) SELECT q, c, a1, geom, success FROM geo_function"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe '#search_terms_query' do
|
||||
it 'should get the search terms for <namedplace, country_name, region_name, point>' do
|
||||
@internal_geocoder.stubs('column_name').once.returns('city')
|
||||
@internal_geocoder.stubs('qualified_table_name').once.returns(%Q{"public"."untitled_table"})
|
||||
@internal_geocoder.stubs('batch_size').returns(5000)
|
||||
query_generator = CartoDB::InternalGeocoder::QueryGeneratorFactory.get(@internal_geocoder, [:namedplace, :text, :text, :point])
|
||||
|
||||
query = query_generator.search_terms_query(0)
|
||||
|
||||
query.squish.should == 'SELECT DISTINCT(trim(quote_nullable("city"))) AS city FROM "public"."untitled_table" WHERE cartodb_georef_status IS NULL LIMIT 5000 OFFSET 0'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#copy_results_to_table_query' do
|
||||
it 'should generate a suitable query to update geocoded table with temp table' do
|
||||
@internal_geocoder.stubs('qualified_table_name').returns(%Q{"public"."untitled_table"})
|
||||
@internal_geocoder.stubs('temp_table_name').once.returns('any_temp_table')
|
||||
@internal_geocoder.stubs('column_name').once.returns('any_column_name')
|
||||
query_generator = CartoDB::InternalGeocoder::QueryGeneratorFactory.get(@internal_geocoder, [:namedplace, :text, :text, :point])
|
||||
|
||||
query = query_generator.copy_results_to_table_query
|
||||
|
||||
query.squish.should == %Q{
|
||||
UPDATE "public"."untitled_table" AS dest
|
||||
SET the_geom = CASE WHEN orig.cartodb_georef_status THEN orig.the_geom ELSE dest.the_geom END,
|
||||
cartodb_georef_status = orig.cartodb_georef_status
|
||||
FROM any_temp_table AS orig
|
||||
WHERE trim(dest."any_column_name"::text) = trim(orig.geocode_string) AND dest.cartodb_georef_status IS NULL
|
||||
}.squish
|
||||
end
|
||||
end
|
||||
|
||||
describe 'CDB-4269' do
|
||||
it 'should generate a suitable query generator for [:admin1, :column, nil, :polygon]' do
|
||||
@internal_geocoder.stubs('column_name').twice.returns('region_column_name')
|
||||
@internal_geocoder.stubs('qualified_table_name').returns('any_table_name')
|
||||
@internal_geocoder.stubs('country_column').twice.returns('country_column_name')
|
||||
@internal_geocoder.stubs('batch_size').twice.returns(10)
|
||||
@internal_geocoder.stubs('temp_table_name').once.returns('any_temp_tablename')
|
||||
|
||||
query_generator = CartoDB::InternalGeocoder::QueryGeneratorFactory.get(@internal_geocoder, [:admin1, :column, nil, :polygon])
|
||||
|
||||
query_generator.search_terms_query(0).squish.should == %Q{
|
||||
SELECT DISTINCT
|
||||
trim(quote_nullable(region_column_name)) as region,
|
||||
trim(quote_nullable(country_column_name)) as country
|
||||
FROM any_table_name
|
||||
WHERE cartodb_georef_status IS NULL
|
||||
LIMIT 10 OFFSET 0
|
||||
}.squish
|
||||
|
||||
search_terms = [
|
||||
{ region: %Q{'New York'}, country: %Q{'USA'}},
|
||||
{ region: %Q{'Sucumbios'}, country: %Q{'Ecuador'}}
|
||||
]
|
||||
|
||||
query_generator.dataservices_query(search_terms).squish.should == %Q{
|
||||
WITH geo_function AS (SELECT (geocode_admin1_polygons(Array['New York','Sucumbios'], Array['USA','Ecuador'])).*)
|
||||
SELECT q, c, null AS a1, geom, success FROM geo_function
|
||||
}.squish
|
||||
|
||||
query_generator.copy_results_to_table_query.squish.should == %Q{
|
||||
UPDATE any_table_name AS dest
|
||||
SET the_geom = CASE WHEN orig.cartodb_georef_status THEN orig.the_geom ELSE dest.the_geom END,
|
||||
cartodb_georef_status = orig.cartodb_georef_status
|
||||
FROM any_temp_tablename AS orig
|
||||
WHERE trim(dest.region_column_name::text) = trim(orig.geocode_string)
|
||||
AND trim(dest.country_column_name::text) = trim(orig.country)
|
||||
AND dest.cartodb_georef_status IS NULL
|
||||
}.squish
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user