|
|
|
|
|
|
|
|
|
|
|
create table if not exists dim_brand_pairs ( |
|
|
version text not null, |
|
|
effective_at timestamptz not null default now(), |
|
|
main_brand text not null, |
|
|
competitor_brand text not null, |
|
|
industry text not null, |
|
|
priority integer not null default 0, |
|
|
primary key (version, main_brand) |
|
|
); |
|
|
|
|
|
create table if not exists runs ( |
|
|
run_id text primary key, |
|
|
trigger text not null, |
|
|
schedule_id text, |
|
|
config_version text not null, |
|
|
config_snapshot_url text, |
|
|
params_json jsonb not null default '{}'::jsonb, |
|
|
started_at timestamptz not null default now(), |
|
|
finished_at timestamptz |
|
|
); |
|
|
|
|
|
create table if not exists questions ( |
|
|
question_id text not null, |
|
|
run_id text not null references runs(run_id) on delete cascade, |
|
|
question_text text not null, |
|
|
entity_set_json jsonb not null default '[]'::jsonb, |
|
|
primary key (run_id, question_id) |
|
|
); |
|
|
|
|
|
create table if not exists tasks ( |
|
|
task_id text primary key, |
|
|
run_id text not null references runs(run_id) on delete cascade, |
|
|
question_id text not null, |
|
|
site text not null, |
|
|
profile_id text not null, |
|
|
status text not null, |
|
|
reason text, |
|
|
handoff_url text, |
|
|
started_at timestamptz not null default now(), |
|
|
finished_at timestamptz |
|
|
); |
|
|
|
|
|
create index if not exists tasks_run_site_status_idx on tasks (run_id, site, status); |
|
|
|
|
|
create table if not exists task_artifacts ( |
|
|
task_id text primary key references tasks(task_id) on delete cascade, |
|
|
answer_text text not null, |
|
|
citations_json jsonb not null default '[]'::jsonb, |
|
|
screenshots_json jsonb not null default '[]'::jsonb, |
|
|
raw_html_url text, |
|
|
log_url text |
|
|
); |
|
|
|
|
|
create table if not exists mentions ( |
|
|
task_id text not null references tasks(task_id) on delete cascade, |
|
|
entity_name text not null, |
|
|
entity_type text not null, |
|
|
recommended boolean not null, |
|
|
rank integer, |
|
|
first_index integer, |
|
|
citations_json jsonb not null default '[]'::jsonb, |
|
|
primary key (task_id, entity_name) |
|
|
); |
|
|
|
|
|
create index if not exists mentions_entity_type_idx on mentions (entity_name, entity_type); |
|
|
|
|
|
|
|
|
create table if not exists fact_geo_daily ( |
|
|
date date not null, |
|
|
site text not null, |
|
|
main_brand text not null, |
|
|
competitor_brand text not null, |
|
|
recommended_rate double precision not null, |
|
|
top1_share double precision not null, |
|
|
avg_rank double precision, |
|
|
win_rate double precision, |
|
|
absent_vs_competitor_rate double precision, |
|
|
sample_n integer not null, |
|
|
primary key (date, site, main_brand) |
|
|
); |
|
|
|
|
|
create index if not exists fact_geo_daily_site_date_idx on fact_geo_daily (site, date); |
|
|
|
|
|
|