Рейтинг:0

Миграция Drupal - опция "--limit" работает только при первом запуске?

флаг in

У меня есть собственный исходный плагин (импорт из MongoDB), и когда я запускаю миграцию в первый раз, например:

drush mim article --limit=10

работает хорошо: импортируется 10 статей и процесс останавливается.

Но если я повторю эту команду, то будет импортирована только 1 статья.

И если у меня будет около 10 импортированных статей и я снова запущу с limit=20, то будет импортировано 10 новых.

И если я установлю ограничение меньше, чем текущее количество импортируемых, тогда будет импортирована только 1 новая строка.

Должна ли указанная мной команда импортировать всегда 10 новых строк (если они есть, необработанные)?

Любая подсказка приветствуется!

(с использованием drush 11.0.7 и Drupal 9.3.12) (отредактировано)

Обновлять:

Таким образом, похоже, что код, который подсчитывает количество обработанных строк и проверяет, достигнут ли предельный параметр, работает неправильно, то есть он также считает ранее обработанные строки, чего не должно быть.

флаг in
Похоже, мой исходный плагин отвечает за пропуск обработанной строки (отвечает @mikelutz в slack). Получается, что в моем случае обработанные строки не пропускаются, а пересчитываются. Но я не переопределял метод next(). Любой пример того, как это сделать?
флаг in
Метод next() (который я не переопределил) SourcePluginBase (который я использую в качестве базового класса) должен проверять, обработана ли строка уже или нет. Но похоже не получается. Раньше у меня была проблема с таким условием, когда ранее обработанные всегда обрабатывались снова, и это было решено путем обновления drush.
Рейтинг:0
флаг in

Я решил это так:

Исходный next() SourcePluginBase проверяет, нужна ли обработка строк или нет, следующим образом:

  if (!$row->getIdMap() || $row->needsUpdate() || $this->aboveHighWater($row) || $this->rowChanged($row)) {
    $this->currentRow = $row->freezeSource();
  }

Теперь в моем классе, который наследует SourcePluginBase, я добавил к нему переопределение prepareRow:

  /**
   * {@inheritdoc}
   */
  публичная функция prepareRow(Row $row) {
    if (!$row->getIdMap() || $row->needsUpdate() || $this->надHighWater($row)) {
      вернуть parent::prepareRow($row);
    }
    вернуть ЛОЖЬ;
  }

Я заметил, что для ранее импортированных строк условие $this->rowChanged($row) истинно, а для новых строк, которые действительно нужно обработать, истинно $this->rowChanged($row). Поэтому я удалил первый и оставил второй.

Я знаю, что это своего рода обходной путь и что, вероятно, существует некоторая несовместимость между drush и drupal, но это лучшее решение, которое я мог сделать. Если у кого-то есть лучшее решение/объяснение, я буду рад его услышать.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.