]> granicus.if.org Git - postgis/commitdiff
simplify logic by getting rid of addr join. Speed improved slightly
authorRegina Obe <lr@pcorp.us>
Sun, 17 Jul 2011 16:46:06 +0000 (16:46 +0000)
committerRegina Obe <lr@pcorp.us>
Sun, 17 Jul 2011 16:46:06 +0000 (16:46 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@7648 b70326c6-7e19-0410-871a-916f4a2858ee

extras/tiger_geocoder/tiger_2010/geocode/reverse_geocode.sql

index f30f08dabaf0f186cba051d634e7cc0eb494ed78..bd393c509822ba17e353dbe665fb020c6ee57e00 100644 (file)
@@ -90,38 +90,33 @@ BEGIN
            WITH ref AS (
                SELECT ' || quote_literal(var_pt::text) || '::geometry As ref_geom ) , 
                        f AS 
-                       ( SELECT * FROM faces CROSS JOIN ref
+                       ( SELECT faces.* FROM faces CROSS JOIN ref
                        WHERE statefp = ' || quote_literal(var_state) || ' AND countyfp = ' || quote_literal(var_countyfp) || ' 
                                AND ST_Intersects(faces.the_geom, ref_geom)
                                    ),
                        e AS 
-                       ( SELECT edges.* , CASE WHEN edges.tfidr = f.tfid THEN ''R'' WHEN edges.tfidl = f.tfid THEN ''L'' ELSE NULL END::varchar As eside
+                       ( SELECT edges.* , CASE WHEN edges.tfidr = f.tfid THEN ''R'' WHEN edges.tfidl = f.tfid THEN ''L'' ELSE NULL END::varchar As eside,
+                    CASE WHEN edges.tfidr = f.tfid THEN rfromadd ELSE lfromadd END As fromhn, CASE WHEN edges.tfidr = f.tfid THEN rtoadd ELSE ltoadd END As tohn,
+                    CASE WHEN edges.tfidr = f.tfid THEN zipr ELSE zipl END As zip , 
+                    ST_ClosestPoint(edges.the_geom,ref_geom) As center_pt, ref_geom
                                FROM edges INNER JOIN f ON (f.statefp = edges.statefp AND (edges.tfidr = f.tfid OR edges.tfidl = f.tfid)) 
                                    CROSS JOIN ref
                        WHERE edges.statefp = ' || quote_literal(var_state) || ' AND edges.countyfp = ' || quote_literal(var_countyfp) || ' 
                                AND ST_DWithin(edges.the_geom, ref.ref_geom, 0.01) AND (edges.mtfcc LIKE ''S%'') --only consider streets and roads
-                                 ),
-                       a AS (SELECT addr.* FROM addr INNER JOIN e ON (addr.statefp = e.statefp AND addr.tlid = e.tlid)
-                               WHERE addr.statefp = ' || quote_literal(var_state) || '),
-                       n AS (SELECT featnames.* FROM featnames INNER JOIN e ON(featnames.statefp = e.statefp AND featnames.tlid = e.tlid)
-                           WHERE featnames.statefp = ' || quote_literal(var_state) || ' AND e.mtfcc LIKE ''S%''  )
-                               
+                                 )                             
                SELECT * 
                FROM (SELECT DISTINCT ON(tlid,eside)  foo.fullname, foo.streetname, foo.streettypeabbrev, foo.zip,  foo.center_pt,
                          eside, to_number(fromhn, ''999999'') As fromhn, to_number(tohn, ''999999'') As tohn, ST_GeometryN(ST_Multi(line),1) As line, 
-                         ST_Distance_Sphere(foo.line, ' || quote_literal(var_pt::text) || '::geometry) As dist
+                          dist
                FROM 
                  (SELECT e.tlid, e.the_geom As line, COALESCE(n.fullname,e.fullname) As fullname, COALESCE(n.prequalabr || '' '','''')  || n.name AS streetname, n.predirabrv, COALESCE(suftypabrv, pretypabrv) As streettypeabbrev,
-                     n.sufdirabrv, a.zip, ST_ClosestPoint(e.the_geom,' || quote_literal(var_pt::text) || '::geometry) As center_pt, e.eside, a.fromhn, a.tohn ,
-                         ST_Distance_Sphere(e.the_geom, ' || quote_literal(var_pt::text) || '::geometry) As dist
+                     n.sufdirabrv, e.zip, e.eside, e.fromhn, e.tohn , e.center_pt,
+                         ST_Distance_Sphere(e.center_pt,ref_geom) As dist
                                FROM e 
-                                       LEFT JOIN a ON    
-                                          ( a.tlid = e.tlid 
-                                              AND  a.side = e.eside
-                                              )  
-                                       LEFT JOIN n ON (n.statefp =  e.statefp AND n.tlid = e.tlid) 
+                                       LEFT JOIN (SELECT featnames.* FROM featnames 
+                           WHERE featnames.statefp = ' || quote_literal(var_state) ||' AND featnames.mtfcc LIKE ''S%''  ) AS n ON (n.statefp =  e.statefp AND n.tlid = e.tlid) 
                                ORDER BY dist LIMIT 50 ) As foo 
-                               ORDER BY foo.tlid, foo.eside, foo.fullname ASC NULLS LAST, dist LIMIT 15) As f ORDER BY f.dist ';
+                               ORDER BY foo.tlid, foo.eside, foo.fullname ASC NULLS LAST, dist LIMIT 50) As f ORDER BY f.dist ';
                                
        IF var_debug = true THEN
            RAISE NOTICE 'Statement 1: %', var_stmt;