36 lines
1.5 KiB
Elixir
36 lines
1.5 KiB
Elixir
defmodule Aprsme.Repo.Migrations.OptimizeMapQueries do
|
|
use Ecto.Migration
|
|
@disable_ddl_transaction true
|
|
|
|
def up do
|
|
# Add compound index for the most common map query pattern
|
|
create_if_not_exists index(:packets, [:has_position, :received_at])
|
|
create_if_not_exists index(:packets, [:sender, :received_at])
|
|
create_if_not_exists index(:packets, [:sender, :has_position])
|
|
create_if_not_exists index(:packets, [:data_type])
|
|
create_if_not_exists index(:packets, [:data_type, :received_at])
|
|
create_if_not_exists index(:packets, [:symbol_table_id, :symbol_code, :received_at])
|
|
create_if_not_exists index(:packets, [:device_identifier])
|
|
create_if_not_exists index(:packets, [:region, :has_position, :received_at])
|
|
|
|
# Add partial index for weather packets (this is valid)
|
|
execute """
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS packets_weather_idx
|
|
ON packets (received_at DESC)
|
|
WHERE data_type = 'weather'
|
|
OR (symbol_table_id = '/' AND symbol_code = '_')
|
|
"""
|
|
end
|
|
|
|
def down do
|
|
execute "DROP INDEX IF EXISTS packets_weather_idx"
|
|
drop index(:packets, [:region, :has_position, :received_at])
|
|
drop index(:packets, [:device_identifier])
|
|
drop index(:packets, [:symbol_table_id, :symbol_code, :received_at])
|
|
drop index(:packets, [:data_type, :received_at])
|
|
drop index(:packets, [:data_type])
|
|
drop index(:packets, [:sender, :has_position])
|
|
drop index(:packets, [:sender, :received_at])
|
|
drop index(:packets, [:has_position, :received_at])
|
|
end
|
|
end
|