"""
SQLAlchemy definitions for all tables used by the frontend.
"""
-from typing import Any
-
import sqlalchemy as sa
-from sqlalchemy.dialects.postgresql import HSTORE, ARRAY, JSONB, array
-from sqlalchemy.dialects.sqlite import JSON as sqlite_json
-
-from nominatim.db.sqlalchemy_types import Geometry
-
-class PostgresTypes:
- """ Type definitions for complex types as used in Postgres variants.
- """
- Composite = HSTORE
- Json = JSONB
- IntArray = ARRAY(sa.Integer()) #pylint: disable=invalid-name
- to_array = array
-
-
-class SqliteTypes:
- """ Type definitions for complex types as used in Postgres variants.
- """
- Composite = sqlite_json
- Json = sqlite_json
- IntArray = sqlite_json
-
- @staticmethod
- def to_array(arr: Any) -> Any:
- """ Sqlite has no special conversion for arrays.
- """
- return arr
+import nominatim.db.sqlalchemy_functions #pylint: disable=unused-import
+from nominatim.db.sqlalchemy_types import Geometry, KeyValueStore, IntArray
#pylint: disable=too-many-instance-attributes
class SearchTables:
Any data used for updates only will not be visible.
"""
- def __init__(self, meta: sa.MetaData, engine_name: str) -> None:
- if engine_name == 'postgresql':
- self.types: Any = PostgresTypes
- elif engine_name == 'sqlite':
- self.types = SqliteTypes
- else:
- raise ValueError("Only 'postgresql' and 'sqlite' engines are supported.")
-
+ def __init__(self, meta: sa.MetaData) -> None:
self.meta = meta
self.import_status = sa.Table('import_status', meta,
sa.Column('class', sa.Text, nullable=False, key='class_'),
sa.Column('type', sa.Text, nullable=False),
sa.Column('admin_level', sa.SmallInteger),
- sa.Column('name', self.types.Composite),
- sa.Column('address', self.types.Composite),
- sa.Column('extratags', self.types.Composite),
+ sa.Column('name', KeyValueStore),
+ sa.Column('address', KeyValueStore),
+ sa.Column('extratags', KeyValueStore),
sa.Column('geometry', Geometry, nullable=False),
sa.Column('wikipedia', sa.Text),
sa.Column('country_code', sa.String(2)),
sa.Column('step', sa.SmallInteger),
sa.Column('indexed_status', sa.SmallInteger),
sa.Column('linegeo', Geometry),
- sa.Column('address', self.types.Composite),
+ sa.Column('address', KeyValueStore),
sa.Column('postcode', sa.Text),
sa.Column('country_code', sa.String(2)))
self.country_name = sa.Table('country_name', meta,
sa.Column('country_code', sa.String(2)),
- sa.Column('name', self.types.Composite),
- sa.Column('derived_name', self.types.Composite),
+ sa.Column('name', KeyValueStore),
+ sa.Column('derived_name', KeyValueStore),
sa.Column('partition', sa.Integer))
self.country_grid = sa.Table('country_osm_grid', meta,
sa.Column('importance', sa.Float),
sa.Column('search_rank', sa.SmallInteger),
sa.Column('address_rank', sa.SmallInteger),
- sa.Column('name_vector', self.types.IntArray),
- sa.Column('nameaddress_vector', self.types.IntArray),
+ sa.Column('name_vector', IntArray),
+ sa.Column('nameaddress_vector', IntArray),
sa.Column('country_code', sa.String(2)),
sa.Column('centroid', Geometry))