Caso tienda de vídeos con la biblioteca ER+Z Aplicación de la Biblioteca de esquemas genéricos Z para especificación basada en diagramas Entidad-Relación Ignacio Trejos Zelaya, Escuela de Computación, Instituto Tecnológico de Costa Rica Notas: La biblioteca ER+Z está ahora en un archivo separado. No puede usar diacríticos (vocales tildadas, diéresis, eñe) en los nombres de variables y esquemas en el texto formal en Z. No debe usar diacríticos en los nombres de los archivos. Contenido Caso de la tienda de vídeos ........................................................................................................................................................................... 2 Definición de entidades y asociaciones ................................................................................................................................................... 2 Vídeos ................................................................................................................................................................................................ 2 Copias ................................................................................................................................................................................................ 2 Catálogo ............................................................................................................................................................................................. 3 Usuarios ............................................................................................................................................................................................. 3 Alquiler .............................................................................................................................................................................................. 4 Bandas................................................................................................................................................................................................ 5 Video-Banda ...................................................................................................................................................................................... 5 Precio (relación derivada price) ......................................................................................................................................................... 6 Variables globales ................................................................................................................................................................................... 6 Fecha actual ....................................................................................................................................................................................... 6 Restricciones ........................................................................................................................................................................................... 6 Usuario puede alquilar video (edad, calificación de censura) ............................................................................................................. 6 Estado (de información) del Sistema ....................................................................................................................................................... 7 Operaciones ............................................................................................................................................................................................. 7 Mensajes para reportar error o éxito en operaciones .......................................................................................................................... 7 Reporte de operaciones exitosas......................................................................................................................................................... 8 Operaciones sobre fechas ................................................................................................................................................................... 8 Marco de operaciones que afectan vídeos .......................................................................................................................................... 9 Operación AddVideo .......................................................................................................................................................................... 9 Operación RemoveVideo .................................................................................................................................................................. 10 Operación ChangeVideoBand .......................................................................................................................................................... 11 Marco de operaciones que afectan copias......................................................................................................................................... 11 Operación AddCopy ......................................................................................................................................................................... 12 Operación RemoveCopy ................................................................................................................................................................... 12 Marco de operaciones que afectan alquileres ................................................................................................................................... 14 Operación Hire................................................................................................................................................................................. 14 Operación Return ............................................................................................................................................................................. 16 Transcripción de operaciones de consulta en caso original .................................................................................................................... 17 1 Caso de la tienda de vídeos Para facilitar la comprensión de la biblioteca ER+Z, ilustramos el uso de la biblioteca con referencia al caso Structuring a Video Shop de Barden et al., estudiado en clase. No incluimos los gráficos ni la motivación, sino principalmente el modelo en Z. Hemos procurado mantener los nombres lo más cerca posible de los que aparecen en el original. Además, hemos definido varias operaciones que no están en el original y algunas licencias artísticas (cambios en los requerimientos), para ilustrar aplicaciones posibles de la biblioteca ER+Z. Definición de entidades y asociaciones Vídeos Definimos el tipo Video1. [SUBJECT, TITLE] CERT ::= exempt | uCert | pg | twelve | fifteen | eighteen Video title : TITLE subject : SUBJECT cert : CERT Cada video tiene su propia identidad. [Id_Video] Definimos su conjunto de instancias así: E_Video ≙ Insta_Entidad[Id_Video, Video] [id_video / ident, info_video / info] Copias Definimos el tipo Id_Copy de los identificadores de copias. 1 Procuramos mantener algunos nombres del caso original. Por ejemplo, el esquema se llamará Video, no Info_Video. 2 [Id_Copy] Las copias (ejemplares) no tienen atributos descriptivos, por lo que usamos el esquema Info_Nula. E_Copy ≙ Insta_Entidad[Id_Copy, Info_Nula] [id_copy / ident, info_copy / info] Catálogo Definimos la asociación Catalogue. En esta asociación, cada copia participa obligatoriamente una vez, pero los vídeos participan opcionalmente (0) o varias veces2. A_Catalogue ≙ AP_11_0N[Id_Copy, Id_Video] [id_copy / ident1, id_video / ident2, catalogue / asoc] Usuarios Pasamos a definir los usuarios. Cada usuario tiene una identidad. [Id_User] Definimos los atributos de cada usuario. [NAME, ADDRESS, DATE] User name : NAME dob : DATE address : ADDRESS Consultar fecha de nacimiento de un usuario. Esta es solo una interfaz de tipos. 2 Esta cardinalidad difiere de la especificada en el original de Barden et al. 3 dobUser : User → DATE Esta especifica la ‘lógica’ de la función: dobUserAlt : User → DATE dobUserAlt = (λ u:User ⦁ u.dob) Tratamos las fechas igual que en el caso original. age == ℕ ageToday : DATE × DATE → age Tenemos dos tipos de usuario, staff y member. User_type ::= staff | member Gender ::= female | male | undeclared Con todos los elementos, definimos la entidad User. E_User ≙ Insta_Etiquetada[Id_User, User, User_type] [id_user / ident, info_user / info, user_type / etiq] ∧ Insta_Etiquetada[Id_User, User, Gender] [id_user / ident, info_user / info, user_gender / etiq] Usamos el color para resaltar. Note que estamos haciendo dos instanciaciones del esquema genérico Insta_Etiquetada. En la primera línea se crea una partición etiquetando las instancias con valores de tipo User_type. En la segunda línea, como parte de la conjunción de esquemas, se etiqueta con base en Gender. Nótese que el esquema resultante tendrá cuatro variables: id_user, info_user, user_type, user_gender. Alquiler Para ilustrar las asociaciones con atributos, supongamos que, al alquilar una copia de un video, requerimos registrar la fecha máxima en que esta debe ser devuelta. Añadimos a la asociación de alquiler, hired, un atributo de fecha de vencimiento, due_date. Info_Hired due_date : DATE 4 En la asociación de alquiler la copia participa a lo sumo una vez (01), mientras que el usuario participa 0 o muchas veces (0N). A_Hired ≙ ∧ AP_01_0N[Id_Copy, Id_User] [id_copy / ident1, id_user / ident2, hired / asoc] AP_atributos[Id_Copy, Id_User, Info_Hired] [id_copy / ident1, id_user / ident2, hired / asoc, due / info] Observe que por un lado describimos la cardinalidad (AP_01_0N) y por otro estamos diciendo que la asociación tiene atributos descriptivos (AP_atributos). Esto es, a cada par (id_copia, id_usuario) se asocia información del alquiler (la fecha de vencimiento, que está encerrada en el esquema Info_Hired). Las asociaciones con atributos se comportan a la vez como asociaciones (relaciones binarias entre conjuntos de identificadores) y como entidades con atributos (cada par de identificadores vinculados en la asociación identifica unívocamente a datos que les corresponden por el hecho de estar asociados). Bandas Definimos un conjunto dado de bandas, por sus identificadores. [Id_Band] Especificaremos los precios como un número natural (esto difiere del original): PRICE == ℕ Cambiamos el caso original: en lugar de tener otra entidad para los precios, más bien ponemos el precio como atributo (descriptivo) de la banda. Info_Band theprice : PRICE Definimos su conjunto de instancias así: E_Band ≙ Insta_Entidad[Id_Band, Info_Band] [id_band / ident, info_band / info] Video-Banda En una asociación entre un vídeo y una banda, el vídeo participa necesariamente en una (y solo una) banda, mientras que la banda tiene 0 o más vídeos asociados. 5 A_Video_Band ≙ AP_11_0N[Id_Video, Id_Band] [id_video / ident1, id_band / ident2, video_band / asoc] Precio (relación derivada price) En esta especificación, al poner theprice como atributo de Band, ya no es necesario mantener la asociación bandPrice. De ahí que procedamos a definir directamente la función price3. VideoPrice E_Video E_Band A_Video_Band price : Id_Video ⇸ PRICE price = ( λ v : id_video ⦁ (info_band (video_band (v))).theprice ) Observe que los invariantes aseguran que si v ∈ id_video (lo declaramos v : id_video en la expresión λ), este participa obligatoriamente en video_band, por lo que se garantiza su imagen (una banda) y, a su vez, el acceso a la tupla que contiene al campo theprice. Variables globales Fecha actual Mantendremos en un esquema las variables globales. Solo hay una en el caso original: la fecha actual. Current_date today : DATE Restricciones Usuario puede alquilar video (edad, calificación de censura) En esta restricción están involucrados usuarios, copias, vídeos y la relación de alquiler. Hacemos los ajustes necesarios para el modelo revisado. 3 En el original price era la composición de dos funciones. 6 MayHire E_Copy E_Video A_Catalogue E_User A_Hired Current_date _ mayHire _ : Id_User ↔ Id_Video ( _ mayHire _) = { u: id_user; v : ran catalogue; a : age | a = ageToday (today, (info_user u).dob) ∧ ( a ≥ 18 ∨ (info_video v).cert ∈ {exempt, uCert, pg } ∨ (a ≥ 12 ∧ (info_video v).cert = twelve) ∨ (a ≥ 15 ∧ (info_video v).cert = fifteen) ) ⦁u↦v} ( ∀ c: dom hired ⦁ (hired c) mayHire (catalogue c) ) Estado (de información) del Sistema Casi todas las variables de interés ya estaban mencionadas en el esquema MayHire que aparece arriba. Solo falta lo referente a bandas de precio, incluimos esos esquemas junto con MayHire. VideoShop E_Band A_Video_Band VideoPrice MayHire Operaciones Mensajes para reportar error o éxito en operaciones 7 REPORT ::= ok | notStaff | notUser | alreadyHired | notInStock | tooYoung | knownVideo | unknownBand | unknownVideo | videoHasCopies | knownCopy | unknownCopy | copyIsHired | notHired Reporte de operaciones exitosas4 Success ≙ [ report! : REPORT | report! = ok ] Operaciones sobre fechas ΔVideoShopToday ≙ ΞVideoShop ⧹ (today, today′) ∧ ΔVideoShop TodayUpdateOK ΔVideoShopToday d? : DATE d? = today′ Esta operación no falla. TodayUpdate ≙ TodayUpdateOK ∧ Success 4 Esto no está así en el original. Seguimos una buena práctica de los especificadores en Z. 8 Marco de operaciones que afectan vídeos Las operaciones que añaden o eliminan vídeos, o que los cambian de banda, no afectan a los usuarios, ni al alquiler, ni a las bandas ni a la fecha actual. ΔVideoShopVideo ≙ [ ΔVideoShop; ΞE_User; ΞE_Copy; ΞA_Hired; ΞE_Band; ΞCurrent_date; ΞA_Catalogue ] Operación AddVideo A diferencia del caso del libro, en esta especificación podremos ingresar vídeos sin que tenga copias asociadas. Para un nuevo vídeo es necesario asociarle una banda pre-existente. AddVideoOK ΔVideoShopVideo v? : Id_Video iv? : Video b? : Id_Band v? ∉ id_video b? ∈ id_band id_video′ = id_video ∪ { v? } info_video′ = info_video ∪ { v? ↦ iv? } video_band′ = video_band ∪ { v? ↦ b? } Casos de error de AddVideo Un caso de error es que el vídeo ya esté en la tienda. KnownVideo ΞVideoShop v? : Id_Video report! : REPORT v? ∈ id_video report! = knownVideo Otro error es que la banda sea desconocida. 9 UnknownBand ΞVideoShop b? : Id_Band report! : REPORT b? ∉ id_band report! = unknownBand Operación AddVideo total AddVideo ≙ ( AddVideoOK ∧ Success ) ∨ KnownVideo ∨ UnknownBand Operación RemoveVideo Para eliminar un vídeo, supondremos que no tiene copias asociadas. RemoveVideoOK ΔVideoShopVideo v? : Id_Video v? ∈ id_video catalogue ▷ { v? } = ∅ id_video′ = id_video ∖ { v? } info_video′ = { v? } ⩤ info_video video_band′ = { v? } ⩤ video_band Casos de error de RemoveVideo Un caso de error es que el vídeo no sea conocido. UnknownVideo ΞVideoShop v? : Id_Video report! : REPORT v? ∉ id_video report! = unknownVideo Otro error es que el vídeo tenga copias asociadas. 10 VideoHasCopies ΞVideoShop v? : Id_Video report! : REPORT v? ∈ id_video catalogue ▷ { v? } ≠ ∅ report! = videoHasCopies Operación RemoveVideo total RemoveVideo ≙ ( RemoveVideoOK ∧ Success ) ∨ UnknownVideo ∨ VideoHasCopies Operación ChangeVideoBand Para cambiar un vídeo de una banda a otra solo es necesario que la nueva banda exista y establecer la nueva asociación. ChangeVideoBandOK ΔVideoShopVideo v? : Id_Video b? : Id_Band v? ∈ id_video b? ∈ id_band video_band′ = video_band ⊕ { v? ↦ b? } Casos de error de ChangeVideoBand Un caso de error es que el vídeo no sea conocido. Este ya fue especificado arriba en UnknownVideo. Otro error es que la banda sea desconocida. Esto ya fue especificado en UnknownBand. Operación ChangeVideoBand total ChangeVideoBand ≙ (ChangeVideoBandOK ∧ Success ) ∨ UnknownVideo ∨ UnknownBand Marco de operaciones que afectan copias El marco de las operaciones de agregar y eliminar copias difiere un poco del caso original. 11 ΔVideoShopCopy ≙ ΞVideoShop ⧹ (id_copy, id_copy′, info_copy, info_copy′, catalogue, catalogue′) ∧ ΔVideoShop Operación AddCopy Para agregar una copia, es necesario que exista el vídeo con el que se la asociará. AddCopyOK ΔVideoShopCopy c? : Id_Copy v? : Id_Video c? ∉ id_copy v? ∈ id_video id_copy′ = id_copy ∪ { c? } info_copy′ = info_copy ∪ { c? ↦ info_nula } catalogue′ = catalogue ∪ { c? ↦ v? } Casos de error de AddCopy Un caso de error es que la copia ya esté en la tienda. KnownCopy ΞVideoShop c? : Id_Copy report! : REPORT c? ∈ id_copy report! = knownCopy Otro error es que el vídeo sea desconocido, que es el esquema UnknownVideo descrito arriba. Operación AddCopy total AddCopy ≙ ( AddCopyOK ∧ Success ) ∨ KnownCopy ∨ UnknownVideo Operación RemoveCopy 12 Para eliminar una copia, supondremos que no está alquilada. RemoveCopyOK ΔVideoShopCopy c? : Id_Copy c? ∈ id_copy hired ⦇{ c? }⦈ = ∅ id_copy′ = id_copy ∖ { c? } info_copy′ = { c? } ⩤ info_copy catalogue′ = { c? } ⩤ catalogue Casos de error de RemoveCopy Un caso de error es que la copia no sea conocida por el sistema. UnknownCopy ΞVideoShop c? : Id_Copy report! : REPORT c? ∉ id_copy report! = unknownCopy Otro error es que esté alquilada. CopyIsHired ΞVideoShop c? : Id_Copy report! : REPORT c? ∈ id_copy hired ⦇{ c? }⦈ ≠ ∅ report! = copyIsHired Operación RemoveCopy total RemoveCopy ≙ ( RemoveCopyOK ∧ Success ) ∨ UnknownVideo ∨ VideoHasCopies 13 Marco de operaciones que afectan alquileres El marco de las operaciones de préstamo y devolución de copias es como en el caso original. ΔVideoShopHire ≙ ΞVideoShop ⧹ (hired, hired′, due, due′) ∧ ΔVideoShop Operación Hire A la operación de alquiler le añadimos una fecha de vencimiento (devolución). HireOK ΔVideoShopHire s?, u? : Id_User c? : Id_Copy d? : DATE price! : PRICE s? ∈ id_user user_type (s?) = staff u? ∈ id_user c? ∈ id_copy c? ∉ dom hired u? mayHire catalogue c? hired′ = hired ∪ { c? ↦ u? } due′ = due ∪ { (c? , u?) ↦ ( μ Info_Hired | due_date = d? ) } price! = price (catalogue c?) Casos de error NotStaff ΞVideoShop s? : Id_User report! : REPORT s? ∈ id_user user_type (s?) ≠ staff report! = notStaff 14 NotUser ΞVideoShop u? : Id_User report! : REPORT u? ∉ id_user report! = notUser AlreadyHired ΞVideoShop c? : Id_Copy report! : REPORT c? ∈ dom hired report! = alreadyHired NotInStock ΞVideoShop c? : Id_Copy report! : REPORT c? ∉ id_copy report! = notInStock TooYoung ΞVideoShop u? : Id_User c? : Id_Copy report! : REPORT ¬ (u? mayHire catalogue c?) report! = tooYoung Operación Hire total 15 Hire ≙ ( HireOK ∧ Success ) ∨ NotStaff ∨ NotUser ∨ AlreadyHired ∨ NotInStock ∨ TooYoung Operación Return ReturnOK ΔVideoShopHire c? : Id_Copy c? ∈ id_copy c? ∈ dom hired hired′ = { c? } ⩤ hired due′ = { (c?, (hired c?) ) } ⩤ due Observe que en esta operación nos hemos valido de la asociación hired para determinar el usuario con el cual está relacionada la copia c? que se está devolviendo. Es por esto que podemos quitar el par (c?, (hired c?) ) de la asociación due. Casos de error El caso NotInStock ya fue especificado arriba y lo reutilizamos abajo. NotHired ΞVideoShop c? : Id_Copy report! : REPORT c? ∉ dom hired report! = notHired Operación Return total Return ≙ ( ReturnOK ∧ Success ) ∨ NotInStock ∨ NotHired 16 Transcripción de operaciones de consulta del caso original A continuación transcribimos cuatro operaciones de consulta que aparecen al final del capítulo 11 de Barden et al. listByCertificate == ( λ VideoShop; c : CERT ⦁ { iv : id_video; Video | θVideo = info_video(iv) ∧ c = cert ⦁ title } ) Esta operación puede hacerse como un esquema. Primero hay una transcripción directa. Luego otra más parecida a la que aparece en nuestro listByCertificate de arriba. ListByCertificate0 ΞVideoShop c? : CERT list! : ℙ TITLE list! = { iv : id_video | c? = (info_video iv).cert ⦁ (info_video iv).title } En esta segunda versión usamos θVideo para ‘atrapar’ la tupla de tipo-esquema Video que está asociada a iv (un identificador de vídeo) y que contiene los atributos descriptivos. Note que los atributos definidos en Video están disponibles en el alcance de la comprensión de conjunto. ListByCertificate1 ΞVideoShop c? : CERT list! : ℙ TITLE list! = { iv : id_video; Video | θVideo = info_video(iv) ∧ c? = cert ⦁ title } Acá están las demás operaciones, transcritas a nuestra nueva representación. listByCategory == ( λ VideoShop; s : SUBJECT ⦁ { iv : id_video; Video | θVideo = info_video(iv) ∧ s = subject ⦁ title } ) howManyCopies == ( λ VideoShop; iv : Id_Video ⦁ #(catalogue ▷ {iv}) ) 17 whatCopies == ( λ VideoShop; iv : Id_Video ⦁ dom(catalogue ▷ {iv}) ) Queda como ejercicio para el lector hacer operaciones equivalentes a estas tres anteriores, pero en versión de esquema. 18