File: geocode_address_countysub_exact.sql

package info (click to toggle)
postgis 1.3.3-3
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 10,468 kB
  • ctags: 4,310
  • sloc: sql: 73,321; ansic: 35,513; xml: 6,160; java: 6,061; sh: 3,428; perl: 1,447; cpp: 987; makefile: 727; yacc: 276; python: 192
file content (161 lines) | stat: -rw-r--r-- 8,633 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
CREATE OR REPLACE FUNCTION geocode_address_countysub_exact(
    result REFCURSOR,
    parsed NORM_ADDY
) RETURNS REFCURSOR
AS $_$
DECLARE
  result REFCURSOR;
  tempString VARCHAR;
  tempInt VARCHAR;
BEGIN
  IF parsed.location IS NULL THEN
    -- location is manditory.  This is the location geocoder after all.
    RETURN NULL;
  END IF;

  -- Check to see if the road name can be matched.
  IF parsed.stateAbbrev IS NOT NULL THEN
    SELECT INTO tempInt count(*) FROM tiger_geocode_roads
        WHERE parsed.location = tiger_geocode_roads.cousub
        AND soundex(parsed.streetName) = soundex(tiger_geocode_roads.fename)
        AND parsed.stateAbbrev = tiger_geocode_roads.state;
  ELSE
    SELECT INTO tempInt count(*) FROM tiger_geocode_roads
        WHERE parsed.location = tiger_geocode_roads.cousub
        AND soundex(parsed.streetName) = soundex(tiger_geocode_roads.fename);
  END IF;

  IF tempInt = 0 THEN
    RETURN NULL;
  ELSE
    -- The road name matches, now we check to see if the addresses match
    IF parsed.stateAbbrev IS NOT NULL THEN
      SELECT INTO tempInt count(*)
      FROM (
        SELECT *, rate_attributes(parsed.preDirAbbrev, tiger_geocode_roads.fedirp,
          parsed.streetName, tiger_geocode_roads.fename, parsed.streetTypeAbbrev,
          tiger_geocode_roads.fetype, parsed.postDirAbbrev,
          tiger_geocode_roads.fedirs) as rating
        FROM tiger_geocode_roads
        WHERE parsed.location = tiger_geocode_roads.cousub
          AND soundex(parsed.streetName) = soundex(tiger_geocode_roads.fename)
          AND parsed.stateAbbrev = tiger_geocode_roads.state
          ) AS subquery, roads_local
      WHERE includes_address(parsed.address, roads_local.fraddl, roads_local.toaddl,
          roads_local.fraddr, roads_local.toaddr)
        AND subquery.tlid = roads_local.tlid;
    ELSE
      SELECT INTO tempInt count(*)
      FROM (
        SELECT *, rate_attributes(parsed.preDirAbbrev, tiger_geocode_roads.fedirp,
          parsed.streetName, tiger_geocode_roads.fename, parsed.streetTypeAbbrev,
          tiger_geocode_roads.fetype, parsed.postDirAbbrev,
          tiger_geocode_roads.fedirs) as rating
        FROM tiger_geocode_roads
        WHERE parsed.location = tiger_geocode_roads.cousub
          AND soundex(parsed.streetName) = soundex(tiger_geocode_roads.fename)
          ) AS subquery, roads_local
      WHERE includes_address(parsed.address, roads_local.fraddl, roads_local.toaddl,
          roads_local.fraddr, roads_local.toaddr)
        AND subquery.tlid = roads_local.tlid;
    END IF;

    IF tempInt = 0 THEN
      RETURN NULL;
    ELSE
      IF parsed.stateAbbrev IS NOT NULL THEN
        OPEN result FOR
        SELECT
            roads_local.fedirp as fedirp,
            roads_local.fename as fename,
            roads_local.fetype as fetype,
            roads_local.fedirs as fedirs,
            CASE WHEN (parsed.address % 2) = roads_local.fraddl
              OR (parsed.address % 2) = roads_local.toaddl
              THEN coalesce(pl.name,zipl.city,csl.name,col.name) ELSE coalesce(pr.name,zipr.city,csr.name,cor.name) END as place,
            CASE WHEN (parsed.address % 2) = roads_local.fraddl
              OR (parsed.address % 2) = roads_local.toaddl
              THEN sl.abbrev ELSE sr.abbrev END as state,
            CASE WHEN (parsed.address % 2) = roads_local.fraddl
              OR (parsed.address % 2) = roads_local.toaddl
              THEN zipl ELSE zipr END as zip,
            interpolate_from_address(parsed.address, roads_local.fraddl,
                roads_local.toaddl, roads_local.fraddr, roads_local.toaddr,
                roads_local.geom) as address_geom,
            subquery.rating as rating
        FROM (
          SELECT *, rate_attributes(parsed.preDirAbbrev, tiger_geocode_roads.fedirp,
            parsed.streetName, tiger_geocode_roads.fename, parsed.streetTypeAbbrev,
            tiger_geocode_roads.fetype, parsed.postDirAbbrev,
            tiger_geocode_roads.fedirs, parsed.location,
            tiger_geocode_roads.cousub) as rating
          FROM tiger_geocode_roads
          WHERE parsed.location = tiger_geocode_roads.cousub
            AND soundex(parsed.streetName) = soundex(tiger_geocode_roads.fename)
            AND parsed.stateAbbrev = tiger_geocode_roads.state
            ) AS subquery
          JOIN roads_local ON (subquery.tlid = roads_local.tlid)
          JOIN state_lookup sl ON (roads_local.statel = sl.st_code)
          JOIN state_lookup sr ON (roads_local.stater = sr.st_code)
          LEFT JOIN place_lookup pl ON (roads_local.statel = pl.st_code AND roads_local.placel = pl.pl_code)
          LEFT JOIN place_lookup pr ON (roads_local.stater = pr.st_code AND roads_local.placer = pr.pl_code)
          LEFT JOIN county_lookup col ON (roads_local.statel = col.st_code AND roads_local.countyl = col.co_code)
          LEFT JOIN county_lookup cor ON (roads_local.stater = cor.st_code AND roads_local.countyr = cor.co_code)
          LEFT JOIN countysub_lookup csl ON (roads_local.statel = csl.st_code AND roads_local.countyl = csl.co_code AND roads_local.cousubl = csl.cs_code)
          LEFT JOIN countysub_lookup csr ON (roads_local.stater = csr.st_code AND roads_local.countyr = csr.co_code AND roads_local.cousubr = csr.cs_code)
          LEFT JOIN zip_lookup_base zipl ON (roads_local.zipl = zipl.zip)
          LEFT JOIN zip_lookup_base zipr ON (roads_local.zipr = zipr.zip)
        WHERE includes_address(parsed.address, roads_local.fraddl, roads_local.toaddl,
            roads_local.fraddr, roads_local.toaddr)
        ORDER BY subquery.rating;
        RETURN result;
      ELSE
        OPEN result FOR
        SELECT
            roads_local.fedirp as fedirp,
            roads_local.fename as fename,
            roads_local.fetype as fetype,
            roads_local.fedirs as fedirs,
            CASE WHEN (parsed.address % 2) = roads_local.fraddl
              OR (parsed.address % 2) = roads_local.toaddl
              THEN coalesce(pl.name,zipl.city,csl.name,col.name) ELSE coalesce(pr.name,zipr.city,csr.name,cor.name) END as place,
            CASE WHEN (parsed.address % 2) = roads_local.fraddl
              OR (parsed.address % 2) = roads_local.toaddl
              THEN sl.abbrev ELSE sr.abbrev END as state,
            CASE WHEN (parsed.address % 2) = roads_local.fraddl
              OR (parsed.address % 2) = roads_local.toaddl
              THEN zipl ELSE zipr END as zip,
            interpolate_from_address(parsed.address, roads_local.fraddl,
                roads_local.toaddl, roads_local.fraddr, roads_local.toaddr,
                roads_local.geom) as address_geom,
            subquery.rating as rating
        FROM (
          SELECT *, rate_attributes(parsed.preDirAbbrev, tiger_geocode_roads.fedirp,
            parsed.streetName, tiger_geocode_roads.fename, parsed.streetTypeAbbrev,
            tiger_geocode_roads.fetype, parsed.postDirAbbrev,
            tiger_geocode_roads.fedirs, parsed.location,
            tiger_geocode_roads.cousub) as rating
          FROM tiger_geocode_roads
          WHERE parsed.location = tiger_geocode_roads.cousub
            AND soundex(parsed.streetName) = soundex(tiger_geocode_roads.fename)
            ) AS subquery
            JOIN roads_local ON (subquery.tlid = roads_local.tlid)
            JOIN state_lookup sl ON (roads_local.statel = sl.st_code)
            JOIN state_lookup sr ON (roads_local.stater = sr.st_code)
            LEFT JOIN place_lookup pl ON (roads_local.statel = pl.st_code AND roads_local.placel = pl.pl_code)
            LEFT JOIN place_lookup pr ON (roads_local.stater = pr.st_code AND roads_local.placer = pr.pl_code)
            LEFT JOIN county_lookup col ON (roads_local.statel = col.st_code AND roads_local.countyl = col.co_code)
            LEFT JOIN county_lookup cor ON (roads_local.stater = cor.st_code AND roads_local.countyr = cor.co_code)
            LEFT JOIN countysub_lookup csl ON (roads_local.statel = csl.st_code AND roads_local.countyl = csl.co_code AND roads_local.cousubl = csl.cs_code)
            LEFT JOIN countysub_lookup csr ON (roads_local.stater = csr.st_code AND roads_local.countyr = csr.co_code AND roads_local.cousubr = csr.cs_code)
            LEFT JOIN zip_lookup_base zipl ON (roads_local.zipl = zipl.zip)
            LEFT JOIN zip_lookup_base zipr ON (roads_local.zipr = zipr.zip)
        WHERE includes_address(parsed.address, roads_local.fraddl, roads_local.toaddl,
            roads_local.fraddr, roads_local.toaddr)
            ORDER BY subquery.rating;
        RETURN result;
      END IF;
    END IF;
  END IF;
END;
$_$ LANGUAGE plpgsql;