-
Notifications
You must be signed in to change notification settings - Fork 270
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
am19140
wants to merge
22
commits into
DataStories-UniPi:master
Choose a base branch
from
am19140:master
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Πετροπούλου Μαρία - Π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
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”
SELECT * FROM department WHERE NOT budget>85000
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
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
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
Τέλος, τροποποιήθηκαν τα meta tables και πιο συγκεκριμένα το meta_indexes, στο οποίο προστέθηκε το όρισμα column_name, δηλαδή η στήλη που κάνει input ο χρήστης.
b) Hash
Για το συγκεκριμένο ερώτημα προστέθηκε ο έλεγχος του είδους ευρετηρίου (‘hash’), στην συνάρτηση create_index, στο αρχείο database.py ως εξής:
Στην συνέχεια προστέθηκε ο έλεγχος του είδους ευρετηρίου (‘hash’), στην συνάρτηση construct_index, στο αρχείο database.py ως εξής: