-- -----------------------------------------------------
-- Table attributeT
-- -----------------------------------------------------
alter table attributeT drop sortable;


-- -----------------------------------------------------
-- Table sortDirectionsT
-- -----------------------------------------------------
drop table if exists sortDirectionsT ;

create table if not exists sortDirectionsT (
  id int not null,
  primary key (id))
engine = InnoDB
comment = 'this must be check constraints in sortOptionT.sortDirection, but unfortunately...';


-- -----------------------------------------------------
-- Table sortOptionT
-- -----------------------------------------------------
drop table if exists sortOptionT ;

create table if not exists sortOptionT (
  id int unsigned not null auto_increment,
  sortDirection int not null comment 'should be -1 or 1',
  attributeId int unsigned not null,
  sorter int not null default 0,
  primary key (id),
  unique index attributeid_sortdirection_uq (sortDirection asc, attributeId asc),
  index sorter_idx (sorter asc),
  index fk_sortOptionT_attributeT1_idx (attributeId asc),
  constraint fk_sortOptionT_sortDirectionsT1
    foreign key (sortDirection)
    references sortDirectionsT (id)
    on delete no action
    on update no action,
  constraint fk_sortOptionT_attributeT1
    foreign key (attributeId)
    references attributeT (id)
    on delete no action
    on update no action)
engine = InnoDB
comment = 'sortOptionT always has a parent attributeT, even if we sort by something special';


-- -----------------------------------------------------
-- Table cacheObjectSortT
-- -----------------------------------------------------
drop table if exists cacheObjectSortT ;

create table if not exists cacheObjectSortT (
  objectId int unsigned not null,
  sortOptionId int unsigned not null,
  sorter double not null default 0.0,
  primary key (objectId, sortOptionId),
  index sorter_idx (sortOptionId asc, sorter desc),
  constraint fk_cacheObjectSortT_objectT1
    foreign key (objectId)
    references objectT (id)
    on delete cascade
    on update no action,
  constraint fk_cacheObjectSortT_sortOptionT1
    foreign key (sortOptionId)
    references sortOptionT (id)
    on delete cascade
    on update no action)
engine = InnoDB;


-- -----------------------------------------------------
-- Table sortOptionTL
-- -----------------------------------------------------
drop table if exists sortOptionTL ;

create table if not exists sortOptionTL (
  id int unsigned not null,
  languageId char(3) not null,
  name varchar(255) not null,
  primary key (id, languageId),
  index fk_sortOptionTL_languageT1_idx (languageId asc),
  constraint fk_sortOptionTL_sortOptionT1
    foreign key (id)
    references sortOptionT (id)
    on delete cascade
    on update no action,
  constraint fk_sortOptionTL_languageT1
    foreign key (languageId)
    references languageT (id)
    on delete no action
    on update no action)
engine = InnoDB;



-- -----------------------------------------------------
-- Data for table sortDirectionsT
-- -----------------------------------------------------
start transaction;
insert into sortDirectionsT (id) values (-1), (1);

commit;

-- -----------------------------------------------------
-- Data for tables sortOptionT and sortOptionTL
-- -----------------------------------------------------
delimiter $$
drop function if exists tt_sort_insert$$

create function tt_sort_insert(code varchar(30) binary, sort_direction int, name_ukr varchar(255), name_rus varchar(255), name_eng varchar(255)) returns int unsigned
not deterministic modifies sql data
begin
    declare attribute_id, so_id int unsigned;

    set attribute_id = attribute_GetByCode(code);

    insert sortOptionT(sortDirection, attributeId, sorter)
    values (sort_direction, attribute_id, sorter_Get());

    set so_id = last_insert_id();

    insert sortOptionTL(id, languageId, name)
    values
      (so_id, 'ukr', name_ukr),
      (so_id, 'rus', name_rus),
      (so_id, 'eng', name_eng);

    return so_id;
end$$
delimiter ;


start transaction;

select sorter_Set(10, 10);

-- -----------------------
select tt_sort_insert('__byrating', 1, 'Звичайний', 'Обычный', 'Ordinary');


-- -----------------------
select tt_sort_insert('price', 1, 'Ціна: від меншої до більшої', 'Цена: от меньшей к большей', 'Price: smaller to larger');
select tt_sort_insert('price', -1, 'Ціна: від більшої до меншої', 'Цена: от большей к меньшей', 'Price: larger to smaller');


-- -----------------------
select tt_sort_insert('pricerent', 1, 'Ціна: від меншої до більшої', 'Цена: от меньшей к большей', 'Price: smaller to larger');
select tt_sort_insert('pricerent', -1, 'Ціна: від більшої до меншої', 'Цена: от большей к меньшей', 'Price: larger to smaller');


-- -----------------------
select tt_sort_insert('pricerentdaily', 1, 'Ціна: від меншої до більшої', 'Цена: от меньшей к большей', 'Price: smaller to larger');
select tt_sort_insert('pricerentdaily', -1, 'Ціна: від більшої до меншої', 'Цена: от большей к меньшей', 'Price: larger to smaller');


-- -----------------------
select tt_sort_insert('area', 1, 'Площа: від меншої до більшої', 'Площадь: от меньшей к большей', 'Area: smaller to larger');
select tt_sort_insert('area', -1, 'Площа: від більшої до меншої', 'Площадь: от большей к меньшей', 'Area: larger to smaller');


commit;

drop function if exists tt_sort_insert;


/* to be called manually
start transaction;

select __object_UpdateSortCacheAll();

commit;
*/

