Ana içeriğe geç

Görünmeyen Güncellemeler Sorunu

Güncellemelerin yalnızca bir betiğin yürütülmesinin sonunda uygulanmasının programlama açısından biri can sıkıcı, diğeri olumlu iki sonucu vardır:

Can sıkıcı sonuç, güncellemelerinizi sonuna kadar görememenizdir; bu nedenle başka değişiklikler yapmak için kendi değişikliklerinizin üzerine inşa edemezsiniz.

Bir örnek: PERSON adlı öğeleriniz olduğunu varsayalım. Bir PERSON öğesinin içinde BID öğelerinden oluşan bir liste (bu kişinin verdiği teklifleri temsil eden) bulunabilir ve BID öğelerini bir BIDS öğesinin içine almak isteyebilirsiniz. Ancak başlangıçta PERSON öğesinin BIDS alt öğesi yoktur.

Başlangıçta:

1
2
3
<PERSON id="p0103">
  <NAME>Jane</NAME>
</PERSON>

Şunu eklemek <BID id="b0022">data</BID> ve şu sonucu elde etmek istiyoruz:

1
2
3
4
5
6
<PERSON id="p0103">
  <NAME>Jane</NAME>
  <BIDS>
     <BID id="b0022">data</BID>
  </BIDS>
</PERSON>

Örneğin DOM kullanarak geleneksel yöntemde iki adım izlerdik:

  1. PERSON içinde BIDS öğesi yoksa bir tane oluştur

  2. ardından BID öğesini BIDS öğesinin içine ekle

XQuery Update'te bu (yanlış biçimde) şöyle yazılırdı:

1
2
3
4
5
6
7
declare updating function insert-bid($person, $bid)
{
  if(empty($person/BIDS))
    then insert node <BIDS/> into $person
    else (),
  insert node $bid as last into $person/BIDS
}

Warning

Bunu denemeyin: işe yaramaz! Neden?
Çünkü BIDS öğesi ancak en sonda oluşturulur; bu nedenle insert ... as last $personinto /BIDS yönergesi, eşleşen hiçbir düğüm bulamaz $person/BIDS ve dolayısıyla yürütme hatası verir.

Peki bunu doğru yapmanın yolu nedir? İki durumun her biri için kendi kendine yeterli bir çözüme ihtiyacımız var:

1
2
3
4
5
6
declare updating function insert-bid($person, $bid)
{
 if(empty($person/BIDS))
   then insert node <BIDS>{$bids}</BIDS> into $person
   else insert node $bid as last into $person/BIDS
}

Olumlu sonuç ise üzerinde çalıştığınız belgelerin betiğinizin yürütülmesi sırasında kararlı olmasıdır. Üzerinde durduğunuz dalı kesmediğinizden emin olabilirsiniz. Örneğin, rahatça şunu yazabilirsiniz:

1
2
for $x in collection(...)//X
return delete node $x

Bu işlem tamamen öngörülebilirdir ve erken sonlanmaz. Ya da sonsuz döngüye girme riski olmadan bir öğeyi kendisinden sonra çoğaltabilirsiniz:

1
2
for $x in collection(...)//X
return insert node $x after $x