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:53] razvang [Operatii cu una sau mai multe Tabele] |
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 263: | Line 262: | ||
| </code> | </code> | ||
| - | **3.2** Implementati functia delete, 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 delete(tableName: String): Database = ??? | + | def update(tableName: String, newTable: Table): Option[Database] = ??? |
| </code> | </code> | ||
| - | **3.3** 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. | + | **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. | Daca numele tabelei nu exista in baza de date, functia va intoarce baza de date nemodificata. | ||
| <code scala> | <code scala> | ||
| - | def update(tableName: String, newTable: Table): Option[Database] = ??? | + | def delete(tableName: String): Database = ??? |
| </code> | </code> | ||
| Line 278: | Line 277: | ||
| 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 292: | Line 291: | ||
| val dbPeople = Database(List(tabel)) | val dbPeople = Database(List(tabel)) | ||
| val tabel2 = dbPeople(0) // index aici | val tabel2 = dbPeople(0) // index aici | ||
| + | </code> | ||
| + | |||
| + | ==== Query ==== | ||
| + | |||
| + | 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)** | ||
| + | |||
| + | **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''. | ||
| + | <code scala> | ||
| + | def query_1(db: Database, ageLimit: Int, cities: List[String]): Option[Table] = { | ||
| + | ... | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | **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. | ||
| + | <code scala> | ||
| + | def query_2(db: Database, date: String, employeeID: Int): Option[Table] = { | ||
| + | ... | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | **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> | ||
| + | def query_3(db: Database, minCost: Int): Option[Table] = { | ||
| + | ... | ||
| + | } | ||
| </code> | </code> | ||
| Line 319: | 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'' | | ||