Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
pp:2025:scala:secret_tema2 [2025/04/09 13:33] razvang [Clasa Table] |
pp:2025:scala:secret_tema2 [2025/04/10 12:09] (current) tpruteanu |
||
---|---|---|---|
Line 105: | Line 105: | ||
**1.5** Definiti operatia de sortare a liniilor din tabel dupa o anumita coloana. Functia are un parametru optional ce determina ordinea in care trebuiesc sortate. Mai mult despre parametrii optionali puteti gasi [[https://docs.scala-lang.org/tour/default-parameter-values.html | aici]]. | **1.5** Definiti operatia de sortare a liniilor din tabel dupa o anumita coloana. Functia are un parametru optional ce determina ordinea in care trebuiesc sortate. Mai mult despre parametrii optionali puteti gasi [[https://docs.scala-lang.org/tour/default-parameter-values.html | aici]]. | ||
<code scala> | <code scala> | ||
- | def sort(column: String, criterion: String = "Asc"): Table = ??? | + | def sort(column: String, ascending: Boolean = true): Table = ??? |
</code> | </code> | ||
Line 120: | Line 120: | ||
**1.8** Definiti functia join, care primeste un alt tabel si o coloana specifica pentru fiecare tabel. Aceasta functie va combina tabelele folosind coloanele indicate, rezultand intr-un nou tabel. | **1.8** Definiti functia join, care primeste un alt tabel si o coloana specifica pentru fiecare tabel. Aceasta functie va combina tabelele folosind coloanele indicate, rezultand intr-un nou tabel. | ||
* Cand valorile din coloanele folosite pentru combinatie sunt identice, se va retine o singura valoare din acele coloane. | * Cand valorile din coloanele folosite pentru combinatie sunt identice, se va retine o singura valoare din acele coloane. | ||
- | * Daca valorile difera, ele vor fi unite intr-un singur camp, separandu-le prin semnul ";", urmand ordinea in care tabelele sunt enumerate in apelul functiei. | + | * Daca valorile difera, ele vor fi unite intr-un singur camp, separandu-le prin semnul ";". |
* Se considera ca valorile de tip sir de caractere gol ("") sunt echivalente cu NULL, adica acestea nu vor fi incluse daca exista o valoare specifica intr-o alta tabela. | * Se considera ca valorile de tip sir de caractere gol ("") sunt echivalente cu NULL, adica acestea nu vor fi incluse daca exista o valoare specifica intr-o alta tabela. | ||
* In situatiile in care o linie este prezenta in tabelul A dar nu are corespondent in tabelul B, se vor completa campurile corespunzatoare din tabelul B cu sirul vid "". | * In situatiile in care o linie este prezenta in tabelul A dar nu are corespondent in tabelul B, se vor completa campurile corespunzatoare din tabelul B cu sirul vid "". | ||
Line 153: | Line 153: | ||
<code scala> | <code scala> | ||
- | def join(table2: String, c1: String, c2: String): Option[Table] = ??? | + | def join(other: Table)(col1: String, col2: String): Table = ??? |
</code> | </code> | ||
Line 187: | Line 187: | ||
<code scala> | <code scala> | ||
- | trait FilterCond { def eval(r: Row): Option[Boolean] } | + | trait FilterCond { |
+ | def eval(r: Row): Option[Boolean] | ||
+ | } | ||
case class Field(colName: String, predicate: String => Boolean) extends FilterCond { | case class Field(colName: String, predicate: String => Boolean) extends FilterCond { | ||
Line 214: | Line 216: | ||
</code> | </code> | ||
- | **2.2.** Pentru a simplifica definirea conditiilor de filtrare, vom defini cateva operatori care sa ne permita sa scriem cod mai concis. | + | **2.2.** Pentru a simplifica definirea conditiilor de filtrare, vom defini cateva operatori in cadrul traitului `FilterCond` care sa ne permita sa scriem cod mai concis. |
Vom folosi urmatorii operatori ce extind clasa FilterCond: | Vom folosi urmatorii operatori ce extind clasa FilterCond: | ||
- | - === - pentru a verifica egalitatea a doua conditii de filtrare. | + | - == - pentru a verifica egalitatea a doua conditii de filtrare. |
- && - pentru a face conjunctia a doua conditii de filtrare. | - && - pentru a face conjunctia a doua conditii de filtrare. | ||
- || - pentru a face disjunctia a doua conditii de filtrare. | - || - pentru a face disjunctia a doua conditii de filtrare. | ||
Line 222: | Line 224: | ||
<code scala> | <code scala> | ||
- | // se scoate?? | + | def ==(other: FilterCond) = ??? |
- | extension (f: FilterCond) { | + | def &&(other: FilterCond) = ??? |
- | def ==(other: FilterCond) = ??? | + | def ||(other: FilterCond) = ??? |
- | def &&(other: FilterCond) = ??? | + | def !! = ?? |
- | def ||(other: FilterCond) = ??? | + | // Puteti sa adaugati mai multi operatori :) |
- | def !! = ?? | + | |
- | // Puteti sa adaugati mai multi operatori :) | + | |
- | } | + | |
</code> | </code> | ||
Line 245: | Line 244: | ||
O baza de date contine mai multe tabele, pe care putem aplica o serie de operatii: | O baza de date contine mai multe tabele, pe care putem aplica o serie de operatii: | ||
- | - create - creaza o noua tabela cu nume unic si o lista de coloane | + | - insert - creaza o noua tabela cu nume unic si o lista de coloane |
- | - drop - sterge o tabela existenta | + | - update - actualizeaza informatiile unei tabele deja existente |
+ | - delete - sterge o tabela existenta | ||
- selectTables - extrage din lista de tabele existente un subset de tabele | - selectTables - extrage din lista de tabele existente un subset de tabele | ||
- | - join - combina doua tabele pe baza unei chei comune | ||
Line 258: | Line 257: | ||
</code> | </code> | ||
- | **3.1.**. Implementati functia create, care primeste numele unei tabele si creeaza o noua tabela doar daca numele tabelei nu exista deja in baza de date. Daca numele tabelei exista, functia va intoarce baza de date nemodificata. | + | **3.1**. Implementati functia insert, care primeste numele unei tabele si creeaza o noua tabela doar daca numele tabelei nu exista deja in baza de date. Daca numele tabelei exista, functia va intoarce baza de date nemodificata. |
<code scala> | <code scala> | ||
- | def create(tableName: String): Database = ??? | + | def insert(tableName: String): Database = ??? |
</code> | </code> | ||
- | **3.2.** Implementati functia drop, care primeste numele unei tabele si sterge tabela respectiva din baza de date. | + | **3.2** Implementati functia update care primeste numele unei tabele si o tabela noua. Functia trebuie sa inlocuiasca tabela veche din baza de date cu noua tabela. |
Daca numele tabelei nu exista in baza de date, functia va intoarce baza de date nemodificata. | Daca numele tabelei nu exista in baza de date, functia va intoarce baza de date nemodificata. | ||
<code scala> | <code scala> | ||
- | def drop(tableName: String): Database = ??? | + | def update(tableName: String, newTable: Table): Option[Database] = ??? |
</code> | </code> | ||
- | **3.3.** Implementati functia selectTables care primeste o lista de nume de tabele si extrage din baza de date doar acele tabele. | + | **3.3** Implementati functia delete, care primeste numele unei tabele si sterge tabela respectiva din baza de date. |
+ | Daca numele tabelei nu exista in baza de date, functia va intoarce baza de date nemodificata. | ||
+ | <code scala> | ||
+ | def delete(tableName: String): Database = ??? | ||
+ | </code> | ||
+ | |||
+ | **3.4** Implementati functia selectTables care primeste o lista de nume de tabele si extrage din baza de date doar acele tabele. | ||
Daca unul dintre numele de tabele nu exista in baza de date, functia va intoarce None. | Daca unul dintre numele de tabele nu exista in baza de date, functia va intoarce None. | ||
<code scala> | <code scala> | ||
- | def selectTables(tableNames: List[String]): Option[Database] = ??? | + | def selectTables(tableNames: List[String]): Database = ??? |
</code> | </code> | ||
- | **3.4** Mai adăugati ceva (cautati voi functia de implementat :-D) la Table astfel incat sa putem accesa Rows din tabel folosind un index. | + | **3.5** Mai adăugati ceva (cautati voi functia de implementat :-D) la Table astfel incat sa putem accesa Rows din tabel folosind un index. |
Faceți același lucru si pentru Database ca sa putem accesa tabelele sale folosind index direct din numele unei instante. | Faceți același lucru si pentru Database ca sa putem accesa tabelele sale folosind index direct din numele unei instante. | ||
<code scala> | <code scala> | ||
Line 288: | Line 293: | ||
</code> | </code> | ||
- | **3.5.** Implementati functia join, care primeste doua tabele si o coloana specifica pentru fiecare tabel. Aceasta functie va combina tabelele folosind coloanele indicate, rezultand intr-un nou tabel. | + | ==== Query ==== |
- | * Cand valorile din coloanele folosite pentru combinatie sunt identice, se va retine o singura valoare din acele coloane. | + | |
- | * Daca valorile difera, ele vor fi unite intr-un singur camp, separandu-le prin semnul ";", urmand ordinea in care tabelele sunt enumerate in apelul functiei. | + | |
- | * Se considera ca valorile de tip sir de caractere gol ("") sunt echivalente cu NULL, adica acestea nu vor fi incluse daca exista o valoare specifica intr-o alta tabela. | + | |
- | * In situatiile in care o linie este prezenta in tabelul A dar nu are corespondent in tabelul B, se vor completa campurile corespunzatoare din tabelul B cu sirul vid "". | + | |
- | * Similar, daca o linieeste prezenta in tabelul B dar nu are corespondent in tabelul A, se vor completa campurile corespunzatoare din tabelul A cu sirul vid "". | + | |
- | * Numele coloanei utilizate pentru join in tabelul final va fi preluat din primul tabel. | + | |
- | * Se va intoarce eroare cand unul din tabele nu exista. Daca un tabel este gol, se va intoarce celălalt tabel. | + | |
- | * Liniile din rezultat sunt in ordinea: linii ce au intrări in ambele tabele, linii doar in prima tabela, linii doar in a2a tabela. | + | |
- | <hidden Exemplu> | + | Testati structurile folosite executand niste query-uri, ce ar putea fi operatii necesare intr-un backend. **Query-urile ar trebuie sa fie one-linere, fara sa folositi ''val'' intermediare, dar puteti defini functii auxiliare (pentru filtre)** |
- | **Exemplu:** | + | |
- | **Tabelul A** | + | **4.1** Selectati din tabela ''Customers'' toti cei care au peste X ani si locuiesc intr-un oras din lista primita. Returnati raspunsul ordonat dupa ''ID''. |
- | ^id^name^age^ | + | <code scala> |
- | | 1 | Ana | 20 | | + | def query_1(db: Database, ageLimit: Int, cities: List[String]): Option[Table] = { |
- | | 2 | Ion | 30 | | + | ... |
- | | 4 | Maria | | | + | } |
+ | </code> | ||
- | **Tabelul B** | + | **4.2** Selectati din tabela ''Orders'' toate comenzile de dupa o data care nu au fost procesate de un angajat anume. Returnati doar ''OrderID'' si ''Cost'', ordonat dupa ''Cost'' descrescator. |
- | ^id^city^job^age^ | + | <code scala> |
- | | 1 | Cluj | IT | 20 | | + | def query_2(db: Database, date: String, employeeID: Int): Option[Table] = { |
- | | 2 | Iasi | HR | | | + | ... |
- | | 3 | Buc | MKT | 40 | | + | } |
- | | 4 | Buc | | | | + | </code> |
- | + | ||
- | **join("A", "id", "B", "id")** | + | |
- | ^id^name^age^city^job^ | + | |
- | | 1 | Ana | 20 | Cluj | IT | | + | |
- | | 2 | Ion | 30 | Iasi | HR | | + | |
- | | 3 | | 40 | Buc | MKT | | + | |
- | | 4 | Maria| | Buc | | | + | |
- | </hidden> | + | |
+ | **4.3** Selectati din tabelele ''Customers'' si ''Orders'' cine a facut comenzii cu ''Cost'' peste o valoare data. Returnati ''CustomerName'', ''OrderID'', ''EmployeeID'' si ''Cost'', ordonat dupa ''EmployeeID'' crescator. | ||
<code scala> | <code scala> | ||
- | def join(table1: String, c1: String, table2: String, c2: String): Option[Table] = ??? | + | def query_3(db: Database, minCost: Int): Option[Table] = { |
+ | ... | ||
+ | } | ||
</code> | </code> | ||
Line 351: | Line 343: | ||
</code> | </code> | ||
- | ==== Puncatje ==== | + | ==== Punctaje ==== |
Pentru ca avem cam multe exercitii de implementat, găsiți mai jos un tabel cu punctajele grupate: | Pentru ca avem cam multe exercitii de implementat, găsiți mai jos un tabel cu punctajele grupate: | ||
- | WIP WIP WIP WIP | ||
^ Parte a temei ^ Functionalitate ^ Punctaj ^ | ^ Parte a temei ^ Functionalitate ^ Punctaj ^ | ||
- | | Table | toString | 0.5 | | + | | Table | toString | 3 | |
- | | Table | insert | 1.5 | | + | | Table | fromCSV | 3 | |
- | | Table | delete | 1.5 | | + | | Table | insert | 3 | |
- | | Table | sort | 1.5 | | + | | Table | delete | 3 | |
- | | Table | select | 1.5 | | + | | Table | sort | 3 | |
- | | Table | apply | 1.5 | | + | | Table | select | 3 | |
- | | Table | filter | 4.5 | | + | | Table | cartesianProduct | 7.5 | |
- | | Table | update | 4.5 | | + | | Table | join | 7.5 | |
- | | **TABLE** | **TOTAL** | **17** | | + | | Table | apply | 4 | |
- | | Filter | Field | 4 | | + | | Table | filter | 4 | |
+ | | Table | update | 4 | | ||
+ | | **TABLE** | **TOTAL** | **45** | | ||
+ | | Filter | Field | 3 | | ||
| Filter | Compound | 3 | | | Filter | Compound | 3 | | ||
- | | Filter | Not | 2 | | + | | Filter | Not | 3 | |
- | | Filter | And | 2 | | + | | Filter | And | 3 | |
- | | Filter | Or | 2 | | + | | Filter | Or | 3 | |
- | | Filter | Equal | 2 | | + | | Filter | Equal | 3 | |
- | | Filter | Any | 2 | | + | | Filter | Any | 3 | |
- | | Filter | All | 2 | | + | | Filter | All | 3 | |
- | | **FILTER** | **TOTAL** | **22** | | + | | Filter | operator == | 1.5 | |
- | | Database | create | 1.5 | | + | | Filter | operator && | 1.5 | |
- | | Database | drop | 1.5 | | + | | Filter | operator `|`| | 1.5 | |
- | | Database | selectTables | 1.5 | | + | | Filter | operator ! | 1.5 | |
- | | Database | indexing | 1.5 | | + | | **FILTER** | **TOTAL** | **30** | |
- | | Database | join | 10 | | + | | Database | insert | 3 | |
+ | | Database | update | 3 | | ||
+ | | Database | delete| 3 | | ||
+ | | Database | selectTables | 3 | | ||
+ | | Database | indexing | 3 | | ||
+ | | **DATABASE** | **TOTAL** | **15** | | ||
+ | | Query | query1 | 3 | | ||
+ | | Query | query2 | 3 | | ||
+ | | Query | query3 | 4 | | ||
+ | | **QUERY** | **TOTAL** | **10** | | ||
| ''TEMA 2'' | ''TOTAL'' | ''100'' | | | ''TEMA 2'' | ''TOTAL'' | ''100'' | | ||