# Analisi del database

## Glossario generale

> [Vedi `glossary.md`](glossary.md)


## Glossario specifico

| Entità            | Attributi                                             | Interazioni                 |
|-------------------|-------------------------------------------------------|-----------------------------|
| **User**          | email, username, password                             | Repository                  |
| **Repository**    | id, name, start, end, status                          | User, Tweet, Alert, Keyword |
| **Tweet**         | snowflake, content, location, poster                  | Repository, Condition       |
| **Condition**     | id, type, param                                       | BoolOperation               |
| **BoolOperation** | id, operation, condition_id, alert_id, node_1, node_2 | Alert, BoolOperation, Condition|
| **Alert**         | id, repository_id, name, limit, window_size           | BoolOperation, Norifica, Repository|
| **Notifica**      | id, ora, alert_id                                     | Alert|


## Elementi

### User

> Username: Steffo 
> Email: ste.pigozzi@gmail.com 
> Password: ···········

L'utilizzatore della piattaforma, colui che ha accesso ai dati. 

L'utente possiede una `email` per ricevere gli [Alert](#alert), una `password` per accedere al servizio e un `username` 
per essere più facilmente riconoscibile. 

Un utente può avere più [Repository](#repository) sotto il suo controllo. 


### Repository 

> Repository "Modena e dintorni"

Un insieme di [Tweet](#tweet) che soddisfano una o più [Condition](#condition). 

Ha un proprietario che può cambiarne le impostazioni, ma possono essere visibili a più [Users](#user). 

Un repository può avere diversi [Alert](#alert).


### Tweet

> Tweet di @USteffo: 
> "Testo di sopra #PdS2021"

Un post su Twitter, che viene salvato su NEST se soddisfa le [Condition](#condition) 
richieste da uno o più [Repository](#repository). 

I Tweet sono identificati da un particolare tipo di identificatore chiamato `snowflake`.

Contiene informazioni relative al `poster` del tweet, il suo `content` e opzionalmente informazioni sulla `location` 
in cui è stato scritto.


### Condition

> Tweet contenenti #PdS2021

> Tweet postati a Modena

> Tweet postati tra le 21:00 e le 23:00 del 15 Aprile

Un predicato usato per effettuare ricerca e filtraggio di [Tweet](#tweet). 

Può essere di diversi tipi:
- `HASHTAG`: richiede che un tweet contenga un determinato hashtag
- `LOCATION`: richiede che un tweet venga inviato in una specifica location
- `TIME`: richiede che un tweet venga inviato in un dato lasso di tempo

Viene utilizzato all'interno di [Repository](#repository) e [Alert](#alert) per definire le condizioni in cui catturare 
tweet o allertare l'utente.

È possibile unire più condizioni con una o più [BoolOperation](#booloperation).


### BoolOperation 

> Tweet contenenti #Modena **OR** Tweet postati a Modena

> Tweet postati tra le 21:00 e le 23:00 del 15 Aprile **AND** Tweet contenenti #PdS2021

Un nodo di albero binario usato per combinare più [Condition](#condition). 

Le foglie fanno riferimento a una [Condition](#condition), mentre i rami fanno riferimento ad altre 
[BoolOperation](#booloperation).

Supporta le seguenti operazioni:
- `AND`: intersezione
- `OR`: unione


### Alert

Un elemento di un [Repository](#repository) a cui è legata una [BoolOperation](#booloperation).

Se i [Tweet](#tweet) di un [Repository](#repository) che rispettano la [BoolOperation](#booloperation) superano un certo
`limit` in un lasso di tempo, si attiva e notifica l'utente.


### Notifica

Una notifica legata ad un Alert che viene creata quando l'alert viene innescato.