• Non ci sono risultati.

Typechecking e determinazione degli output

Anche se il parsing di una query non d`a nessun errore e quindi la query `e corretta sintatticamente, non `e detto che essa sia corretta semanticamente.

In questa fase eventuali altri errori possono essere scoperti analizzando il piano di esecuzione risultante dal parsing. Per ogni operatore abbiamo dei vincoli di correttezza che devono essere rispettati, ad esempio ogni operatore di proiezione pu`o selezionare solo un sottoinsieme degli attributi che riceve dallo stream di input. In caso contrario l’analisi della query viene interrotta e gli errori verranno mostrati dettagliatamente all’utente. `e evidente che per sapere se un operatore rispetta i

5.4. TYPECHECKING E DETERMINAZIONE DEGLI OUTPUT 67

Figura 5.3: Uno dei passaggi della traduzione di una query in una rappresentazione interna. Quando il parser riconosce il simbolo non-terminale Source List costruisce l’insieme di sei sottoalberi mostrati nella figura in basso a sinistra ed ottenuti come unione dei contributi dei quattro elementi della lista: A `e un source singolo che produce un albero composto da una sola foglia; B `e un’area che racchiude due nodi della rete che hanno il fotometro richiesto; C `e un sorgente virtuale, precedentemente definito come una coppia di source col comando CREATE mostrato in cima nella figura; D `e una inner query che produce un albero di due nodi. Quando il Source `e riconosciuto con la regola Source::= <JOIN><OPEN> Source List <CLOSE>, ad esso `e associato l’albero in basso a destra ottenuto incollando insieme i sei sottoalberi con alcuni operatori binari di giunzione.

vincoli o no `e necessario conoscere l’insieme di attributi dei suoi stream di input. Inoltre in questa fase si calcola l’output di ogni nodo del piano di esecuzione (a partire dalle foglie). Questa informazione `e utilizzata anche nella successiva fase di ottimizzazione.

Un’altro dato utile nelle fasi successive sar`a l’output rate di ogni nodo del piano, cio`e la frequenza massima con cui quel nodo mander`a ennuple al nodo padre.

Ora per ogni operatore specifichiamo quali vincoli di correttezza si devono control- lare, come si calcola l’insieme degli attributi di output (a meno di ridenominazione), come si calcola l’output rate. Tenendo presente che nel caso in cui al nodo in ques- tione sia stata associata un’etichetta di ridenominazione, questa sostituisce il prefisso di tutti gli attributi nell’insieme dell’output calcolato per quel nodo, si ha:

• Nodi foglia:

- vincoli di correttezza: il nodo della rete di sensori con l’identificatore richiesto deve esistere e deve avere il transduttore specificato. Queste informazioni sono ottenute dal sistema leggendole da un file di configu- razione che descrive lo stato fisico della rete di sensori;

- output: gli attributi in uscita sono quelli prodotti dal transduttore richiesto, come descritto nel paragrafo 3.4.1. Anche queste informazioni sono ot- tenute dal sistema leggendole da il file di configurazione;

- output rate: `e usato solo per gli stream sensori periodici e per definizione l’output rate `e quello specificato dall’utente nella query con la clausola EVERY (vedi par. 4.2.3), o quello di default se non specificato.

• Nodi Proiezione (πX):

- vincoli di correttezza: l’insieme di attributi proiettati X deve essere un sottoinsieme (anche non stretto) dell’output del figlio;

- output: `e l’insieme X;

- output rate: `e l’output rate del figlio; poich´e verr`a prodotta un’ennupla per ogni ennupla processata.

• Nodi Restrizione (σc):

- vincoli di correttezza: la condizione c deve utilizzare solo attributi pre- senti nell’output del figlio. Inoltre, se la condizione confronta due at- tributi fra loro, allora questi devono essere dello stesso tipo, cio`e devono avere lo stesso nome di campo perch´e transduttori diversi producono dati espressi in differenti unit`a di misura. Ad esempio, 1.T emperature ≤ 5.T emperature `e una condizione corretta, ma per 1.T emperature ≤ 5.Audio si ha un errore di tipo;

- output: `e lo stesso insieme di attributi di output del figlio;

- output rate: `e l’output rate del figlio. Infatti dobbiamo prevedere l’output rate massimo possibile, che si verifica quando tutte le ennuple processate verificano la condizione (caso che non possiamo escludere).

5.4. TYPECHECKING E DETERMINAZIONE DEGLI OUTPUT 69 - vincoli di correttezza: l’insieme {a1, ..., an} deve essere un sottoinsieme

(anche non stretto) dell’output del figlio. Ogni attributo, eccetto al pi`u il T imestamp, deve comparire dentro un aggregato temporale; infatti non `e consentito mettere aggregati e non aggregati nella clausola SELECT; - output: consiste nell’insieme {a1, ..., an};

- output rate: dato il funzionamento di questo operatore (vedi par. 3.5.1), l’output rate `e quello specificato dall’utente nella query con la clausola EVERY (vedi par. 4.2.3) moltiplicato per la durata dell’epoca specificata con la clausola EPOCH (vedi par. 4.2.6).

• Nodi Giunzione (⊲⊳):

- vincoli di correttezza: siano O(A) e O(B) rispettivamente l’insieme di output del figlio di destra A e di sinistra B. Allora T imestamp deve appartenere ad entrambi O(A) e O(B), perch´e la condizione di giunzione `e una uguaglianza tra il T imestamp delle ennuple di A con il T imestamp delle ennuple di B. Inoltre O(A) ∩ O(B) non deve contenere nient’altro che il T imestamp, altrimenti nel risultato ci sarebbero due campi con lo stesso nome;

- output: l’output `e l’unione dei due insiemi di attributi di output dei figli cio`e O(A) ∪ O(B);

- output rate: `e il massimo degli output rate dei figli, perch´e il nodo giun- zione produce un’ennupla solo quando entrambi i figli forniscono un’en- nupla al padre.

• Nodi Max/Min Spaziale (M ax/M in):

- vincoli di correttezza: si hanno i vincoli specificati nel caso del nodo di giunzione. Inoltre gli attributi dell’insieme di output del figlio di sinistra e di quello di destra devono avere lo stesso nome di campo indipendente- mente dal prefisso e contenere l’attributo per il quale si vuole calcolare il massimo o il minimo. Infatti ad esempio eseguire un calcolo di massimo spaziale fra un valore di Audio (misurato in decibel) e uno di Temperatura (misurato in gradi) `e un errore di tipo;

- output: l’output contiene il T imestamp e gli attributi, senza alcun prefisso, su cui si effettua il massimo o il minimo;

- output rate: si calcola come nel caso dei nodi giunzione. • Nodi Avg Spaziale (avg):

- vincoli di correttezza: si hanno i vincoli specificati nel caso come nel caso dei nodi Max/Min Spaziale;

- output: l’output contiene il T imestamp e l’attributo per il quale `e stata calcolata la media con l’aggiunta dell’attributo molteplicit`a ♯ (vedi par. 3.5.1) per i nodi di media parziale;

Figura 5.4: Esempio di una allocazione del piano di esecuzione (albero a sinistra) che determina il tipo dei vari stream e la strategia di giunzione sincrona.

• Nodi Count Spaziale (COU N T ):

- vincoli di correttezza: si hanno i vincoli specificati nel caso del nodo di giunzione;

- output: `e l’insieme costituito dagli attributi T imestamp e molteplicit`a; - output rate: si calcola come nel caso dei nodi giunzione.