Table of Contents

Tema - VideosDB

Obiective

În cadrul acestei teme veți implementa o platformă simplificată ce oferă informații despre filme și despre seriale. Utilizatorii pot să primească recomandări personalizate pe baza preferințelor.

Principalul scop al temei este de a vă familiariza cu scrierea codului în mod orientat pe obiect prin folosirea de concepte precum moștenirea, agregarea, polimorfismul și abstractizarea. De asemenea veți putea să vă exersați programarea în Java.

În cadrul acestui curs punem accentul pe calitatea codului, atât ca design, cât și ca aspect. De aceea, pentru toate temele vă încurajăm să folosiți tool-ul de analiză statică checkstyle, cu care vă puteți verifica respectarea code style-ului oficial al limbajului Java.

Descriere

Platforma pe care o veți implementa simulează acțiuni pe care le pot face utilizatorii pe o platforma de vizualizare de filme: ratings, vizualizare film, căutări, recomandări etc.

Entitățile pe care le veți modela vor fi:

Datele pentru aceste entități sunt încărcate din fișierele JSON oferite ca intrare în teste. Ele sunt ținute într-un Repository.

În secțiunea Detalii de implementare vom oferi exemple pentru fiecare entitate și acțiunile efectuate pe ele.

Utilizatorii pot realiza următoarele trei tipuri de acțiuni: comenzi, query-uri și recomandări.

Execuția temei

  1. Se încarcă datele citite din fișierul de test, în format JSON, în obiecte.
  2. Se primesc secvențial acțiuni (comenzi, queries sau recomandări) și se execută pe măsură ce sunt primite, rezultatul lor având efect asupra Repository-ului
  3. După executarea unei acțiuni, se afișează rezultatul ei în fișierul JSON de ieșire
  4. La terminarea tuturor acțiunilor se termina și execuția programului.

Comenzile

Acestea reprezintă abilitatea unui utilizator de a realiza acțiuni directe, fiind de 3 tipuri diferite.

Query-urile

Acestea reprezintă căutări globale efectuate de utilizatori după actori, video-uri și utilizator. Rezultatele acestor query-uri sunt afișate ca output al testului.

Un query contine tipul de informație căutată: actor/video/user, criteriul de sortare și diverși parametri. În secțiunea Implementare aveți exemple pentru toate felurile de queries. Query-urile conțin ca parametru și ordinea sortării, dacă sortarea să se facă crescător sau descrescător. Criteriul de sortare secundar este ordinea alfabetică descrescătoare/crescătoare în funcție de ordinea de la primul criteriu.

Pentru actori:

Pentru video-uri:

Pentru utilizatori:

Precizare: Daca numarul de raspunsuri este mai mic decat N, atunci se vor returna toate. Rezultatul este de forma: “Query result: [X]”, unde X este o lista de elemente, care poate sa contina 0 elemente!

Recomandările

Acestea reprezintă căutări după video-uri ale utilizatorilor. Ele sunt particularizate pe baza profilului acestora și au la bază 5 strategii.

Strategiile de recomandare:

Pentru toți utilizatorii:

Doar pentru utilizatorii premium:

În cadrul recomandărilor (fără Search Recommendation), al doilea criteriu de sortare este ordinea din baza de date (adică ordinea de apariţie în câmpul “movies”/“shows” din database).

Doar în cadrul Search Recommendation al doilea criteriu de sortare este numele.

Atunci când nu se poate întoarce niciun video se afiseaza “XRecommendation cannot be applied!”, altfel “XRecommendation result: ”, unde X este numele strategiei.

Detalii pentru implementare

Scheletul de cod

În rezolvarea temei va fi nevoie de folosirea unor obiecte pentru stocarea și maparea datelor primite în format JSON. Scheletul temei vă oferă mai multe clase și enum-uri utile pentru rularea temei, citirea și parsarea testelor. Acestea se regăsesc în cadrul scheletului astfel:

Pentru a putea scrie în fişier se pot folosi metodele din clasa Writer:

Pentru a putea scrie în fişier este nevoie de popularea unui singur JSONArray.

Scheletul conține și un fișier README cu detalii despre rulare și fișierele oferite.

Exemple date de intrare

Entități

Utilizator

Click pentru exemplu

Click pentru exemplu

{
   "username": "madUnicorn3",
   "subscription": "BASIC",
   "history": [
       {
           "name": "SPF-18",
           "no_views": 3
       },
       {
           "name": "Waiting for the Barbarians",
           "no_views": 2
       },
       {
           "name": "The Circle",
           "no_views": 3
       },
       {
           "name": "Euphoria",
           "no_views": 3
       },
       {
           "name": "The 4400",
           "no_views": 3
       },
       {
           "name": "The Haunting of Hill House",
           "no_views": 2
       }
   ],
 
   "favourite": [
       "Waiting for the Barbarians",
       "The Circle"
   ]
}

Actor

Click pentru exemplu

Click pentru exemplu

{
    "name": "Johnny Depp",
    "career_description": "John Christopher \"Johnny\" Depp II (born June 9, 1963 in Kentucky) is an American actor and musician. He has been nominated for three Academy Awards and has won the Golden Globe and Screen Actors Guild Awards for Best Actor.\n\nDepp rose to prominence on the 1980s television series 21 Jump Street, becoming a teen idol. Turning to film, he played the title character of Edward Scissorhands (1990), and later found box office success in films such as Sleepy Hollow (1999), Pirates of the Caribbean: The Curse of the Black Pearl (2003), Charlie and the Chocolate Factory (2005), and Rango (2011). He has collaborated with director and friend Tim Burton in seven films, including Sweeney Todd: The Demon Barber of Fleet Street (2007) and Alice in Wonderland (2010). Depp has gained acclaim for his portrayals of people such as Edward D. Wood, Jr., in Ed Wood, Joseph D. Pistone in Donnie Brasco, Hunter S. Thompson in Fear and Loathing in Las Vegas, George Jung in Blow, and the bank robber John Dillinger in Michael Mann's Public Enemies.\n\nFilms featuring Depp have grossed over $2.6 billion at the United States box office and over $6 billion worldwide. He has been nominated for top awards many times, winning the Best Actor Awards from the Golden Globes for Sweeney Todd: The Demon Barber of Fleet Street and from the Screen Actors Guild for Pirates of the Caribbean: The Curse of the Black Pearl. He also has garnered a sex symbol status in American cinema, being twice named as the Sexiest man alive by People magazine in 2003 and 2009.",
    "filmography": [
        "Waiting for the Barbarians",
        "The Professor",
        "City of Lies",
        "Fantastic Beasts: The Crimes of Grindelwald",
        "London Fields",
        "Don Juan DeMarco",
        "Ed Wood",
        "Pirates of the Caribbean: Dead Men Tell No Tales"
    ],
    "awards": []
}

Video - film

Click pentru exemplu

Click pentru exemplu

{
    "name": "The Child in Time",
    "year": "2018",
    "duration": 90,
    "genres": [
        "TV Movie",
        "Drama"
    ],
    "actors": [
        "Benedict Cumberbatch",
        "Stephen Campbell Moore",
        "Kelly Macdonald"
    ]
}

Video - serial

Click pentru exemplu

Click pentru exemplu

{
    "name": "Marvel's Cloak & Dagger",
    "year": "2018",
    "cast": [
        "Aubrey Joseph",
        "Olivia Holt"
    ],
    "genres": [
        "Action & Adventure",
        "Drama",
        "Sci-Fi & Fantasy"
    ],
    "number_of_seasons": 2,
    "seasons": [
        {
            "current_season": 1,
            "duration": 44
        },
        {
            "current_season": 2,
            "duration": 44
        }
    ]
}

Comenzi

Adaugă videoul The Circle în lista de videouri favorite ale utilizatorului madUnicor3

Click pentru exemplu de comanda favorite

Click pentru exemplu de comanda favorite

{
    "action_id": 7,
    "action_type": "command",
    "type": "favorite",
    "user": "madUnicorn3",
    "title": "The Circle"
}

Adaugă videoul False identidad în lista de videouri vizualizate ale utilizatorului madUnicorn3

Click pentru exemplu de comanda view

Click pentru exemplu de comanda view

{
    "action_id": 8,
    "action_type": "command",
    "type": "view",
    "user": "madUnicorn3",
    "title": "Falsa Identidad"
}        

Adaugă rating 9 pentru sezonul 1 al show-ului The Haunting of Hill House în lista de ratings pentru show-uri ale utilizatorului kindLocust2

Click pentru exemplu de comanda rating

Click pentru exemplu de comanda rating

{
    "action_id": 9,
    "action_type": "command",
    "type": "rating",
    "user": "kindLocust2",
    "title": "The Haunting of Hill House",
    "grade": 9,
    "season": 1
}

Queries

Oferă primii 17 actori sortați în ordine crescătoare în funcție de media acestora.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 16,
    "action_type": "query",
    "object_type": "actors",
    "number": 17,
    "filters": {
        "year": null,
        "genre": null,
        "words": null,
        "awards": null
    },
    "sort_type": "asc",
    "criteria": "average"
}

Oferă o listă cu actorii ce au câștigat premiile BEST_PERFORMANCE și BEST_SUPPORTING_ACTOR sortate în ordine descrescătoare.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 1,
    "action_type": "query",
    "object_type": "actors",
    "number": null,
    "filters": {
        "year": null,
        "genre": null,
        "words": null,
        "awards": [
            "BEST_PERFORMANCE",
            "BEST_SUPPORTING_ACTOR",
        ]
    },
    "sort_type": "desc",
    "criteria": "awards"
}

Oferă o listă cu actorii ce au în descriere cuvintele cheie actress și producer sortați în ordine crescătoare.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 1,
    "action_type": "query",
    "object_type": "actors",
    "number": null,
    "filters": {
        "year": null,
        "genre": null,
        "words": [
            "actress",
            "producer"
        ],
        "awards": null
    },
    "sort_type": "asc",
    "criteria": "filter_description"
}

Întoarce o listă cu primele 6 filme ce sunt din anul 2019 și au genul Action sortate descrescător după raiting.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 5,
    "action_type": "query",
    "object_type": "movies",
    "number": 6,
    "filters": {
        "year": "2019",
        "genre": "Action",
        "words": null,
        "awards": null
    },
    "sort_type": "desc",
    "criteria": "ratings"
}

Întoarce o listă cu primele 9 filme favorite din anul 1994 cu genul Romance sortate descrescător după numărul de apariții în lista de filme favorite ale utilizatorilor.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 1,
    "action_type": "query",
    "object_type": "movies",
    "number": 9,
    "filters": {
        "year": "1994",
        "genre": "Romance",
        "words": null,
        "awards": null
    },
    "sort_type": "desc",
    "criteria": "favorite"
}

Întoarce o listă cu primele 8 filme din anul 2017 cu genul Comedy sortate crescător după lungimea lor.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 1,
    "action_type": "query",
    "object_type": "movies",
    "number": 8,
    "filters": {
        "year": "2017",
        "genre": "Comedy",
        "words": null,
        "awards": null
    },
    "sort_type": "asc",
    "criteria": "longest"
}

Întoarce o listă cu primele 7 filme din anul 2017 cu genul Drama sortate descrescător după numărul de vizualizări.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 1,
    "action_type": "query",
    "object_type": "movies",
    "number": 7,
    "filters": {
        "year": "2017",
        "genre": "Drama",
        "words": null,
        "awards": null
    },
    "sort_type": "desc",
    "criteria": "most_viewed"
}

Întoarce o listă cu primii 10 utilizatori sortați crescător după numărul de ratings pe care le-au dat.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 10,
    "action_type": "query",
    "object_type": "users",
    "number": 10,
    "sort_type": "asc",
    "criteria": "num_ratings"
}

Recomandări

Întoarce primul video nevăzut de utilizatorul lyingRice4.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 1,
    "action_type": "recommendation",
    "type": "standard",
    "username": "lyingRice4"
}

Întoarce cel mai bun video nevizualizat de utilizatorul solidEagle6.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 10,
    "action_type": "recommendation",
    "type": "best_unseen",
    "username": "solidEagle6"
}

Întoarce video-ul cel mai vizionat din cel mai popular gen pentru utilizatorul culturedCurlew5.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 10,
    "action_type": "recommendation",
    "type": "popular",
    "username": "culturedCurlew5"
}

Întoarce filmul care e cel mai des întâlnit în lista de favorite pentru utilizatorul aboardMackerel5.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 10,
    "action_type": "recommendation",
    "type": "favorite",
    "username": "aboardMackerel5"
}

Întoarce o listă cu toate filmele nevăzute de utilizatorul finickyZebra8 din genul Action & Adventure.

Click pentru exemplu

Click pentru exemplu

{
    "action_id": 10,
    "action_type": "recommendation",
    "type": "search",
    "username": "finickyZebra8",
    "genre": "Action & Adventure"
}

Diverse detalii

Rulare

Rularea temei se va realiza exclusiv prin intermediul clasei Main, de acolo fiind apelat și checkstyle-ul. Toate testele se regăsesc în directorul test_db din cadrul scheletului temei.

Evaluare

Punctajul constă din:

Pe pagina Indicații pentru teme găsiți indicații despre scrierea readme-ului și depunctările generale pentru teme

Depunctarile pentru designul și organizarea codului se vor scădea din punctajul testelor. Dacă vor apărea depunctari specifice temei în momentul evaluării, nemenționate pe pagina cu depunctări generale, ele se vor încadra în limitele de maxim 15 pentru design, 5p pentru readme. Dacă tema nu respecta cerințele, sau are zero design OOP atunci se pot face depunctari suplimentare.

Folosirea git pentru versionare va fi verificata din folderul .git pe care trebuie să îl includeți în arhiva temei. Punctajul se va acorda dacă ați făcut minim 3 commit-uri relevante și cu mesaj sugestiv.

Teste temei au punctaj diferentiat pe dificultatea lor:

Bonusuri: La evaluare, putem oferi bonusuri pentru design foarte bun, cod bine documentat dar și pentru diverse elemente suplimentare alese de voi.

Temele vor fi testate împotriva plagiatului. Orice tentativă de copiere va duce la anularea punctajului de pe parcursul semestrului şi repetarea materiei atât pentru sursă(e) cât şi pentru destinație(ii), fără excepție.

Checkstyle

Unul din obiectivele temei este învățarea respectării code-style-ului limbajului pe care îl folosiți. Aceste convenții (de exemplu cum numiți fișierele, clasele, variabilele, cum indentați) sunt verificate pentru temă de către tool-ul checkstyle.

Pe pagina de Recomandări cod găsiți câteva exemple de coding style.

Dacă numărul de erori depistate de checkstyle depășește 30, atunci punctele pentru coding-style nu vor fi acordate. Dacă punctajul este negativ, acesta se trunchiază la 0.

Exemple:

Upload temă

Arhiva pe care o veţi urca pe VMChecker va trebui să conţină în directorul rădăcină:

Resurse și linkuri utile