parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

Mizter Egoist 25.04.2016 17:35

Триггеры мне нужны, чтобы правильно манипулировать деревьями.
Читая статью наткнулся на триггер, который сам считает дистанцию, как это сделать без него с помощью MySQL не знаю, сейчас это у меня длинный код парсера и запросов к БД.
Ниже код триггера для примера, может поможете
CREATE TRIGGER test2_link_ai FOR test2_link
  AFTER INSERT
  POSITION 32000
AS
  DECLARE VARIABLE AnID INTEGER;
  DECLARE VARIABLE ADistance INTEGER;
BEGIN
  IF (NEW.distance = 1) THEN
  BEGIN
    INSERT INTO test2_link (id_from, id_to, distance)
      SELECT down.id_from, up.id_to,
        down.distance + up.distance + 1
      FROM test2_link up, test2_link down
      WHERE up.id_from = NEW.id_to
        AND down.id_to = NEW.id_from
        AND down.distance + up.distance > 0;
  END
END;
Сейчас думаю над изменением иерархии дерева.
Написал следующее:
$_update[^table::sql{
	SELECT anc
	FROM path
	WHERE dsc = $form:id AND lvl = 1
}]
^void:sql{
	DELETE FROM path 
	WHERE dsc = $form:id
		AND anc = $_update.anc
		AND lvl = 1
}
^void:sql{
	INSERT INTO path (anc, dsc, lvl)
	VALUES ($form:catalog, $form:id, 1)
}
Это изменяет вложенность, как узла, так и поддерева, только проблема в том, что это тупой метод, он не сравнивает дистанцию и не меняет ее, если она изменилась.
Не знаю как это делать, не представляю даже.