ИЕП/К1 Септембар 2021

Извор: SI Wiki
< ИЕП
Датум измене: 3. март 2022. у 22:20; аутор: KockaAdmiralac (разговор | доприноси) (K1 u septembarskom roku 2021 sa rešenjem (ali je verovatno pogrešno isprojektovana baza))
(разл) ← Старија измена | Тренутна верзија (разл) | Новија измена → (разл)
Пређи на навигацију Пређи на претрагу

Први колоквијум у септембарском року 2021. године одржан је 17. септембра.

Поставка

Компанија уговара пројекте израде софтвера по наруџбини клијента. У компанији су запослени програмери и менаџери. У систему се води евиденција о сваком кораку рада (захтевима, додељеним пословима, развијеном коду). За сваки пројекат неког клијента, евидентирају се датум креирања, менаџер који је надлежан за њега као и сви кориснички захтеви. Пре него што пројекат отпочне, он мора бити испланиран (а након планирања статус пројекта постаје И). Планирање пројекта се састоји у томе да се за сваки кориснички захтев дефинише посао, као и колико ће израда тог посла трајати и колико ће програмера бити ангажовано на том послу. Након тога се одређују програмери и додељује им се ангажман на појединим пословима. Имплементација пројеката може да отпочне тек након што се пројекат испланира. Током имплементације, целокупан код који програмери развијају се такође евидентира у систему и то тако да је за сваки део кода дефинисано које корисничке захтеве имплементира.

KLIJENT (SifK, Naziv, Kontakt)
RADNIK (SifR, Ime)
MENADZER (SifR, Iskustvo)
PROGRAMER (SifR, Specijalnost)
PROJEKAT (SifP, Naziv, Status, Vrednost, Datum, SifK, SifR)
ZAHTEV (SifZ, Opis, SifP)
POSAO (SifJ, Trajanje, BrProgramera, SifP, SifZ)
ANGAZMAN (SifA, SifR, SifJ)
KOD (SifK, Kod)
IMPLEMENTIRA (SifK, SifZ)
  1. Навести по један пример сваког ентитета [...]
  2. Саставити скрипт који користећи функцију за агрегацију (aggregation framework) враћа шифре и називе оних пројеката које имају вредност преко 1000, а при томе имају и више од 8 послова са трајањем преко 200.
  3. Саставити Map/Reduce посао који за сваки датум када је креиран бар један пројекат враћа информацију о просечном броју корисничких захтева.

1. задатак

Радник

{
    "_id": 1,
    "Ime": "Pera",
    // Menadzer
    "Iskustvo": null,
    // Programer
    "Specijalnost": "Docker"
}

Пројекат

{
    "_id": 1,
    "Naziv": "Softverska kompanija",
    "Status": "I",
    "Vrednost": 10000,
    "Datum": "2022-03-03T20:00:00Z",
    // Klijent
    "Klijent": {
        "Naziv": "Microsoft",
        "Kontakt": "[email protected]"
    },
    // Posao
    "Poslovi": [
        {
            "Zahtev": 1,
            "Trajanje": 90,
            // Angazman
            "Programeri": [1, 2, 3, 4, 5]
        }
    ],
    "Zahtevi": [1, 2, 3, 4]
}

Захтев

{
    "_id": 1,
    "Opis": "Tabela Implementira"
}

Код

{
    "Kod": "int main() {...}",
    // Implementira
    "Zahtevi": [1, 2, 3, 4]
}

2. задатак

db.Projekat.aggregate(
    // Филтрирање пројеката са вредношћу мањом од 1000.
    {
        $match: {
            Vrednost: {
                $gt: 1000
            }
        }
    },
    // Дељење сваког пројекта тако да се сваки посао налази у одвојеном објекту.
    {
        $unwind: "$Poslovi"
    },
    // Избацивање послова са мање од 200 трајања.
    {
        $match: {
            "$Poslovi.Trajanje": {
                $gt: 200
            }
        }
    },
    // Груписање пројеката назад са бројањем послова.
    {
        $group: {
            _id: "$_id",
            BrojPoslova: {
                $count: "$Poslovi"
            }
        }
    },
    // Филтрирање пројеката са мање од 8 послова који имају преко 200 трајања.
    {
        $match: {
            $BrojPoslova: {
                $gt: 8
            }
        }
    },
    // Враћање у траженом облику.
    {
        $project: {
            sifra: "$_id",
            naziv: "$Naziv"
        }
    }
);

3. задатак

function map() {
    emit(this.Datum, {
        sum: this.Zahtevi.length,
        count: 1
    });
}

function reduce(key, values) {
    return {
        sum: values.reduce((a, b) => a.sum + b.sum),
        count: values.reduce((a, b) => a.count + b.count)
    };
}

function finalize(key, value) {
    value.avg = value.sum / value.count;
    return value;
}

db.Projekat.mapReduce(map, reduce, {out: 'k1_septembar_2021_c', finalize});