Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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, ​criterionString ​"​Asc"​): Table = ???+def sort(column:​ String, ​ascendingBoolean ​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(table2String, c1: String, ​c2: String): ​Option[Table= ???+def join(otherTable)(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 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: Databasedate: StringemployeeID: 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(table1Stringc1String, table2: String, c2: String): Option[Table] = ???+def query_3(dbDatabaseminCostInt): 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 | 
-| Table | sort | 1.5 +| Table | delete | 
-| Table | select | 1.5 | +| Table | sort | 
-| 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 | |+| Table | filter | 4 | 
 +| Table | update | 4 | 
 +| **TABLE** | **TOTAL** | **45** | 
 +| Filter | Field | |
 | Filter | Compound | 3 | | Filter | Compound | 3 |
-| Filter | Not | +| Filter | Not | 
-| Filter | And | +| Filter | And | 
-| Filter | Or | +| Filter | Or | 
-| Filter | Equal | +| Filter | Equal | 
-| Filter | Any | +| Filter | Any | 
-| Filter | All | +| 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 ​
 +| Database | update ​3 | 
 +| Database | delete| 3 
 +| Database | selectTables | 
 +| Database | indexing | 
 +**DATABASE** ​**TOTAL** ​**15** | 
 +| Query | query1 | 3 | 
 +| Query | query2 | 3 | 
 +| Query | query3 | 4 | 
 +| **QUERY** | **TOTAL** | **10** |
 | ''​TEMA 2''​ | ''​TOTAL''​ | ''​100''​ | | ''​TEMA 2''​ | ''​TOTAL''​ | ''​100''​ |