Κατάθεση Στιγμιαίων Επερωτήσεων (μόνο για Πελάτες)

Η χειραψία που ακολουθείται από τους πελάτες προς τους υπερ-κόμβους κατά την κατάθεση στιγμιαίων επερωτήσεων είναι η ακόλουθη:

   
        1. $ Client Query\backslash n$
        2. $ key(C)$
        3. $ ip(C)$
        4. $ q$
   
Στη συνέχεια αναμένει την επιβεβαίωση από τον υπερ-κόμβο, η οποία
πρέπει να είναι η
$ SuperPeer QueryDelivered\backslash n$
   

Σε αυτό το σημείο θα πρέπει να παρουσιαστεί και η χειραψία που πραγματοποιείται μεταξύ του υπερ-κόμβου και του πελάτη για την αποστολή των απαντήσεων. Την επόμενη επικοινωνία την ξεκινάει ο υπερ-κόμβος.

   
        1. $ SuperPeer AnswerQuery\backslash n$
        2. $ key(q)$
        3. $ number$
   

Ως αυτού του σημείου, ο υπερ-κόμβος έχει ενημερώσει τον πελάτη ότι θα του στείλει $ number$ στον αριθμό απαντήσεις, δηλαδή δημοσιεύσεις, που ικανοποιούν την στιγμιαία επερώτηση που του τέθηκε με κλειδί το $ key(q)$ . Στη συνέχεια, γίνεται μία επαναληπτική διαδικασία αποστολής των κλειδιών ($ key(p)$ ) αυτών των δημοσιεύσεων για $ number$ φορές. Τέλος, ο υπερ-κόμβος αναμένει την επιβεβαίωση από τον πελάτη για τη λήψη όλων των απαντήσεων, η οποία πρέπει να είναι η

$ Client NotificationDelivered\backslash n$

Η χρήση της λέξης Notification στο μήνυμα της επιβεβαίωσης του πελάτη δεν θα πρέπει να συγχέεται με την έννοια της ειδοποίησης στις επερωτήσεις διαρκείας. Επιλέχθηκε, διότι αφενός αποτελεί μία ειδοποίηση (υπό την καθημερινή έννοια των πραγμάτων) και αφετέρου, διότι ο τρόπος χειραψίας είναι όμοιος με αυτόν που ακολουθείται στην παράδοση των ειδοποιήσεων για επερωτήσεις διαρκείας -- 4.2.10 Παράδοση Ειδοποιήσεων (μόνο για Υπερ-κόμβους).

Στη συνέχεια ακολουθεί ο αλγόριθμος ευρετηριασμού και απάντησης μίας στιγμιαίας επερώτησης:

Table: Αλγόριθμος ευρετηριασμού και απάντησης στιγμιαίων επερωτήσεων.
Αλγόριθμος ευρετηριασμού και απάντησης στιγμιαίων επερωτήσεων
   
   
1. $ \mathbf{if} q is of type T1 \mathbf{then}$
2. $ \qquad String word = getArbitraryWord(q)$
3. $ \qquad NodeId id = \bf {\textcolor{grey}{lookup(word)}}$ // lookup() procedure of DHT
4. $ \qquad \mathbf{if} responsibleFor(id, myId) \mathbf{then}$
5. $ \qquad \qquad Vector answers$
6. $ \qquad \qquad \mathbf{for} \mathbf{every} pubKey \mathbf{in} myStoredPublications[] \mathbf{do}$
7. $ \qquad \qquad \qquad Publication pub = \bf {\textcolor{grey}{lookup(pubKey)}}$
8. $ \qquad \qquad \qquad \mathbf{if} match(q, pub) \mathbf{then}$
9. $ \qquad \qquad \qquad \qquad add({C, q, pubKey}, answers)$
10. $ \qquad \qquad \mathbf{done}$
11. $ \qquad \qquad sendAnswers(C, q, answers)$
12. $ \qquad \mathbf{else}$ // this node is not responsible for answering q
13. $ \qquad \qquad \bf {\textcolor{grey}{send(q, node)}}$
14. $ \mathbf{else}$ // q is of type T2
15. $ \qquad String[] words = getDistinctWords(q)$
16. $ \qquad Set ids$
17. $ \qquad \mathbf{for} \mathbf{every} word \mathbf{in} words[] \mathbf{do}$
18. $ \qquad \qquad NodeId nodeId = \bf {\textcolor{grey}{lookup(word)}}$
19. $ \qquad \qquad put(nodeId, ids)$
20. $ \qquad \mathbf{done}$
21. $ \qquad \mathbf{for} \mathbf{every} node \mathbf{in} ids \mathbf{do}$
22. $ \qquad \qquad \mathbf{if} responsibleFor(id, myId) \mathbf{then}$
23. $ \qquad \qquad \qquad \mathbf{do} lines 5 - 11$
24. $ \qquad \qquad \mathbf{else}$
25. $ \qquad \qquad \qquad \bf {\textcolor{grey}{send(q, node)}}$
26. $ \qquad \mathbf{done}$
  // Finally all super-peers that receive q answer it executing
  // the code of lines 5 - 11
   
   

Charalampos Nikolaou 2008-04-02