info('Create Tables');
$sTemplate = file_get_contents(CONST_BasePath.'/sql/tables.sql');
- $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
- $sTemplate = $this->replaceTablespace(
- '{ts:address-data}',
- CONST_Tablespace_Address_Data,
- $sTemplate
- );
- $sTemplate = $this->replaceTablespace(
- '{ts:address-index}',
- CONST_Tablespace_Address_Index,
- $sTemplate
- );
- $sTemplate = $this->replaceTablespace(
- '{ts:search-data}',
- CONST_Tablespace_Search_Data,
- $sTemplate
- );
- $sTemplate = $this->replaceTablespace(
- '{ts:search-index}',
- CONST_Tablespace_Search_Index,
- $sTemplate
- );
- $sTemplate = $this->replaceTablespace(
- '{ts:aux-data}',
- CONST_Tablespace_Aux_Data,
- $sTemplate
- );
- $sTemplate = $this->replaceTablespace(
- '{ts:aux-index}',
- CONST_Tablespace_Aux_Index,
- $sTemplate
- );
+ $sTemplate = $this->replaceSqlPatterns($sTemplate);
$this->pgsqlRunScript($sTemplate, false);
if ($bReverseOnly) {
- $this->pgExec('DROP TABLE search_name');
+ $this->dropTable('search_name');
}
$oAlParser = new AddressLevelParser(CONST_Address_Level_Config);
info('Create Partition Tables');
$sTemplate = file_get_contents(CONST_BasePath.'/sql/partition-tables.src.sql');
- $sTemplate = $this->replaceTablespace(
- '{ts:address-data}',
- CONST_Tablespace_Address_Data,
- $sTemplate
- );
-
- $sTemplate = $this->replaceTablespace(
- '{ts:address-index}',
- CONST_Tablespace_Address_Index,
- $sTemplate
- );
-
- $sTemplate = $this->replaceTablespace(
- '{ts:search-data}',
- CONST_Tablespace_Search_Data,
- $sTemplate
- );
-
- $sTemplate = $this->replaceTablespace(
- '{ts:search-index}',
- CONST_Tablespace_Search_Index,
- $sTemplate
- );
-
- $sTemplate = $this->replaceTablespace(
- '{ts:aux-data}',
- CONST_Tablespace_Aux_Data,
- $sTemplate
- );
-
- $sTemplate = $this->replaceTablespace(
- '{ts:aux-index}',
- CONST_Tablespace_Aux_Index,
- $sTemplate
- );
+ $sTemplate = $this->replaceSqlPatterns($sTemplate);
$this->pgsqlRunPartitionScript($sTemplate);
}
$sWikiArticlesFile = CONST_Wikipedia_Data_Path.'/wikimedia-importance.sql.gz';
if (file_exists($sWikiArticlesFile)) {
info('Importing wikipedia articles and redirects');
- $this->pgExec('DROP TABLE IF EXISTS wikipedia_article');
- $this->pgExec('DROP TABLE IF EXISTS wikipedia_redirect');
+ $this->dropTable('wikipedia_article');
+ $this->dropTable('wikipedia_redirect');
$this->pgsqlRunScriptFile($sWikiArticlesFile);
} else {
warn('wikipedia importance dump file not found - places will have default importance');
{
info('Drop old Data');
- $this->pgExec('TRUNCATE word');
+ $this->oDB->exec('TRUNCATE word');
echo '.';
- $this->pgExec('TRUNCATE placex');
+ $this->oDB->exec('TRUNCATE placex');
echo '.';
- $this->pgExec('TRUNCATE location_property_osmline');
+ $this->oDB->exec('TRUNCATE location_property_osmline');
echo '.';
- $this->pgExec('TRUNCATE place_addressline');
+ $this->oDB->exec('TRUNCATE place_addressline');
echo '.';
- $this->pgExec('TRUNCATE location_area');
+ $this->oDB->exec('TRUNCATE location_area');
echo '.';
if (!$this->dbReverseOnly()) {
- $this->pgExec('TRUNCATE search_name');
+ $this->oDB->exec('TRUNCATE search_name');
echo '.';
}
- $this->pgExec('TRUNCATE search_name_blank');
+ $this->oDB->exec('TRUNCATE search_name_blank');
echo '.';
- $this->pgExec('DROP SEQUENCE seq_place');
+ $this->oDB->exec('DROP SEQUENCE seq_place');
echo '.';
- $this->pgExec('CREATE SEQUENCE seq_place start 100000');
+ $this->oDB->exec('CREATE SEQUENCE seq_place start 100000');
echo '.';
$sSQL = 'select distinct partition from country_name';
if (!$this->bNoPartitions) $aPartitions[] = 0;
foreach ($aPartitions as $sPartition) {
- $this->pgExec('TRUNCATE location_road_'.$sPartition);
+ $this->oDB->exec('TRUNCATE location_road_'.$sPartition);
echo '.';
}
// used by getorcreate_word_id to ignore frequent partial words
$sSQL = 'CREATE OR REPLACE FUNCTION get_maxwordfreq() RETURNS integer AS ';
$sSQL .= '$$ SELECT '.CONST_Max_Word_Frequency.' as maxwordfreq; $$ LANGUAGE SQL IMMUTABLE';
- $this->pgExec($sSQL);
+ $this->oDB->exec($sSQL);
echo ".\n";
// pre-create the word list
if (empty($aFilenames)) return;
$sTemplate = file_get_contents(CONST_BasePath.'/sql/tiger_import_start.sql');
- $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
- $sTemplate = $this->replaceTablespace(
- '{ts:aux-data}',
- CONST_Tablespace_Aux_Data,
- $sTemplate
- );
- $sTemplate = $this->replaceTablespace(
- '{ts:aux-index}',
- CONST_Tablespace_Aux_Index,
- $sTemplate
- );
+ $sTemplate = $this->replaceSqlPatterns($sTemplate);
+
$this->pgsqlRunScript($sTemplate, false);
$aDBInstances = array();
info('Creating indexes on Tiger data');
$sTemplate = file_get_contents(CONST_BasePath.'/sql/tiger_import_finish.sql');
- $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
- $sTemplate = $this->replaceTablespace(
- '{ts:aux-data}',
- CONST_Tablespace_Aux_Data,
- $sTemplate
- );
- $sTemplate = $this->replaceTablespace(
- '{ts:aux-index}',
- CONST_Tablespace_Aux_Index,
- $sTemplate
- );
+ $sTemplate = $this->replaceSqlPatterns($sTemplate);
+
$this->pgsqlRunScript($sTemplate, false);
}
public function calculatePostcodes($bCMDResultAll)
{
info('Calculate Postcodes');
- $this->pgExec('TRUNCATE location_postcode');
+ $this->oDB->exec('TRUNCATE location_postcode');
$sSQL = 'INSERT INTO location_postcode';
$sSQL .= ' (place_id, indexed_status, country_code, postcode, geometry) ';
$sSQL .= " WHERE address ? 'postcode' AND address->'postcode' NOT SIMILAR TO '%(,|;)%'";
$sSQL .= ' AND geometry IS NOT null';
$sSQL .= ' GROUP BY country_code, pc';
- $this->pgExec($sSQL);
+ $this->oDB->exec($sSQL);
// only add postcodes that are not yet available in OSM
$sSQL = 'INSERT INTO location_postcode';
$sSQL .= ' FROM us_postcode WHERE postcode NOT IN';
$sSQL .= ' (SELECT postcode FROM location_postcode';
$sSQL .= " WHERE country_code = 'us')";
- $this->pgExec($sSQL);
+ $this->oDB->exec($sSQL);
// add missing postcodes for GB (if available)
$sSQL = 'INSERT INTO location_postcode';
$sSQL .= ' FROM gb_postcode WHERE postcode NOT IN';
$sSQL .= ' (SELECT postcode FROM location_postcode';
$sSQL .= " WHERE country_code = 'gb')";
- $this->pgExec($sSQL);
+ $this->oDB->exec($sSQL);
if (!$bCMDResultAll) {
$sSQL = "DELETE FROM word WHERE class='place' and type='postcode'";
$sSQL .= 'and word NOT IN (SELECT postcode FROM location_postcode)';
- $this->pgExec($sSQL);
+ $this->oDB->exec($sSQL);
}
$sSQL = 'SELECT count(getorcreate_postcode_id(v)) FROM ';
$sSQL .= '(SELECT distinct(postcode) as v FROM location_postcode) p';
- $this->pgExec($sSQL);
+ $this->oDB->exec($sSQL);
}
public function index($bIndexNoanalyse)
info('Index postcodes');
$sSQL = 'UPDATE location_postcode SET indexed_status = 0';
- $this->pgExec($sSQL);
+ $this->oDB->exec($sSQL);
}
public function createSearchIndices()
if (!$this->dbReverseOnly()) {
$sTemplate .= file_get_contents(CONST_BasePath.'/sql/indices_search.src.sql');
}
- $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
- $sTemplate = $this->replaceTablespace(
- '{ts:address-index}',
- CONST_Tablespace_Address_Index,
- $sTemplate
- );
- $sTemplate = $this->replaceTablespace(
- '{ts:search-index}',
- CONST_Tablespace_Search_Index,
- $sTemplate
- );
- $sTemplate = $this->replaceTablespace(
- '{ts:aux-index}',
- CONST_Tablespace_Aux_Index,
- $sTemplate
- );
+ $sTemplate = $this->replaceSqlPatterns($sTemplate);
+
$this->pgsqlRunScript($sTemplate);
}
if (!$bFound) array_push($aDropTables, $sTable);
}
foreach ($aDropTables as $sDrop) {
- if ($this->bVerbose) echo "Dropping table $sDrop\n";
- $this->oDB->exec("DROP TABLE IF EXISTS $sDrop CASCADE");
+ $this->dropTable($sDrop);
}
if (!is_null(CONST_Osm2pgsql_Flatnode_File) && CONST_Osm2pgsql_Flatnode_File) {
private function createSqlFunctions()
{
- $sTemplate = file_get_contents(CONST_BasePath.'/sql/functions.sql');
+ $sBasePath = CONST_BasePath.'/sql/functions/';
+ $sTemplate = file_get_contents($sBasePath.'utils.sql');
+ $sTemplate .= file_get_contents($sBasePath.'normalization.sql');
+ $sTemplate .= file_get_contents($sBasePath.'importance.sql');
+ $sTemplate .= file_get_contents($sBasePath.'address_lookup.sql');
+ $sTemplate .= file_get_contents($sBasePath.'interpolation.sql');
+ $sTemplate .= file_get_contents($sBasePath.'place_triggers.sql');
+ $sTemplate .= file_get_contents($sBasePath.'placex_triggers.sql');
+ $sTemplate .= file_get_contents($sBasePath.'postcode_triggers.sql');
$sTemplate = str_replace('{modulepath}', $this->sModulePath, $sTemplate);
if ($this->bEnableDiffUpdates) {
$sTemplate = str_replace('RETURN NEW; -- %DIFFUPDATES%', '--', $sTemplate);
}
}
- private function replaceTablespace($sTemplate, $sTablespace, $sSql)
+ private function replaceSqlPatterns($sSql)
{
- if ($sTablespace) {
- $sSql = str_replace($sTemplate, 'TABLESPACE "'.$sTablespace.'"', $sSql);
- } else {
- $sSql = str_replace($sTemplate, '', $sSql);
+ $sSql = str_replace('{www-user}', CONST_Database_Web_User, $sSql);
+
+ $aPatterns = array(
+ '{ts:address-data}' => CONST_Tablespace_Address_Data,
+ '{ts:address-index}' => CONST_Tablespace_Address_Index,
+ '{ts:search-data}' => CONST_Tablespace_Search_Data,
+ '{ts:search-index}' => CONST_Tablespace_Search_Index,
+ '{ts:aux-data}' => CONST_Tablespace_Aux_Data,
+ '{ts:aux-index}' => CONST_Tablespace_Aux_Index,
+ );
+
+ foreach ($aPatterns as $sPattern => $sTablespace) {
+ if ($sTablespace) {
+ $sSql = str_replace($sPattern, 'TABLESPACE "'.$sTablespace.'"', $sSql);
+ } else {
+ $sSql = str_replace($sPattern, '', $sSql);
+ }
}
+
return $sSql;
}
}
/**
- * Execute the SQL command on the open database.
+ * Drop table with the given name if it exists.
*
- * @param string $sSQL SQL command to execute.
+ * @param string $sName Name of table to remove.
*
* @return null
*
* @pre connect() must have been called.
*/
- private function pgExec($sSQL)
+ private function dropTable($sName)
{
- $this->oDB->exec($sSQL);
+ if ($this->bVerbose) echo "Dropping table $sName\n";
+ $this->oDB->exec('DROP TABLE IF EXISTS '.$sName.' CASCADE');
}
/**