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

ΣΥΣΤΗΜΑΤΑ ΔΙΑΧΕΙΡΙΣΗΣ ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ - Π19140 #219

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

Conversation

am19140
Copy link

@am19140 am19140 commented Feb 20, 2023

Πετροπούλου Μαρία - Π19140
Documentation.pdf

ISSUE 1

a) BETWEEN

Για την υλοποίηση του operator BETWEEN (πχ. SELECT * FROM student WHERE tot_cred BETWEEN 55 AND 100), τροποποιήθηκε η συνάρτηση _select_where στο αρχείο table.py. Εκεί, προστέθηκε ένας έλεγχος ύπαρξης του string “between” στην συνθήκη, η οποία δίνεται από τον χρήστη (πχ. tot_cred between 55 and 100 ). Για τον συγκεκριμένο έλεγχο χρησιμοποιήθηκε η συνάρτηση split(), με την οποία η συνθήκη χωρίζεται όπου έχει κενό και κάθε στοιχείο διαχωρισμού προστίθεται ως string στην λίστα splt (πχ. splt=[ “tot_cred”, “between”, “55”, “and”“100”] ). Έτσι, το πρώτο στοιχείο της λίστας ορίζεται ως η στήλη που μας ενδιαφέρει, το τρίτο στοιχείο της λίστας ορίζεται ως η ελάχιστη τιμή και το πέμπτο στοιχείο της λίστας ορίζεται ως η μέγιστη τιμή. Στην συνέχεια, εάν η μέγιστη και ελάχιστη τιμή είναι αριθμοί και εάν η στήλη περιέχει ακεραίους, γίνεται έλεγχος εάν κάθε τιμή της στήλης βρίσκεται μεταξύ της ελάχιστης και μέγιστης τιμής. Εάν οι συνθήκες επαληθεύονται, ο αριθμός της γραμμής αποθηκεύεται στην λίστα rows (πχ. Για την πρώτη γραμμή αποθηκεύεται η τιμή 0).

SELECT * FROM student WHERE tot_cred BETWEEN 55 AND 100

image

a) NOT

Για την υλοποίηση του operator NOT (πχ. SELECT * FROM course WHERE NOT dept_name = “physics”), τροποποιήθηκε η συνάρτηση _select_where στο αρχείο table.py. Εκεί, προστέθηκε ένας έλεγχος ύπαρξης του string “not” στην συνθήκη, η οποία δίνεται από τον χρήστη (πχ. NOT dept_name = “physics”). Για τον συγκεκριμένο έλεγχο χρησιμοποιήθηκε η συνάρτηση split(“and”), με την οποία η συνθήκη χωρίζεται όπου περιέχεται το string “and” (πχ. splt=[ “ ”, “dept_name = “physics””). Για το δεύτερο στοιχείο της splt, επαναλαμβάνεται η διαδικασία που υποστήριζε η miniDB. Ωστόσο, χρειάζεται τροποποίηση στον operator, ο οποίος πρέπει να αναστραφεί. Για αυτό τον σκοπό, χρησιμοποιήθηκε η συνάρτηση reverse_op(operator), η οποία βρίσκεται στο αρχείο misc.py. Στην περίπτωση της ερώτησης ταυτότητας (operator : =), κάθε στοιχείο, το οποίο δεν είναι ίσο με την τιμή που δήλωσε ο χρήστης, προστίθεται στην λίστα rows.

SELECT * FROM course WHERE NOT dept_name = “physics”

image

SELECT * FROM department WHERE NOT budget>85000

image

b) AND

Για την υλοποίηση του operator AND (πχ. SELECT * FROM course WHERE dept_name = “comp. sci.” AND credits=3), τροποποιήθηκε η συνάρτηση _select_where στο αρχείο table.py. Εκεί, προστέθηκε ένας έλεγχος ύπαρξης του string “and” στην συνθήκη, η οποία δίνεται από τον χρήστη (πχ dept_name = “comp. sci.” AND credits=3). Σε αυτό το βήμα, χρησιμοποιείται η συνάρτηση split(“and”), ώστε να δημιουργηθεί η λίστα splt, της οποίας κάθε στοιχείο είναι μία διαφορετική συνθήκη (πχ. splt = [“dept_name = “comp. sci.””,” credits=3”]). Στην συνέχεια, επαναλαμβάνεται η προυπάρχουσα διαδικασία διαχείρισης κάθε συνθήκης, για κάθε στοιχεία της παραπάνω λίστας. Στο τέλος, είναι απαραίτητο να συνδυάσουμε τα δεδομένα από κάθε συνθήκη, ώστε να διατηρηθούν αποκλειστικά τα κοινά. Για αυτό τον σκοπό χρησιμοποιήθηκε η συνάρτηση intersection(), η οποία επιστρέφει τον σύνολο των κοινών χαρακτηριστικών από λίστες.

SELECT * FROM course WHERE dept_name = “comp. sci.” AND credits=3

image

b) OR

Για την υλοποίηση του operator OR (πχ. SELECT FROM course * WHERE dept_name = “comp. sci.” OR credits=3), τροποποιήθηκε η συνάρτηση _select_where στο αρχείο table.py. Εκεί, προστέθηκε ένας έλεγχος ύπαρξης του string “or” στην συνθήκη, η οποία δίνεται από τον χρήστη (πχ dept_name = “comp. sci.” OR credits=3). Σε αυτό το βήμα, χρησιμοποιείται η συνάρτηση split(“or”), ώστε να δημιουργηθεί η λίστα splt, της οποίας κάθε στοιχείο είναι μία διαφορετική συνθήκη (πχ. splt = [“dept_name = “comp. sci.””,” credits=3”]). Στην συνέχεια, επαναλαμβάνεται η προυπάρχουσα διαδικασία διαχείρισης κάθε συνθήκης, για κάθε στοιχεία της παραπάνω λίστας. Στο τέλος κάθε επανάληψης, η λίστα με τις γραμμές που ικανοποιούν τις παραπάνω συνθήκες προστίθεται στην λίστα list_of_rows. Για κάθε λίστα που δημιουργήθηκε στην λίστα list_of rows, αποθηκεύουμε όλες τις γραμμές σε μία μονοδιάστατη λίστα rows. Ωστόσο, με αυτόν τον τρόπο δημιουργούνται διπλότυπα, τα οποία πρέπει να απαλείψουμε. Η απαλοιφή πραγματοποιείται ελέγχοντας εάν κάθε αριθμός γραμμής περιέχεται ήδη στην λίστα rows.

SELECT FROM course * WHERE dept_name = “comp. sci.” OR credits=3

image

ISSUE 2

a) BTree index over unique columns

Για το συγκεκριμένο ερώτημα, χρειάστηκε να τροποποιηθεί, αρχικά, η συνάρτηση create_query_plan στο αρχείο mdb.py. Πιο συγκεκριμένα, εμπλουτίστηκε το action ‘create table’, στο οποίο γίνεται, πλέον, έλεγχος για την ύπαρξη του όρου ‘unique’ στο query. Ενώ, προστέθηκε και το action ‘create index’.
Έπειτα, προστέθηκε το attribute unique στα ορίσματα της συνάρτησης create_table. Εκεί, προστέθηκε ο έλεγχος της τιμής unique. Πιο συγκεκριμένα, εάν δεν είναι None τότε δημιουργείται ένας πίνακας, όπως υποστηρίζει η miniDB, αλλά πλέον προστίθεται και το όρισμα unique, στο οποίο, μάλιστα, εφαρμόζεται και η συνάρτηση split(‘,’). Από την άλλη, εάν είναι None, η τιμή του unique στον πίνακα είναι επίσης None.
Για να λειτουργεί η παραπάνω διαδικασία, χρειάζεται να προσθέσουμε το όρισμα unique και στην συνάρτηση init, στο αρχείο table.py. Η συνάρτηση init είναι υπεύθυνη για την δημιουργία κάθε πίνακα.
Στην συνέχεια, χρειάζεται να προσθέσουμε το όρισμα column_name, στο αρχείο database.py, στην συνάρτηση create_index. Το column_name αντιστοιχεί στην στήλη στην οποία ο χρήστης επιθυμεί να δημιουργήσει ευρετήριο. Επίσης, προστέθηκαν ορισμένοι έλεγχοι, όπως η ύπαρξη του πίνακα που δόθηκε, εάν υπάρχει η στήλη και εάν η στήλη είναι μοναδική.

CREATE INDEX friends_index ON friends(name) USING BTREE

image

Τέλος, τροποποιήθηκαν τα meta tables και πιο συγκεκριμένα το meta_indexes, στο οποίο προστέθηκε το όρισμα column_name, δηλαδή η στήλη που κάνει input ο χρήστης.

b) Hash

Για το συγκεκριμένο ερώτημα προστέθηκε ο έλεγχος του είδους ευρετηρίου (‘hash’), στην συνάρτηση create_index, στο αρχείο database.py ως εξής:

image

Στην συνέχεια προστέθηκε ο έλεγχος του είδους ευρετηρίου (‘hash’), στην συνάρτηση construct_index, στο αρχείο database.py ως εξής:

image

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