2026-04-12-1
This commit is contained in:
Executable
+110
@@ -0,0 +1,110 @@
|
||||
#!/bin/bash
|
||||
# Local Database Preparation & Merge Script
|
||||
# To be run on the Mac terminal after download_server_data.sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Starting local database merge and preparation..."
|
||||
|
||||
# 1. Start the DB container
|
||||
echo "📦 Starting PostGIS container..."
|
||||
docker compose up -d db
|
||||
|
||||
# 2. Wait for DB to be ready
|
||||
echo "⏳ Waiting for database to be ready..."
|
||||
until docker compose exec -T db pg_isready -U mapuser -d mapdb; do
|
||||
sleep 2
|
||||
done
|
||||
|
||||
# 3. Initialize Schema & Import Existing Server Data
|
||||
echo "🛠️ Initializing schema and loading server data..."
|
||||
docker compose exec -T db psql -U mapuser -d mapdb -c "
|
||||
DROP TABLE IF EXISTS places_syria;
|
||||
CREATE TABLE places_syria (
|
||||
id SERIAL PRIMARY KEY,
|
||||
latitude DECIMAL(10, 8),
|
||||
longitude DECIMAL(11, 8),
|
||||
name TEXT,
|
||||
name_ar TEXT,
|
||||
name_en TEXT,
|
||||
address TEXT,
|
||||
category TEXT,
|
||||
neighbourhood TEXT,
|
||||
city TEXT,
|
||||
description TEXT,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
source TEXT,
|
||||
location GEOMETRY(Point, 4326)
|
||||
);
|
||||
|
||||
CREATE OR REPLACE FUNCTION sync_place_location() RETURNS trigger AS \$\$
|
||||
BEGIN
|
||||
IF NEW.latitude IS NOT NULL AND NEW.longitude IS NOT NULL THEN
|
||||
NEW.location := ST_SetSRID(ST_MakePoint(CAST(NEW.longitude AS FLOAT), CAST(NEW.latitude AS FLOAT)), 4326);
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
\$\$ LANGUAGE plpgsql;
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_sync_place_location ON places_syria;
|
||||
CREATE TRIGGER trg_sync_place_location
|
||||
BEFORE INSERT OR UPDATE ON places_syria
|
||||
FOR EACH ROW EXECUTE FUNCTION sync_place_location();
|
||||
"
|
||||
|
||||
# Load existing data if available
|
||||
if [ -f "infrastructure/docker/postgis/existing_syria_data.sql" ]; then
|
||||
echo "📥 Loading existing server data..."
|
||||
docker compose exec -T db psql -U mapuser -d mapdb < infrastructure/docker/postgis/existing_syria_data.sql
|
||||
fi
|
||||
|
||||
# 4. Import New CSV Data
|
||||
echo "📥 Importing new CSV landmark data..."
|
||||
docker cp infrastructure/docker/postgis/syria_final_complete.csv map-db:/tmp/syria_data.csv
|
||||
|
||||
docker compose exec -T db psql -U mapuser -d mapdb -c "
|
||||
DROP TABLE IF EXISTS staging_syria;
|
||||
CREATE TABLE staging_syria (
|
||||
name TEXT,
|
||||
latitude DECIMAL(10, 8),
|
||||
longitude DECIMAL(11, 8),
|
||||
category TEXT,
|
||||
address TEXT,
|
||||
description TEXT,
|
||||
created_at TIMESTAMP
|
||||
);
|
||||
|
||||
-- HEADER true fixes the 'invalid input syntax' error
|
||||
COPY staging_syria(name, latitude, longitude, category, address, description, created_at)
|
||||
FROM '/tmp/syria_data.csv'
|
||||
WITH (FORMAT csv, HEADER true, QUOTE '\"', ENCODING 'UTF8');
|
||||
|
||||
-- Merge into places_syria while avoiding duplicates
|
||||
-- We check for name + spatial proximity (approx 50m)
|
||||
INSERT INTO places_syria (name, name_ar, latitude, longitude, category, address, description, source, created_at)
|
||||
SELECT
|
||||
name,
|
||||
name,
|
||||
latitude,
|
||||
longitude,
|
||||
category,
|
||||
address,
|
||||
description,
|
||||
'csv_import_2026_04',
|
||||
COALESCE(created_at, NOW())
|
||||
FROM staging_syria s
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM places_syria p
|
||||
WHERE (p.name = s.name OR p.name_ar = s.name)
|
||||
AND ST_DWithin(
|
||||
ST_SetSRID(ST_MakePoint(CAST(p.longitude AS FLOAT), CAST(p.latitude AS FLOAT)), 4326)::geography,
|
||||
ST_SetSRID(ST_MakePoint(CAST(s.longitude AS FLOAT), CAST(s.latitude AS FLOAT)), 4326)::geography,
|
||||
50
|
||||
)
|
||||
);
|
||||
|
||||
DROP TABLE staging_syria;
|
||||
"
|
||||
|
||||
echo "✅ Local database merge complete."
|
||||
echo "Run ./infrastructure/scripts/local_verify.sh to review the results."
|
||||
Reference in New Issue
Block a user