Ana içeriğe geç

Görünmeyen Güncellemeler Sorunu

Güncellemelerin yalnızca komut dizisi yürütmesinin sonunda uygulanması programlamayı iki şekilde etkiler: biri can sıkıcı, diğeri olumlu:

Can sıkıcı sonuç şudur: güncellemelerinizi sonuna kadar göremezsiniz; bu nedenle yaptığınız değişiklikleri temel alarak başka değişiklikler yapamazsınız.

Örneğin, PERSON adlı öğeleriniz olduğunu varsayalım. Bir PERSON içinde, bu kişinin verdiği teklifleri temsil eden BID öğelerinden oluşan bir liste bulunabilir ve BID öğelerini bir BIDS öğesi 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>

Ekleme yaparak <BID id="b0022">data</BID> şunu 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 kullanırken geleneksel olarak iki adımda ilerlerdik:

  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 into $personyönergesi, eşleşen hiçbir düğüm bulamaz $person/BIDS ve dolayısıyla yürütme hatası verir.

Peki doğru yöntem nedir? İki durumun her biri için kendi başına 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ç, üzerinde çalıştığınız belgelerin komut diziniz yürütülürken sabit kalmasıdır. Üzerinde durduğunuz dalı kesmediğinizden emin olabilirsiniz. Örneğin rahatça şöyle yazabilirsiniz:

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

Bu tamamen öngörülebilirdir ve vaktinden önce durmaz. 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