5.3. Databases RSL

	

module Databases;

from Edit import Clipboard, Selection, SelectionContext;

from File import FileSpace, File, Workspace;

from Admin import AdminDB, Username;

export CourseDB, Course, CourseTitle, Section, 
       ChosenTimeArrangements,
       TimeArrangement, InstructorDB, Instructor, Name,
       FirstName, MiddleName, LastName, ID, Password, Handicapped,
       InstructorCoursePreferenceDB, InstructorCoursePreference,
       InstructorTimePreferenceDB, InstructorTimePreference,
       AvailBlock, Days, Day,
       ClassroomDB, Classroom, Room, BuildingNumber, RoomNumber,
       HandicapCapable, LabCapable, ScheduleDB, ScheduleRecord, CallNum,
       Rating, Time, TimeBlock, Hour, Minute, AmOrPm, AM, PM;
   

object CourseDB is cl:Course*

    description: (* A CourseDB contains zero or more courses. *);

end CourseDB;



object ClassroomDB is cl:Classroom*

    description: (* A ClassroomDB contains zero or more classrooms. *);

end ClassroomDB;



object InstructorDB is il:Instructor*

    description: (* A InstructorDB contains zero or more instructors. *);

end InstructorDB;



object Course is

    components: title:CourseTitle and desc:Description and units:Units 
        and wtus:WTUs and tas:ChosenTimeArrangements and sec:integer 
        and sizes:Size* and notes:Notes;

    description: (* A Course contains the above fields used to distinguish them 
        from other courses. *);

end Course;



object CourseTitle is string

    description: (* CourseTitle is a free-form string indicating in what 
                    course it is. An example is "CPE 101"*);

end CourseTitle;



object Description is string

    description: (*

        Description is a free-form string describing the object.

    *);

end Description;



object Units is integer

    description: (*

        The numeric value of the number of units the course is worth.

    *);

end Units;



object WTUs is integer

    description: (*

        The numeric value of the number of WTUs(work time units) the course 
        is worth.

    *);

end WTUs;



object ChosenTimeArrangements is TimeArrangement* 

    description: (*

        The chosen time arrangements are taken from a tuple of predefined 
        time arrangements.

    *);

end ChosenTimeArrangements;



object TimeArrangementDB is tas:TimeArrangement*
   description: (* A database containing all possible time arrangements *);
end TimeArrangementDB;



object TimeArrangement is

    components: wtus:WTUs and desc:Description and lec_hrs:real 
        and lab_hrs:real and act_hrs:real and days:Days 
        and lab_and_lec_linked:boolean;

    description: (*

        The time arrangements define when on what days a course can be held, 
        what types of course it is, and how many hours per day it is held.

    *);

end TimeArrangements;



object Size is integer

    description: (*

        The number of students allowed to take the course.

    *);

end Size;



object Notes is string

    description: (*

        Notes is a free-form string used for details about the course. 
        Ex. "high demand course".

    *);

end Notes;



object Instructor is

    components: title:InstructTitle and name:Name and Degree 
                and is_handicap:Handicapped and id:ID and pass:Password;

    description: (* 
    
        An Instructor contains the above fields used to distinguish 
        them from other instructors.

    *);

end Course;



object InstructTitle is string

    description: (*

        InstructTitle is a person's title, such as Mr., Ms., etc.

    *);

end InstructTitle;



object Name is first:FirstName and middle:MiddleName and last:LastName

    description: (* A name composed of a first, middle, and last portion *);
 
end Name;



object FirstName is string

    description: (*

        This is a free-form string indicating the instructor's first name

    *);

end FirstName;



object MiddleName is string

    description: (*

        This is a free-form string indicating the instructor's middle name

    *);

end MiddleName;



object LastName is string

    description: (*

        This is a free-form string indicating the instructor's last name

    *);

end LastName;



object Degree is string

    description: (*

        This is a free-form string indicating the instructor's degree.

    *);

end Degree;



object Handicapped is boolean

    description: (*

        This is a boolean indicating if the instructor is handicapped.

    *);

end Handicapped;



object ID is string

    description: (*

       This is an id which is unique to the instuctor and is used to log in 
       for the instructor preference interface.

    *);

end ID;



object Password is string

    description: (* Contains an administrator password for securtiy.

    *);

end Password;



object Classroom is

    components: rm:Room and desc:Description and Size and Location 
         and is_lab:LabCapable and is_handicap:HandicapCapable 
         and avail_times:Availability and resources:Resource*;

    description: (* A Classroom contains the above fields used to distinguish 
        them from other classrooms.

    *);

end Classroom;



object Room is

    components: bn:BuildingNumber and rn:RoomNumber;

    description: (* A Room is located by finding its building and room number.

    *);

end Room;



object BuildingNumber is integer

    description: (*

       This is the Building where you can find this classroom.

    *);

end BuildingNumber;



object RoomNumber is integer

    description: (*

       This is the specific Room number for this classroom.

    *);

end RoomNumber;



object Location is x:integer and y:integer

    description: (*

       This is the specific Location to find the room.

    *);

end Location;



object LabCapable is boolean

    description: (*

       This boolean tells us if the room is a lab room.

    *);

end LabCapable;



object HandicapCapable is boolean

    description: (*

       This boolean tells us if the room is accessible for the handicapped.

    *);

end HandicapCapable;



object Availability is AvailabilityBlock* 

    description: (*

       This tells the scheduler when the room is available for scheduling.

    *);

end Availability;



object AvailabilityBlock is TimeBlock and Day

    description: (*

       This tells the scheduler when the room is available for scheduling.

    *);

end AvailabilityBlock;



object TimeBlock is start:Time and stop:Time

    description: (*

       This indicates the starting and stoping times of a timeblock.

    *);

end TimeBlock;



object Resource is string

    description: (* A resource which a room can include, such as a projector or
                  * VCR.
                  *);
end Resource;



object ScheduleDB is sl:ScheduleRecord*

    description: (*

       Contains a list of scheduled courses.

    *);

end ScheduleDB;



object ScheduleRecord is

    components: title:CourseTitle and sec:Section and is_lec:boolean and
        is_lab:boolean and call_num:CallNum and instr_name:Name and instr_id:ID 
        and days:Days and lec_start:Time and lec_stop:Time and lec_rm:Room 
        and lab_start:Time and lab_stop:Time and lab_rm:Room 
        and is_locked:boolean;

    description: (*

       Each schedule record holds the information for a scheduled course.

    *);

end ScheduleRecord;



object Section is integer

    description: (*

       This is an integer describing the which section of that 
       course is in the ScheduledRecord.

    *);

end Section;



object CallNum is integer

    description: (*

       This is an integer describing the call number used to capture the course.

    *);

end CallNum;

  

object Days is Day*

    description: (*

       This is a list of days.

    *);

end Days;



object Day is mon:Monday or tue:Tuesday or wed:Wednesday or thu:Thursday 
              or fri:Friday 

    description: (*

        The seven standard names of the days of the week.

    *);

end Day;



object Monday

    description: (* One of the five days of the school week. *);

end;



object Tuesday

    description: (* One of the five days of the school week. *);

end;



object Wednesday

    description: (* One of the five days of the school week. *);

end;



object Thursday

    description: (* One of the five days of the school week. *);

end;



object Friday

    description: (* One of the five days of the school week. *);

end;

  

object Time is hr:Hour and min:Minute and aorp:AmOrPm

    description: (*

        A Time consists of an hour, minute, and AM or PM indicator.  A time

        value is expressed using a 12-hour or 24-hour clock style.  The clock

        style is set as an option by the user.  If the clock style is 24-hour,

        the AmOrPm indicator is nil.

    *);

end Time;



object Hour is integer

    description: (*

        The hour component of a time value, between 1 and 12 or 0 and 24 based
        on the clock style in use.

    *);

end Hour;



object Minute is integer

    description: (*

        The minute component of a time value, between 0 and 59.

    *);

end Minute;



object AmOrPm is am:AM or pm:PM

    description: (* Standard suffix used in 12-hour time value.

    *);

end AmOrPm;



object AM

    description: (* The 12-hour time suffix indicating a morning time. *);

end;



object PM

    description: (* The 12-hour time suffix indicating an afternoon time. *);

end;



operation GenerateSchedule is

    inputs: Workspace;

    outputs: Workspace;

    precondition: ;

    postcondition: ;

    description: (*

        GenerateSchedule takes a workspace and creates a schedule which is 
        a database of schedule records.

    *);

end GenerateSchedule;



operation NewClassroom is

    inputs: cldb:ClassroomDB, cl:Classroom;

    outputs: cldb':ClassroomDB;

    description: (* This operation adds a classroom to the classroom database.        

    *);

    precondition:	
   (*
	       There is no classroom in the ClassroomDB with the same room and 
         building number as the classroom to be added.
	 *)
	(not(exists (cl' in cldb)((cl'.rm.rn = cl.rm.rn) and (cl'.rm.bn= cl.rm.bn))))

		and

	(* The room and building number fields are not empty. *)
	((cl.rm.rn != nil) and (cl.rm.bn != nil));

  
    postcondition:

	(* The classroom is in the outputted ClassroomDB. *)

 	cldb' = cldb + cl;

  

end NewClassroom;



operation EditClassroom is

    inputs: cldb:ClassroomDB, old_cr:Classroom, new_cr:Classroom;

    outputs: cldb':ClassroomDB;

    description: (* This operation edits a classroom in the classroom database.        

    *);

    precondition: (*None Yet*);


    postcondition:

	(* The classroom is in the outputted ClassroomDB if and only if it is the
     new record to be added or it is in the input db, and it is not the old 
     record.
  *)
     forall (cr':Classroom)
         (cr' in cldb') iff (((cr' = new_cr) or (cr' in cldb)) and
            (cr' != old_cr));
      

end EditClassroom;



operation DeleteClassroom is

    inputs: cldb:ClassroomDB, cl:Classroom;

    outputs: cldb':ClassroomDB;

    description: (* This operation deletes a classroom in the classroom database.        

    *);

    precondition:

	(* The given classroom is in the given ClassroomDB. *)

                 cl in cldb;

    postcondition:

       	 (*
       	  * A classroom is in the output db if and only if it is not the
       	  * existing classroom to be deleted and it is in the input db.
       	  *)

       	 (forall (cl':Classroom)

        	    (cl' in cldb') iff ((cl' != cl) and (cl' in cldb)));

end DeleteClassroom;



operation NewCourse is

    inputs: cdb: CourseDB, course:Course;

    outputs: cdb':CourseDB;

    description: (* This operation adds a course to the course database.        

    *);

    precondition: (* None *);
    
    
    postcondition:

	(* The course is in the outputted CourseDB. *)

        	cdb' = cdb + course;


end NewCourse;



operation EditCourse is

    inputs: cdb: CourseDB, old_cr:Course, new_cr:Course;

    outputs: cdb':CourseDB;

    description: (* This operation edits a course in the course database.        

    *);

    precondition: (*None Yet*);

    postcondition:

	(* The course is in the outputted courseDB. *)

     forall (cr':Course)
         (cr' in cdb') iff (((cr' = new_cr) or (cr' in cdb)) and
            (cr' != old_cr));

end EditCourse;



operation DeleteCourse is

    inputs:cdb: CourseDB, course:Course;

    outputs: cdb':CourseDB;

    description: (* This operation deletes a course in the course database.        

    *);

    precondition:

	(* The given course is in the given courseDB. *)

        	course in cdb;

    postcondition:

       	 (*
        	  * A course is in the output db if and only if it is not the
        	  * existing course to be deleted and it is in the input db.
        	  *)

       	 (forall (course':Course)
           	 (course' in cdb') iff ((course' != course) and (course' in cdb)));

end DeleteCourse;



operation NewInstructor is

    inputs: idb:InstructorDB, instructor:Instructor;

    outputs: idb':InstructorDB;

    description: (* This operation adds a new instructor to the instructor database.        

    *);

     precondition:
	  (* There is no instructor in the InstructorDB with the same id as 
       the instructor to be added.
  	*)

	(not(exists (instructor' in idb)(instructor'.id = instructor.id) ));

	
    postcondition:

	(* The instructor is in the outputted instructorDB. *)

       	 idb' = idb + instructor;


end NewInstructor;



operation EditInstructor is

    inputs: idb:InstructorDB, old_ir:Instructor, new_ir:Instructor;

    outputs: idb':InstructorDB;

    description: (* This operation edits an instructor in the instructor database.        

    *);

     precondition: (*None Yet*);

     postcondition:
	  (* The instructor is in the outputted InstructorDB. *)

     forall (ir':Instructor)
         (ir' in idb') iff (((ir' = new_ir) or (ir' in idb)) and
            (ir' != old_ir));

end EditInstructor;



operation DeleteInstructor is

    inputs: idb:InstructorDB, instructor:Instructor;

    outputs: idb':InstructorDB;

    description: (* This operation deletes an instructor in the instructor database.        

    *);

    precondition:

	(* The given instructor is in the inputted InstructorDB. *)

        	instructor in idb;

    postcondition:

       	 (*
        	  * A instructor is in the output db if and only if it is not the
           * existing instructor to be deleted and it is in the input db.
        	  *)

       	 (forall (instructor':Instructor)
           	 (instructor' in idb') iff ((instructor' != instructor) 
                and (instructor' in idb)));

end DeleteInstructor;



object InstructorCoursePreferenceDB is InstructorCoursePreference*

    description: (* A InstructorCoursePreferenceDB contains zero or more 
                    InstructorCoursePreferences.
    *);

end InstructorCoursePreferenceDB;



object InstructorCoursePreference is

    components:  instr_id:ID and and title:CourseTitle and rating:Rating and 
       tas:InstructorTimeArrangementPreference* and resources:Resource*;

    description: (* Contains an instructor's rating for teaching ability of
                  * a course and a list of ratings for time arrangement
                  * preferences for the course
                  *);
                  
end InstructorCoursePreference;



object InstructorTimeArrangementPreference is
    components:  ta:TimeArrangement, rating:Rating; 
    description: (* Associates an instructor's rating with a given time
                  * arrangement for a course
                  *);
                  
end InstructorTimeArrangementPreference;
    
    
    
object InstructorTimePreferenceDB is InstructorTimePreference*
    description: (* A InstructorTimePreferenceDB contains zero or more 
    InstructorTimePreferences.

    *);

end InstructorTimePreferenceDB;



object InstructorTimePreference is instr_id:ID and availblocks:AvailBlock*

    description: (* Contains a day and time for when an instructor is 
                  * available to work.
                  *);

end InstructorTimePreference;



object AvailBlock is day:Day and open_times:TimeBlock*;



object Rating is integer

    description: (*Rating is an integer form 0 to 5 based on the instructor's 
    likes/dislikes about a course or time.

    *);

end Rating;







--John Azevedo's Section


object CourseView is title:CourseTitle and desc:Description and sections:integer 
                     and is_lec:boolean and is_lab:boolean and units:Units and 
                     wtus:WTUs;



object InstructorView is name:Name and deg:Degree and is_handicap:Handicapped;



object ClassroomView is room:Room and size:Size and loc:Location 
                     and is_handicap:HandicapCapable and is_lab:LabCapable
                     and resources:Resource*;



object ScheduleView is crs:CourseTitle and sec:Section and call_num:CallNum 
                    and is_lec:boolean 
                    and is_lab:boolean and instr_name:Name and days:Days 
                    and start:Time and stop:Time and rm:Room;

                    
                    
operation ViewCourses is
   description: (* Creates a window which lists selected information about 
                 * all courses in the course DB *);
   inputs: cdb:CourseDB;
   outputs: cvl':CourseView*;
   
   precondition: (* none *);
   postcondition: 
   
   forall (cs in cdb)
   (  exists (cv in cvl') 
      (  cs.title = cv.title)
   ) 
   and #cdb = #cvl';
   
end ViewCourses;



operation ViewInstructors is
   description: (* Creates a window which lists selected information about all
                 * the instructors in the instructor DB *);
   inputs: idb:InstructorDB;
   outputs: ivl':InstructorView*;

   precondition: (* none *);
   postcondition: 
   
   forall (inst in idb) 
   (  exists (instv in ivl') 
      (  inst.name = instv.name)
   )
   and #idb = #ivl';
   
end ViewCourses; 



operation ViewClassrooms is
   description: (* Creates a window which lists selected information about all
                 * the classrooms in the classrooms DB *);
   inputs: crdb:ClassroomDB;
   outputs: crvl':ClassroomView*;

   precondition: (* none *);
   postcondition: 
   
   forall (cr in crdb) 
   (  exists (crv in crvl')
      (  cr.rm = crv.room) 
   )
   and #crdb = #crvl';
   
end ViewCourses;



operation ViewSchedule is
   description: (* Creates a window which lists selected information about all
                 * the scheduleRecords in the schedule DB *);
   inputs: sdb:ScheduleDB;
   outputs: svl':ScheduleView*;
   
   precondition: (* none *);
   postcondition: 
   
   forall (sch in sdb) 
   (  exists (schv in svl')
      (  sch.call_num = schv.call_num)
   )
   and #sdb = #svl';
   
end ViewCourses; 



operation AddInstructorCoursePreference is
   inputs: InstrCrsPref:InstructorCoursePreference, 
           CPDB:InstructorCoursePreferenceDB, InstDB:InstructorDB, 
           CrseDB:CourseDB;
   outputs: CPDB':InstructorCoursePreferenceDB;
   description: (* Add a new InstructorCoursePreference to the 
                   InstructorCoursePreferenceDB. This is done by the admins 
                   and for each instructor in the InstructorDB, there are as 
                   many InstructorCoursePreferences as there are courses. So a 
                   complete InstuctorCoursePreferenceDB has 
                   (size of the InstructorDB) x (size fo the CourseDB) 
                   number of entries. *);
   precondition:
      exists (Instr in InstDB) (Instr.id = InstrCrsPref.instr_id) and
      exists (Crs in CrseDB) (Crs.title = InstrCrsPref.title) and
      not (exists(Pref in CPDB) (Pref.instr_id = InstrCrsPref.instr_id and 
      Pref.title = InstrCrsPref.title));
   postcondition: CPDB' = CPDB + InstrCrsPref;
end AddInstructorCoursePreference;



operation EditInstructorCoursePreference is
   inputs: CPDB:InstructorCoursePreferenceDB, old_CP:InstructorCoursePreference, 
           new_CP:InstructorCoursePreference;
   outputs: CPDB':InstructorCoursePreferenceDB;
   description:(* Edit an InstructorCoursePerference already in the 
                  InstructorCoursePreferenceDB. Inputs the DB, the old 
                  preference, and the new Preference. Outputs the new DB. *);
   precondition: new_CP.instr_id = old_CP.instr_id 
                  and new_CP.title = old_CP.title
                  and old_CP in CPDB;
   postcondition: forall (p':InstructorCoursePreference) (p' in CPDB') 
                   iff (((p' = new_CP) or (p' in CPDB)) and (p' != old_CP));
end EditInstructorCoursePreference;



operation AddInstructorTimePreference is
   inputs: InstDB:InstructorDB, InstrTimePref:InstructorTimePreference, 
           IPDB:InstructorTimePreferenceDB;
   outputs: IPDB':InstructorTimePreferenceDB;
   description: (* Add a new InstructorTimePreference to the 
                   InstructorTimePreferenceDB. This is done by the admins and 
                   for each instructor in the InstructorDB, there are as many 
                   InstructorTimePreferences as there are instructors. *);
   precondition:
      exists (Instr in InstDB) (Instr.id = InstrTimePref.instr_id) and  
      not (exists(Pref in IPDB) (Pref.instr_id = InstrTimePref.instr_id));
   postcondition: IPDB' = IPDB + InstrTimePref;
end AddInstructorTimePreference;



operation EditInstructorTimePreference is
   inputs: IPDB:InstructorTimePreferenceDB, old_IP:InstructorTimePreference, 
           new_IP:InstructorTimePreference;
   outputs: IPDB':InstructorTimePreferenceDB;
   description:(* Edit an InstructorTimePerference already in the 
                  InstructorTimePreferenceDB. Inputs the DB, the old 
                  preference, and the new Preference. Outputs the new DB.*);
   precondition: 
      new_IP.instr_id = old_IP.instr_id 
      and old_IP in IPDB;
   postcondition: 
      forall (p':InstructorTimePreference) 
        (p' in IPDB') iff (((p' = new_IP) or (p' in IPDB)) and (p' != old_IP));
end EditInstructorTimePreference;


--end John Azevedo's Section

end Databases;

 


Prev: edit rsl | Next: schedule rsl | Up: spec | Top: index