Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ΕΡΓΑΣΙΑ ΣΔΒΔ, Π18148, Π19176 #209

Open
wants to merge 7 commits into
base: master
Choose a base branch
from

Conversation

tasostsotras
Copy link

Η παρούσα εργασία έγινε σε περιβάλλον των Windows 11, αφού πρώτα κατεβάσαμε το Git Bash από την ιστοσελίδα https://git-scm.com/download/win. Χρειάστηκε να γίνουν ορισμένες τροποποιήσεις στα αρχεία python με τίτλο mdb, dashboard, database και table που προέρχονται από το DataStories-Unipi του GitHub. Οι κώδικες της python γράφτηκαν σε Notepad++, και με αυτούς υλοποιήσαμε το 1ο και το 2ο ερώτημα της άσκησης.
ΕΡΩΤΗΜΑ 1Ο
Στόχος του ερωτήματος ήταν να υποστηρίζεται στην miniDB η επιλογή με κάποιον από τους τελεστές BETWEEN, NOT, AND και OR. Μεταβαίνουμε στο αρχείο database.py και στην συνάρτηση select, στο σημείο που γράφεται if condition is not None, μέσα σε αυτό το if βάζουμε ένα if…elif…else με την περίπτωση καθενός από τους παραπάνω τελεστές, και σε κάθε περίπτωση εκτελείται η συνάρτηση.
Στο αρχείο table : Έγινε έλεγχος ορθότητας για κάθε μία από τις 4 λέξεις, και ανάλογα με την περίπτωση εκτελείται κατά αυτόν τον τρόπο η select_where. Στο σημείο που γράφουμε if condition is not None (line 210) βάζουμε if_elif_else για τους operators. Συγκεκριμένα είπαμε για το BETWEEN να έχει το AND ανάμεσα σε αριθμούς, ο ένας εξ αυτών εκχωρείται στην μεταβλητή aristeri_timi και ο άλλος στην μεταβλητή dexia_timi. Αλλιώς εμφανίζεται μήνυμα, ότι δεν μπορούν να συγκριθούν αλφαριθμητικά(strings). Για το OR γίνεται έλεγχος αν υπάρχει στην συνθήκη, και το αποτέλεσμα εκχωρείται σε έναν πίνακα row_lists. Με ανάλογο τρόπο δουλεύουμε και για τις συναρτήσεις NOT και AND.
Προηγουμένως δημιουργούμε την βάση αφού γράψουμε στο Git Bash τις εντολές cd miniDB και DB=database_name SQL=sql_files/smallRelationsInsertFile.sql python mdb.py. Εμφανίζεται μήνυμα ότι η βάση με το συγκεκριμένο όνομα δεν υπάρχει. Μαζί με τους κύριους πίνακες θα δημιουργηθούν και τα meta_tables.
Δημιουργία της βάσης δεδομένων
Screenshot_2

Εκτέλεση εντολής select με τον τελεστή OR
Screenshot_3

Εντολή select με τον τελεστή NOT
Screenshot_4

Εντολή select με τον τελεστή BETWEEN
Screenshot_5

Και τέλος, εντολή select με τον τελεστή AND
Screenshot_6

Επιπλέον, δοκιμάσαμε απλές εντολές εισαγωγής εγγραφών στον πίνακα, καθώς και δημιουργία νέου πίνακα.
Screenshot_7
Screenshot_8

ΕΡΩΤΗΜΑ 2Ο
Στόχος του δεύτερου ερωτήματος ήταν να φτιάξουμε ευρετήριο, τόσο σε μορφή Β δένδρου, όσο και σε μορφή ευρετηρίου κατακερματισμού. Αρχικά έγιναν ορισμένες τροποποιήσεις στο αρχείο mdb.py ώστε να υποστηρίζονται και οι δύο μορφές ευρετηρίων. Στην συνάρτηση diermineia (line 145 to 170) στην μεταβλητή kw_per_action, η οποία αποτελεί πίνακα με τις λέξεις που χρησιμοποιούμε ανάλογα με την ενέργεια, προσθέτουμε και το create_index, και το drop_index. Συνεχίζουμε στην συνάρτηση dimiourgia_protou_planou(line 39) όπου βάζουμε ένα if energeia = ‘create index’ για την περίπτωση δημιουργίας ευρετηρίου και φτιάχνουμε το λεξικό που θα εκτελεστεί στην def ektelesi_lexikou(dic) (line 172).
Για την δημιουργία του B-tree ευρετηρίου μεταβήκαμε στο αρχείο database.py και προσθέσαμε επιπλέον όρισμα index_type στην συνάρτηση create_index(line 557). Γίνεται έλεγχος για το αν υπάρχει ο πίνακας ή η στήλη επί της οποίας θέλουμε το ευρετήριο, και αν δεν υπάρχει εμφανίζεται μήνυμα λάθους. Κατόπιν αυτού δημιουργείται το ευρετήριο με κλήση της συνάρτησης _construct_index(line 577). Αν υπάρχει index με το ίδιο όνομα, προφανώς θα δοθεί μήνυμα στον χρήστη.
Για το ευρετήριο κατακερματισμού καλείται η συνάρτηση _construct_index_hash (line 588). Στην συνάρτηση αυτή παράγεται ο αριθμός των στηλών του πίνακα και δημιουργείται ένα λεξικό. Το άθροισμα του hash αρχικοποιείται ως μηδέν. Για κάθε γράμμα του στοιχείου της στήλης όπου θα γίνει το hash, το μετατρέπουμε σε αριθμό και το προσθέτουμε στο hash_sum. Το hash_index είναι το υπόλοιπο της διαίρεσης του hash_sum με το μήκος της γραμμής του πίνακα. Το sub_dictionary είναι ένα τμήμα του λεξικού που έχουμε , και εισάγουμε σε αυτό ένα νέο hash_index. Πλέον, όταν θέλουμε να κάνουμε επιλογή με index, αυτό θα γίνει με την συνάρτηση _select_where_with_hash που είναι στο αρχείο table.py (line 341). Σε αυτήν έχουμε βάλει ένα if-else, δηλαδή αν ο τελεστής είναι < ή >, θα εμφανίσει τις ζητούμενες στήλες κατ’ αλφαβητική σειρά. Αλλιώς, ακολουθούμε την ίδια διαδικασία με την _construct_index_hash του αρχείου database.py . Τέλος εξετάσαμε και την περίπτωση της εντολής drop_index, η οποία διαγράφει το ευρετήριο όταν υπάρχει ευρετήριο με το συγκεκριμένο όνομα που πληκτρολογούμε. Αλλιώς εμφανίζεται exception και μήνυμα ότι το ευρετήριο δεν υπάρχει. Παρακάτω έχουμε παραδείγματα εκτέλεσης για το δεύτερο ερώτημα.
Όταν το index δεν υπάρχει

Screenshot_9

Δημιουργία index μορφής Btree, το οποίο εισάγεται στον πίνακα meta_indexes. Εμφάνιση και των προηγούμενων indexes.
Screenshot_10

Δημιουργία ευρετηρίου μορφής Hash. Για δοκιμή προηγουμένως είχαμε δημιουργήσει και άλλα indexes τα οποία εμφανίζονται.

Screenshot_11

Τέλος, δοκιμάσαμε να δούμε αν λειτουργούν σωστά οι εντολές ταξινόμησης πίνακα. Εδώ για φθίνουσα ταξινόμηση.
Screenshot_12

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant