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:56] 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 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> | ||
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'' | | ||