"""
Exporting a Nominatim database to SQlite.
"""
-from typing import Set, Any
+from typing import Set, Any, Optional, Union
import datetime as dt
import logging
from pathlib import Path
import nominatim_api as napi
from nominatim_api.search.query_analyzer_factory import make_query_analyzer
-from nominatim_core.typing import SaSelect, SaRow
-from nominatim_core.db.sqlalchemy_types import Geometry, IntArray
+from nominatim_api.typing import SaSelect, SaRow
+from nominatim_api.sql.sqlalchemy_types import Geometry, IntArray
LOG = logging.getLogger()
-async def convert(project_dir: Path, outfile: Path, options: Set[str]) -> None:
+
+async def convert(project_dir: Optional[Union[str, Path]],
+ outfile: Path, options: Set[str]) -> None:
""" Export an existing database to sqlite. The resulting database
will be usable against the Python frontend of Nominatim.
"""
self.dest = dest
self.options = options
-
async def write(self) -> None:
""" Create the database structure and copy the data from
the source database to the destination.
await self.create_word_table()
await self.create_indexes()
-
async def create_tables(self) -> None:
""" Set up the database tables.
"""
sa.func.RecoverGeometryColumn(table.name, col.name, 4326,
col.type.subtype.upper(), 'XY')))
-
async def create_class_tables(self) -> None:
""" Set up the table that serve class/type-specific geometries.
"""
sa.Column('place_id', sa.BigInteger),
sa.Column('centroid', Geometry))
-
async def create_word_table(self) -> None:
""" Create the word table.
This table needs the property information to determine the
await self.dest.connection.run_sync(sa.Index('idx_word_woken', dest.c.word_token).create)
-
async def copy_data(self) -> None:
""" Copy data for all registered tables.
"""
data = [{'tablename': t} for t in self.dest.t.meta.tables]
await self.dest.execute(pg_tables.insert().values(data))
-
async def create_indexes(self) -> None:
""" Add indexes necessary for the frontend.
"""
await self.dest.execute(sa.select(
sa.func.CreateSpatialIndex(t, 'centroid')))
-
async def create_spatial_index(self, table: str, column: str) -> None:
""" Create a spatial index on the given table and column.
"""
await self.dest.execute(sa.select(
sa.func.CreateSpatialIndex(getattr(self.dest.t, table).name, column)))
-
async def create_index(self, table_name: str, column: str) -> None:
""" Create a simple index on the given table and column.
"""
await self.dest.connection.run_sync(
sa.Index(f"idx_{table}_{column}", getattr(table.c, column)).create)
-
async def create_search_index(self) -> None:
""" Create the tables and indexes needed for word lookup.
"""
await self.dest.connection.run_sync(
sa.Index('idx_reverse_search_name_word', rsn.c.word).create)
-
def select_from(self, table: str) -> SaSelect:
""" Create the SQL statement to select the source columns and rows.
"""
columns.geometry),
else_=sa.func.ST_SimplifyPreserveTopology(
columns.geometry, 0.0001)
- )).label('geometry'))
+ )).label('geometry'))
sql = sa.select(*(sa.func.ST_AsText(c).label(c.name)
- if isinstance(c.type, Geometry) else c for c in columns))
+ if isinstance(c.type, Geometry) else c for c in columns))
return sql