geocode_records 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a895a090a8b5d022953b811691a6e8b4caec813b
4
- data.tar.gz: a29e9e2f6a3d926edcdd0c3152fe9d257cdb371f
3
+ metadata.gz: e5956f06797c3f79547c0385cc672b451e8ad23b
4
+ data.tar.gz: 6d4a9b488113ce87fe0bc4b8615dac61ecf60aec
5
5
  SHA512:
6
- metadata.gz: 30d88e8e7121c28fa5f81cb32037f1f596411c7c4d40762d8f44c92f6a442cd57fb6bbaf941d29aaf229cb7d7ee39d6ddd819ee3d075db67dc7077c214bdb50a
7
- data.tar.gz: '093ccaa9d2279430a359f080f66f4675583c7c649af6ac60432628bc9b8b210fc436ea4c58ded0cafe1288e86506e3708cc73a45972b3a009b146fd21b1d33b9'
6
+ metadata.gz: 1b3a7c67d72a3d38b0a76903f66fef501dea328f9c752df674aedc918a12ef2e7c166eb65c95ef9bf041e864ae7ce1caa81dea421d7b4852161c15d71dff87eb
7
+ data.tar.gz: eaa1f7f94982cb13ea692f43b42cf5b82e286c49787c8aa688b2b0764f83c36a63b1eaa0806b1c71bf8123295b086a08f67ea1eae012a1c5c1a6914c972d666f
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ 1.1.4 / 2018-01-29
2
+
3
+ * Enhancements
4
+
5
+ * num: 2 to geocode hnst2, etc.
6
+
1
7
  1.1.3 / 2018-01-23
2
8
 
3
9
  * Bug fixes
@@ -43,17 +43,20 @@ class GeocodeRecords
43
43
  # optional
44
44
  attr_reader :include_invalid
45
45
  attr_reader :subquery
46
+ attr_reader :num
46
47
 
47
48
  def initialize(
48
49
  database_url:,
49
50
  table_name:,
50
51
  subquery: nil,
51
- include_invalid: nil
52
+ include_invalid: false,
53
+ num: 1
52
54
  )
53
55
  @database_url = database_url
54
56
  @table_name = table_name
55
57
  @subquery = subquery
56
58
  @include_invalid = include_invalid
59
+ @num = num
57
60
  end
58
61
 
59
62
  def perform
@@ -71,7 +74,8 @@ class GeocodeRecords
71
74
  database_url: database_url,
72
75
  table_name: table_name,
73
76
  subquery: subquery,
74
- glob: glob
77
+ glob: glob,
78
+ num: num,
75
79
  ).perform
76
80
  unless File.size(ungeocoded_path) > 32
77
81
  return
@@ -79,12 +83,14 @@ class GeocodeRecords
79
83
  geocoded_path = GeocodeCsv.new(
80
84
  path: ungeocoded_path,
81
85
  glob: glob,
82
- include_invalid: include_invalid
86
+ include_invalid: include_invalid,
87
+ num: num,
83
88
  ).perform
84
89
  UpdateTableFromCsv.new(
85
90
  database_url: database_url,
86
91
  table_name: table_name,
87
- path: geocoded_path
92
+ path: geocoded_path,
93
+ num: num,
88
94
  ).perform
89
95
  ensure
90
96
  FileUtils.rm_f geocoded_path if geocoded_path
@@ -4,16 +4,20 @@ class GeocodeRecords
4
4
  attr_reader :glob
5
5
  attr_reader :table_name
6
6
  attr_reader :subquery
7
+ attr_reader :num
7
8
 
8
9
  def initialize(
9
10
  database_url:,
10
11
  glob:,
11
12
  table_name: nil,
12
- subquery: nil)
13
+ subquery: nil,
14
+ num: nil
15
+ )
13
16
  @database_url = database_url
14
17
  @glob = glob
15
18
  @table_name = table_name
16
19
  @subquery = subquery
20
+ @num = num
17
21
  end
18
22
 
19
23
  def perform
@@ -28,10 +32,13 @@ class GeocodeRecords
28
32
  private
29
33
 
30
34
  def sql
31
- @sql ||= unless glob
32
- "SELECT id, house_number_and_street, city, state, regexp_replace(postcode, '.0$', '') AS postcode FROM #{subquery ? "(#{subquery}) t1" : table_name} WHERE city IS NOT NULL OR postcode IS NOT NULL"
33
- else
34
- "SELECT id, glob FROM #{subquery ? "(#{subquery}) t1" : table_name} WHERE (city IS NULL AND postcode IS NULL) AND glob IS NOT NULL"
35
+ @sql ||= begin
36
+ num_suffix = (num == 1 ? '' : num)
37
+ unless glob
38
+ "SELECT id, house_number_and_street#{num_suffix}, city#{num_suffix}, state#{num_suffix}, regexp_replace(postcode#{num_suffix}, '.0$', '') AS postcode#{num_suffix} FROM #{subquery ? "(#{subquery}) t1" : table_name} WHERE city#{num_suffix} IS NOT NULL OR postcode#{num_suffix} IS NOT NULL"
39
+ else
40
+ "SELECT id, glob#{num_suffix} FROM #{subquery ? "(#{subquery}) t1" : table_name} WHERE (city#{num_suffix} IS NULL AND postcode#{num_suffix} IS NULL) AND glob#{num_suffix} IS NOT NULL"
41
+ end
35
42
  end
36
43
  end
37
44
  end
@@ -5,6 +5,7 @@ class GeocodeRecords
5
5
  attr_reader :path
6
6
  attr_reader :glob
7
7
  attr_reader :include_invalid
8
+ attr_reader :num
8
9
 
9
10
  REQUIRED_SMARTYSTREETS_VERSION = Gem::Version.new('1.8.2')
10
11
  COLUMN_DEFINITION = {
@@ -26,11 +27,13 @@ class GeocodeRecords
26
27
  def initialize(
27
28
  path:,
28
29
  glob:,
29
- include_invalid:
30
+ include_invalid:,
31
+ num:
30
32
  )
31
33
  @path = path
32
34
  @glob = glob
33
35
  @include_invalid = include_invalid
36
+ @num = num
34
37
  end
35
38
 
36
39
  def perform
@@ -58,13 +61,18 @@ class GeocodeRecords
58
61
  private
59
62
 
60
63
  def input_map
61
- @input_map ||= if glob
62
- { 'street' => 'glob' }
63
- else
64
- {
65
- 'street' => 'house_number_and_street',
66
- 'zipcode' => 'postcode',
67
- }
64
+ @input_map ||= begin
65
+ num_suffix = (num == 1 ? '' : num)
66
+ if glob
67
+ { 'street' => "glob#{num_suffix}" }
68
+ else
69
+ {
70
+ 'street' => "house_number_and_street#{num_suffix}",
71
+ 'zipcode' => "postcode#{num_suffix}",
72
+ 'city' => "city#{num_suffix}",
73
+ 'state' => "state#{num_suffix}",
74
+ }
75
+ end
68
76
  end
69
77
  end
70
78
 
@@ -33,8 +33,8 @@ class GeocodeRecords
33
33
  UPDATE_TABLE_SQL = (<<-SQL).gsub(' ', '').freeze
34
34
  UPDATE $TABLE_NAME AS target
35
35
  SET
36
- house_number_and_street = src.ss_delivery_line_1,
37
- house_number = CASE
36
+ house_number_and_street$NUM_SUFFIX = src.ss_delivery_line_1,
37
+ house_number$NUM_SUFFIX = CASE
38
38
  WHEN src.ss_primary_number IS NULL THEN NULL
39
39
  WHEN LENGTH(src.ss_primary_number) > 8 THEN NULL
40
40
  WHEN src.ss_primary_number ~ '\\A\\d+\\Z' THEN src.ss_primary_number::int
@@ -42,12 +42,12 @@ class GeocodeRecords
42
42
  WHEN src.ss_primary_number ~ '-' THEN (SELECT ROUND(AVG(v)) FROM unnest(array_remove(regexp_split_to_array(src.ss_primary_number, '\\D+'), '')::int[]) v)
43
43
  ELSE (SELECT regexp_matches(src.ss_primary_number, '(\\d+)'))[1]::int
44
44
  END,
45
- unit_number = src.ss_secondary_number,
46
- city = COALESCE(src.ss_default_city_name, src.ss_city_name),
47
- state = src.ss_state_abbreviation,
48
- postcode = src.ss_zipcode,
49
- latitude = src.ss_latitude,
50
- longitude = src.ss_longitude
45
+ unit_number$NUM_SUFFIX = src.ss_secondary_number,
46
+ city$NUM_SUFFIX = COALESCE(src.ss_default_city_name, src.ss_city_name),
47
+ state$NUM_SUFFIX = src.ss_state_abbreviation,
48
+ postcode$NUM_SUFFIX = src.ss_zipcode,
49
+ latitude$NUM_SUFFIX = src.ss_latitude,
50
+ longitude$NUM_SUFFIX = src.ss_longitude
51
51
  FROM $TMP_TABLE_NAME AS src
52
52
  WHERE
53
53
  target.id = src.id
@@ -57,15 +57,18 @@ class GeocodeRecords
57
57
  attr_reader :database_url
58
58
  attr_reader :table_name
59
59
  attr_reader :path
60
+ attr_reader :num
60
61
 
61
62
  def initialize(
62
63
  database_url:,
63
64
  table_name:,
64
- path:
65
+ path:,
66
+ num:
65
67
  )
66
68
  @database_url = database_url
67
69
  @table_name = table_name
68
70
  @path = path
71
+ @num = num
69
72
  end
70
73
 
71
74
  def perform
@@ -84,7 +87,7 @@ class GeocodeRecords
84
87
  memo = "geocode_records_#{table_name}_#{rand(999999)}".gsub(/[^a-z0-9_]/i, '')
85
88
  GeocodeRecords.psql(
86
89
  database_url,
87
- CREATE_TABLE_SQL.sub('$TMP_TABLE_NAME', memo)
90
+ CREATE_TABLE_SQL.gsub('$TMP_TABLE_NAME', memo)
88
91
  )
89
92
  memo
90
93
  end
@@ -103,14 +106,15 @@ class GeocodeRecords
103
106
  def load_csv_into_tmp_table(path:, table_name:)
104
107
  GeocodeRecords.psql(
105
108
  database_url,
106
- COPY_SQL.sub('$TMP_TABLE_NAME', table_name).sub('$PATH', path)
109
+ COPY_SQL.gsub('$TMP_TABLE_NAME', table_name).gsub('$PATH', path)
107
110
  )
108
111
  end
109
112
 
110
113
  def update_original_table(tmp_table_name)
114
+ num_suffix = (num == 1 ? '' : num.to_s)
111
115
  GeocodeRecords.psql(
112
116
  database_url,
113
- UPDATE_TABLE_SQL.sub('$TMP_TABLE_NAME', tmp_table_name).sub('$TABLE_NAME', table_name)
117
+ UPDATE_TABLE_SQL.gsub('$TMP_TABLE_NAME', tmp_table_name).gsub('$TABLE_NAME', table_name).gsub('$NUM_SUFFIX', num_suffix)
114
118
  )
115
119
  end
116
120
 
@@ -1,3 +1,3 @@
1
1
  class GeocodeRecords
2
- VERSION = '1.1.3'
2
+ VERSION = '1.1.4'
3
3
  end
@@ -8,6 +8,15 @@ describe GeocodeRecords do
8
8
  subject
9
9
  home.reload
10
10
  expect(home.house_number_and_street).to eq('1038 E Dayton St')
11
+ expect(home.latitude).to be_present
12
+ end
13
+
14
+ it "geocodes addr 2" do
15
+ home = Home.create! house_number_and_street2: '1038 e deyton st', postcode2: '53703'
16
+ GeocodeRecords.new(database_url: ENV.fetch('DATABASE_URL'), table_name: 'homes', num: 2).perform
17
+ home.reload
18
+ expect(home.house_number_and_street2).to eq('1038 E Dayton St')
19
+ expect(home.latitude2).to be_present
11
20
  end
12
21
 
13
22
  it "geocodes quoted table name" do
@@ -25,6 +34,14 @@ describe GeocodeRecords do
25
34
  expect(home.postcode).to eq('53703')
26
35
  end
27
36
 
37
+ it "geocodes glob2" do
38
+ home = Home.create! glob2: '1038 e dayton st, madison, wi 53703'
39
+ GeocodeRecords.new(database_url: ENV.fetch('DATABASE_URL'), table_name: 'homes', num: 2).perform
40
+ home.reload
41
+ expect(home.house_number_and_street2).to eq('1038 E Dayton St')
42
+ expect(home.postcode2).to eq('53703')
43
+ end
44
+
28
45
  it "geocodes by sql" do
29
46
  home = Home.create! house_number_and_street: '1038 e deyton st', postcode: '53703', foo: 'bar'
30
47
  home_ignored = Home.create! house_number_and_street: '1038 e deyton st', postcode: '53703'
@@ -35,6 +52,16 @@ describe GeocodeRecords do
35
52
  expect(home_ignored.latitude).to be_nil
36
53
  end
37
54
 
55
+ it "geocodes by sql num 2" do
56
+ home = Home.create! house_number_and_street2: '1038 e deyton st', postcode2: '53703', foo: 'bar'
57
+ home_ignored = Home.create! house_number_and_street2: '1038 e deyton st', postcode2: '53703'
58
+ GeocodeRecords.new(database_url: ENV.fetch('DATABASE_URL'), table_name: 'homes', subquery: %{SELECT * FROM homes WHERE foo = 'bar'}, num: 2).perform
59
+ home.reload
60
+ home_ignored.reload
61
+ expect(home.latitude2).to be_present
62
+ expect(home_ignored.latitude2).to be_nil
63
+ end
64
+
38
65
  it "doesn't break on float-format postcode" do
39
66
  home = Home.create! house_number_and_street: '1038 e deyton st', postcode: '53703.0'
40
67
  subject
@@ -30,6 +30,15 @@ unless ENV['FAST'] == 'true'
30
30
  postcode text,
31
31
  latitude float,
32
32
  longitude float,
33
+ glob2 text,
34
+ house_number_and_street2 text,
35
+ house_number2 int,
36
+ unit_number2 text,
37
+ city2 text,
38
+ state2 text,
39
+ postcode2 text,
40
+ latitude2 float,
41
+ longitude2 float,
33
42
  foo text
34
43
  )
35
44
  SQL
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geocode_records
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seamus Abshere
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-23 00:00:00.000000000 Z
11
+ date: 2018-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport