Kihagyás

3. MongoDB

MongoDB házi feladat, a teljesítéssel 4 pont és 3 iMsc pont szerezhető.

GitHub Classroom segítségével hozz létre magadnak egy repository-t. A meghívó URL-t Moodle-ben találod. Klónozd le az így elkészült repository-t. Ez tartalmazni fogja a megoldás elvárt szerkezetét. A feladatok elkészítése után kommitold és pushold a megoldásod.

A megoldáshoz szükséges szoftvereket és eszközöket lásd itt.

Előkészületként hozz létre egy új adatbázist, a gyakorlatanyagban leírt módon.

Feladat 0: Neptun kód

Első lépésként a gyökérben található neptun.txt fájlba írd bele a Neptun kódodat!

Feladat 1: Legnagyobb összértékű termék a raktárban (2 pont)

A feladat meghatározni, hogy a raktárunkban egy adott kategóriába tartozó termékek közül melyik képviseli a legnagyobb összértéket — tehát melyik termék az, amelyiknek az ára szorozva a raktárban lévő mennyiségével a legnagyobb. Ehhez a ProductRepository osztályban a következő metódust kell implementálnunk.

(string, double?) ProductWithLargestTotalValue(ObjectId categoryId)
  1. A pontos specifikáció megértéséhez vizsgáljuk meg először a feladathoz tartozó teszteket a TestExercise1.cs fájlban.

    • A függvény bemeneti paramétere a kategória ID-ja, amelyhez tartozó termékekre éppen kíváncsiak vagyunk.
    • Amennyiben tartozik termék a megadott kategóriához, akkor a legnagyobb összértékű termék nevét és az összértéket kell visszaadnunk.
    • Amennyiben nem tartozik termék a kategóriához, mind a két értékre null-t kell visszaadnunk.
  2. A lekérdezés elvégzéséhez a MongoDB aggregációs pipeline-ját érdemes használni. Ennek működésének felelevenítéséhez nézd meg a gyakorlatfeladatok megoldását.

    A lekérdezéshez a következő pipeline lépések szükségesek:

    • Szűrjük le a termékeket a megadott kategóriához tartozókra. Ehhez egy $match (Match) lépésre lesz szükségünk, ahol megadhatjuk a megfelelő filter kifejezést.

    • Számoljuk ki minden megmaradt termék esetén az összértéket egy $project (Project) lépés segítségével. Ne felejtsd el, hogy az összérték mellett a termék nevére is szükségünk lesz!

    • Rendezzük az így kapott dokumentumokat csökkenő sorrendbe az összérték alapján. Ehhez a $sort (SortByDescending) lépést tudjuk alkalmazni.

    • A legnagyobb értékre vagyunk kíváncsiak, azaz az eredmények közül csupán az első érdekel minket. Azonban akkor sem szeretnénk hibát kapni, ha egyáltalán nem tartozott termék ehhez a kategóriához. Ezért a FirstOrDefault kiértékelő utasítást érdemes használni.

    Ha esetleg ismeretlen lenne a (string, double?) szintaktika:

    return ("test", 0.0);
    

    utasítás segítségével egyszerre két visszatérési értéket tudunk adni a függvénynek.

  3. Készítsd el a függvény implementációját. A repository osztály konstruktorban megkapja az adatbázist és elmenti magának a használandó gyűjteményt, ezen keresztül érheted el az adatbázist.

A teszteléshez találsz unit teszteket a solution-ben. A teszteket Visual Studio-ban egyszerűen tudod futtatni, de ha mást használsz fejlesztéshez (pl. VS Code és/vagy dotnet cli), akkor is tudsz teszteket futtatni. Az adatbázis eléréséhez a TestDbFactory osztályban módosíthatod a connection stringet.

Tesztek

A tesztek az adatbázis kiinduló állapotát feltételezik. Futtasd le az adatbázis scriptet a kiinduló állapot visszaállításához.

A tesztek kódját NE módosítsd. Ha a teszteléshez szükséges, ideiglenesen beleszerkeszthetsz, de ügyelj rá, hogy az eredeti állapottal kommitold a megoldásod.

BEADANDÓ

A módosított C# forráskódot töltsd fel.

Emellett készíts egy képernyőképet Visual Studio-ból (vagy a fejlesztéshez használt eszközből, akár dotnet cli is lehet), amelyben a vonatkozó teszteket lefuttattad. Látszódjon a repository osztály kódja és a tesztek futásának eredménye! A képet f1.png néven mentsd el és add be a megoldásod részeként!

Ha dotnet test-et használsz a teszt futtatásához, a képernyőképen látszódjon az összes teszt neve. Ehhez használd a -v n kapcsolót a részletesebb naplózáshoz.

A képernyőképen levő forráskód tekintetében nem szükséges, hogy a végső megoldásban szereplő kód betűről betűre megegyezzen a képen és a feltöltött változatban. Tehát a tesztek sikeres lefutása után elkészített képernyőképet nem szükséges frissíteni, ha a forráskódban kisebb változtatást eszközölsz.

Feladat 2: Új termék beszúrása (2 pont)

A feladat egy új termék beszúrásához egy függvény készítése. A beszúráskor több feltételnek is meg kell felelni, amiket ellenőrizni kell a beszúrás előtt. Ehhez implementáld az InsertProduct(string name, string category, int vat) függvényt

A következőkre kell figyelni a beszúráskor: - Amennyiben adott névvel már van termék, dobj kivételt (ArgumentException) - Amennyiben a megadott category nevű kategória még nincsen, dobj kivételt (ArgumentException) - Amennyiben a megadott vat értékhez tartozik már név egy másik Product példány esetén, akkor használd annak a nevét, egyébként vedd fel "VAT" névvel a beszúrandó termékhez.

  1. A repository osztály konstruktorát egészítsd ki, hogy legyenek kategóriák is elérhetőek. Ehhez vedd fel a kategóriához tartozó osztályt!

  2. Készítsd el a függvény implementációját, a paraméterekkel kapcsolatos kikötéseket ellenőrizd mielőtt a beszúrást végrehajtod! Segítségedre vannak a TestExercise2.cs fájlban található tesztek.

BEADANDÓ

A módosított C# forráskódot töltsd fel! Emellett készíts egy képernyőképet az első feladathoz hasonlóan, amelyben a vonatkozó teszteket lefuttattad! A képet f2.png néven mentsd el és add be a megoldásod részeként!

Feladat 3: Raktár méret becslés (3 iMsc pont)

Egy cég új telephelyre költözik. A vezetésnek szüksége van arra az információra, hogy át tudják-e költöztetni a már meglévő raktárkészletet az új raktárba. Implementáld a függvényt, amely kiszámolja a teljes raktárkészletre a csomagok térfogatát!

A termékeink egy részénél van méret információ a description.product.package_parameters alatt:

Termék méret adat

Ebből kell kiszámolni a teljes raktárkészlet térfogatát:

  • Az adatot a package_parameters-ből vedd (és ne a product_size-ból).
  • Egy termék lehet, hogy több csomagból áll, ezt a package_parameters.number_of_packages-ben találod. Ez csak egy szorzó, tehát egyetlen mérete van minden terméknek, legfeljebb több, ugyanakkora csomagból áll.
  • A végeredmény: minden termékre Σ (termék raktárkészlet * csomag darabszám * szélesség * hosszússág * mélység).
  • Amely terméknél nincs meg ez az információ, ott 0 térfogattal számolj.
  • Ügyelj rá, hogy a térfogat számítás mértékegység helyes legyen: a termékek mérete vagy cm vagy m mértékegységben lehet megadva, de a végeredményben a térfogat köbméterben kell!

Készítsd el a double GetAllProductsCumulativeVolume() függvény implementációját, amely a teljes térfogatot visszaadja m^3-ben. A számítást adatbázisban végezd (és ne C#-ban), ehhez használd az aggregációs pipeline-t.

Sum aggregáció

Az aggregáláshoz a $group pipeline stage-re lesz szükséged. Bár nem akarunk csoportosítani, mégis, így van lehetőség a teljes gyűjteményen aggregálásra. Minden termék elemet ugyanabba a csoportba képezz le (tehát, a $group-ban az id-hoz egy konstanst rendelj), majd a projekció részben végezheted el a $sum típusú aggregálást a fenti képletnek megfelelően.

A cm és m mértékegység kezelés csak egy szorzót jelent, a sum összegzésben meg tudod oldani egy feltételes szorzással. Ha ez nem sikerül, megoldhatod két külön aggregációval is, amelyekben szűrsz a mértékegységre majd utána jön az aggregáció.

A szükséges adatok nincsenek leképezve C# entitásra, ezeket neked kell elkészítened. Ügyelj rá, hogy a BSON dokumentumban az elemek neve eltér a szokásostól, így amikor C# property-re képezed le, vagy ennek megfelelően kell elnevezni a property-ket, vagy használhatod a [BsonElement(elementName: "...")] attribútumot.

Figyelj oda, hogy a módosításaid ne rontsák el a 2. feladat megoldását, így ha kell a beszúrást módosítsd úgy, hogy a termék méretei 1x1x1 cm-esek legyenek, a többi nem megadott változót vedd fel általad választott értékekkel!

Fluent Api-t használj

Mindenképpen C#-os Fluent Api-t használj! Ne BsonDocument-ben írd meg a lekérdezést!

Ha sikerült implementálni a metódust, akkor a korábban már látott módon a TestExercise3 osztályban található teszt metódussal ellenőrizni tudod a működést. A teszt az adatbázis kiinduló állapotát feltételezi.

BEADANDÓ

A módosított C# forráskódot töltsd fel.


2024-11-04 Szerzők