+ // All other tables are rank 30 only.
+ if ($iMaxRank == 30) {
+ // TIGER table
+ if (CONST_Use_US_Tiger_Data) {
+ $sPlaceIDs = Result::joinIdsByTable($aResults, Result::TABLE_TIGER);
+ if ($sPlaceIDs) {
+ $sHousenumbers = Result::sqlHouseNumberTable($aResults, Result::TABLE_TIGER);
+ // Tiger search only if a housenumber was searched and if it was found
+ // (realized through a join)
+ $sSQL = " SELECT ";
+ $sSQL .= " 'T' AS osm_type, ";
+ $sSQL .= " (SELECT osm_id from placex p WHERE p.place_id=blub.parent_place_id) as osm_id, ";
+ $sSQL .= " 'place' AS class, ";
+ $sSQL .= " 'house' AS type, ";
+ $sSQL .= ' null AS admin_level, ';
+ $sSQL .= ' 30 AS rank_search, ';
+ $sSQL .= ' 30 AS rank_address, ';
+ $sSQL .= ' place_id, ';
+ $sSQL .= ' parent_place_id, ';
+ $sSQL .= ' housenumber_for_place as housenumber,';
+ $sSQL .= " 'us' AS country_code, ";
+ $sSQL .= $this->langAddressSql('housenumber_for_place');
+ $sSQL .= " null AS placename, ";
+ $sSQL .= " null AS ref, ";
+ if ($this->bExtraTags) $sSQL .= "null AS extra,";
+ if ($this->bNameDetails) $sSQL .= "null AS names,";
+ $sSQL .= " st_x(centroid) AS lon, ";
+ $sSQL .= " st_y(centroid) AS lat,";
+ $sSQL .= " -1.15 AS importance, ";
+ $sSQL .= $this->addressImportanceSql('centroid', 'blub.parent_place_id');
+ $sSQL .= " null AS extra_place ";
+ $sSQL .= " FROM (";
+ $sSQL .= " SELECT place_id, "; // interpolate the Tiger housenumbers here
+ $sSQL .= " ST_LineInterpolatePoint(linegeo, (housenumber_for_place-startnumber::float)/(endnumber-startnumber)::float) AS centroid, ";
+ $sSQL .= " parent_place_id, ";
+ $sSQL .= " housenumber_for_place";
+ $sSQL .= " FROM (";
+ $sSQL .= " location_property_tiger ";
+ $sSQL .= " JOIN (values ".$sHousenumbers.") AS housenumbers(place_id, housenumber_for_place) USING(place_id)) ";
+ $sSQL .= " WHERE ";
+ $sSQL .= " housenumber_for_place >= startnumber";
+ $sSQL .= " AND housenumber_for_place <= endnumber";
+ $sSQL .= " ) AS blub"; //postgres wants an alias here
+
+ $aSubSelects[] = $sSQL;
+ }
+ }
+
+ // osmline - interpolated housenumbers
+ $sPlaceIDs = Result::joinIdsByTable($aResults, Result::TABLE_OSMLINE);
+ if ($sPlaceIDs) {
+ $sHousenumbers = Result::sqlHouseNumberTable($aResults, Result::TABLE_OSMLINE);
+ // interpolation line search only if a housenumber was searched
+ // (realized through a join)
+ $sSQL = "SELECT ";
+ $sSQL .= " 'W' AS osm_type, ";
+ $sSQL .= " osm_id, ";
+ $sSQL .= " 'place' AS class, ";
+ $sSQL .= " 'house' AS type, ";
+ $sSQL .= ' 15 AS admin_level, ';
+ $sSQL .= ' 30 AS rank_search, ';
+ $sSQL .= ' 30 AS rank_address, ';
+ $sSQL .= ' place_id, ';
+ $sSQL .= ' parent_place_id, ';
+ $sSQL .= ' housenumber_for_place as housenumber,';
+ $sSQL .= ' country_code, ';
+ $sSQL .= $this->langAddressSql('housenumber_for_place');
+ $sSQL .= ' null AS placename, ';
+ $sSQL .= ' null AS ref, ';
+ if ($this->bExtraTags) $sSQL .= 'null AS extra, ';
+ if ($this->bNameDetails) $sSQL .= 'null AS names, ';
+ $sSQL .= ' st_x(centroid) AS lon, ';
+ $sSQL .= ' st_y(centroid) AS lat, ';
+ // slightly smaller than the importance for normal houses
+ $sSQL .= " -0.1 AS importance, ";
+ $sSQL .= $this->addressImportanceSql('centroid', 'blub.parent_place_id');
+ $sSQL .= " null AS extra_place ";
+ $sSQL .= " FROM (";
+ $sSQL .= " SELECT ";
+ $sSQL .= " osm_id, ";
+ $sSQL .= " place_id, ";
+ $sSQL .= " country_code, ";
+ $sSQL .= " CASE "; // interpolate the housenumbers here
+ $sSQL .= " WHEN startnumber != endnumber ";
+ $sSQL .= " THEN ST_LineInterpolatePoint(linegeo, (housenumber_for_place-startnumber::float)/(endnumber-startnumber)::float) ";
+ $sSQL .= " ELSE ST_LineInterpolatePoint(linegeo, 0.5) ";
+ $sSQL .= " END as centroid, ";
+ $sSQL .= " parent_place_id, ";
+ $sSQL .= " housenumber_for_place ";
+ $sSQL .= " FROM (";
+ $sSQL .= " location_property_osmline ";
+ $sSQL .= " JOIN (values ".$sHousenumbers.") AS housenumbers(place_id, housenumber_for_place) USING(place_id)";
+ $sSQL .= " ) ";
+ $sSQL .= " WHERE housenumber_for_place >= 0 ";
+ $sSQL .= " ) as blub"; //postgres wants an alias here
+
+ $aSubSelects[] = $sSQL;
+ }
+
+ if (CONST_Use_Aux_Location_data) {
+ $sPlaceIDs = Result::joinIdsByTable($aResults, Result::TABLE_AUX);
+ if ($sPlaceIDs) {
+ $sHousenumbers = Result::sqlHouseNumberTable($aResults, Result::TABLE_AUX);
+ $sSQL = " SELECT ";
+ $sSQL .= " 'L' AS osm_type, ";
+ $sSQL .= " place_id AS osm_id, ";
+ $sSQL .= " 'place' AS class,";
+ $sSQL .= " 'house' AS type, ";
+ $sSQL .= ' null AS admin_level, ';
+ $sSQL .= ' 30 AS rank_search,';
+ $sSQL .= ' 30 AS rank_address, ';
+ $sSQL .= ' place_id,';
+ $sSQL .= ' parent_place_id, ';
+ $sSQL .= ' housenumber,';
+ $sSQL .= " 'us' AS country_code, ";
+ $sSQL .= $this->langAddressSql('-1');
+ $sSQL .= " null AS placename, ";
+ $sSQL .= " null AS ref, ";
+ if ($this->bExtraTags) $sSQL .= "null AS extra, ";
+ if ($this->bNameDetails) $sSQL .= "null AS names, ";
+ $sSQL .= " ST_X(centroid) AS lon, ";
+ $sSQL .= " ST_Y(centroid) AS lat, ";
+ $sSQL .= " -1.10 AS importance, ";
+ $sSQL .= $this->addressImportanceSql(
+ 'centroid',
+ 'location_property_aux.parent_place_id'
+ );
+ $sSQL .= " null AS extra_place ";
+ $sSQL .= " FROM location_property_aux ";
+ $sSQL .= " WHERE place_id in ($sPlaceIDs) ";
+
+ $aSubSelects[] = $sSQL;
+ }