Puncte:0

Migrare Drupal - opțiunea „--limit” funcționează numai pentru prima rulare?

drapel in

Am un plugin sursă personalizat (importuri din MongoDB) și când rulez migrarea pentru prima dată, cum ar fi:

drush mim articol --limit=10

funcționează bine: 10 articole sunt importate și procesele sunt oprite.

Dar dacă repet acea comandă atunci este importat doar 1 articol.

Și dacă am cam 10 articole importate și rulez din nou cu limit=20, atunci vor fi importate 10 articole noi.

Și dacă am stabilit o limită mai mică decât numărul actual de importate, atunci va fi importat doar 1 rând nou.

Ar trebui comanda pe care am specificat-o să importe întotdeauna 10 rânduri noi (dacă sunt disponibile, neprocesate)?

Orice indiciu este binevenit!

(folosind drush 11.0.7 și Drupal 9.3.12) (editat)

Actualizați:

Deci, se pare că acel cod care numără numărul de rânduri procesate și verifică dacă parametrul limită este atins nu funcționează bine, adică numără și rândurile procesate anterior, ceea ce nu ar trebui să fie cazul.

drapel in
Se pare că pluginul meu sursă este responsabil pentru omiterea rândului procesat (răspuns de @mikelutz pe slack). Deci, se pare că, în cazul meu, rândurile procesate nu sunt sărite, ci sunt numărate din nou. Dar nu am suprascris metoda next(). Vreun exemplu despre cum se face asta?
drapel in
metoda next() (pe care nu am înlocuit-o) a SourcePluginBase (pe care o folosesc ca clasă de bază) ar trebui să verifice dacă rândul este deja procesat sau nu. Dar se pare că eșuează. Am mai avut o problemă cu o astfel de condiție, atunci când procesate anterior, au fost întotdeauna procesate din nou și a fost rezolvată prin actualizarea drush.
Puncte:0
drapel in

Am rezolvat asa:

Next() original al SourcePluginBase verifică dacă procesarea rândurilor este necesară sau nu în acest fel:

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

Acum, în clasa mea care moștenește acea SourcePluginBase, am adăugat la ea înlocuirea prepareRow:

  /**
   * {@inheritdoc}
   */
  funcția publică pregătiRând(Rând $rând) {
    if (!$row->getIdMap() || $row->needsUpdate() || $this->aboveHighWater($row)) {
      return parent::prepareRow($row);
    }
    returnează FALSE;
  }

Am observat că, pentru rândurile importate anterior, condiția $this->rowChanged($row) este adevărată, iar pentru rândurile noi care chiar trebuie procesate $this->rowChanged($row) este adevărată. Așa că l-am scos pe primul și l-am păstrat pe al doilea.

Sunt conștient că aceasta este un fel de soluție și că probabil există o anumită incompatibilitate între drush și drupal, dar aceasta este cea mai bună soluție pe care o pot face. Dacă cineva are o soluție/explicație mai bună, voi fi bucuros să o aud.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.