| | 1 | **DDL** |
| | 2 | |
| | 3 | |
| | 4 | Enums |
| | 5 | |
| | 6 | {{{ |
| | 7 | CREATE TYPE GENDER AS ENUM ('male', 'female', 'other'); |
| | 8 | CREATE TYPE COVER AS ENUM ('hardcover', 'paperback', 'ebook'); |
| | 9 | }}} |
| | 10 | |
| | 11 | Location |
| | 12 | {{{ |
| | 13 | CREATE TABLE Location ( |
| | 14 | id BIGSERIAL PRIMARY KEY, |
| | 15 | address VARCHAR(128) NOT NULL, |
| | 16 | city VARCHAR(128) NOT NULL |
| | 17 | ); |
| | 18 | }}} |
| | 19 | |
| | 20 | Library |
| | 21 | {{{ |
| | 22 | CREATE TABLE Library ( |
| | 23 | id BIGSERIAL PRIMARY KEY, |
| | 24 | name VARCHAR(64) NOT NULL, |
| | 25 | location_id BIGINT, |
| | 26 | CONSTRAINT FKLibrary_Location FOREIGN KEY (location_id) |
| | 27 | REFERENCES Location(id) |
| | 28 | ON DELETE SET NULL ON UPDATE CASCADE |
| | 29 | ); |
| | 30 | }}} |
| | 31 | |
| | 32 | User |
| | 33 | {{{ |
| | 34 | CREATE TABLE "User" ( |
| | 35 | id BIGSERIAL PRIMARY KEY, |
| | 36 | first_name VARCHAR(128) NOT NULL DEFAULT '[deleted_user]', |
| | 37 | last_name VARCHAR(128) NOT NULL DEFAULT '[deleted_user]', |
| | 38 | password VARCHAR(255) NOT NULL DEFAULT '[deleted]', |
| | 39 | email VARCHAR(128) NOT NULL DEFAULT '[deleted_user@example.com]', |
| | 40 | date_of_birth DATE, |
| | 41 | verified BOOLEAN, |
| | 42 | gender GENDER DEFAULT 'other', |
| | 43 | deleted BOOLEAN NOT NULL DEFAULT FALSE, |
| | 44 | deleted_at TIMESTAMP, |
| | 45 | created_at TIMESTAMP NOT NULL DEFAULT now(), |
| | 46 | updated_at TIMESTAMP NOT NULL DEFAULT now(), |
| | 47 | CONSTRAINT chk_user_dob CHECK (date_of_birth <= CURRENT_DATE), |
| | 48 | CONSTRAINT chk_user_email CHECK (email LIKE '%@%') |
| | 49 | ); |
| | 50 | }}} |
| | 51 | |
| | 52 | Employee |
| | 53 | {{{ |
| | 54 | CREATE TABLE Employee ( |
| | 55 | id BIGINT PRIMARY KEY, |
| | 56 | start_date TIMESTAMP NOT NULL, |
| | 57 | salary NUMERIC NOT NULL, |
| | 58 | manager_id BIGINT, |
| | 59 | library_id BIGINT NOT NULL, |
| | 60 | CONSTRAINT FKEmployee_User FOREIGN KEY (id) |
| | 61 | REFERENCES "User"(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 62 | CONSTRAINT FKEmployee_Manager FOREIGN KEY (manager_id) |
| | 63 | REFERENCES Employee(id) ON DELETE SET NULL ON UPDATE CASCADE, |
| | 64 | CONSTRAINT FKEmployee_Library FOREIGN KEY (library_id) |
| | 65 | REFERENCES Library(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 66 | CONSTRAINT chk_employee_salary CHECK (salary > 0) |
| | 67 | ); |
| | 68 | }}} |
| | 69 | |
| | 70 | MembershipPlan |
| | 71 | {{{ |
| | 72 | CREATE TABLE MembershipPlan ( |
| | 73 | id BIGSERIAL PRIMARY KEY, |
| | 74 | name VARCHAR(64) NOT NULL, |
| | 75 | max_rent_period_days INT4 NOT NULL, |
| | 76 | max_concurrent_rentals INT4 NOT NULL, |
| | 77 | price NUMERIC(8, 2) NOT NULL, |
| | 78 | duration_days INT NOT NULL, |
| | 79 | CONSTRAINT chk_plan_limits CHECK (max_rent_period_days > 0 AND max_concurrent_rentals > 0 AND duration_days > 0), |
| | 80 | CONSTRAINT chk_plan_price CHECK (price >= 0) |
| | 81 | ); |
| | 82 | }}} |
| | 83 | |
| | 84 | Membership |
| | 85 | {{{ |
| | 86 | CREATE TABLE Membership ( |
| | 87 | id BIGSERIAL PRIMARY KEY, |
| | 88 | user_id BIGINT NOT NULL, |
| | 89 | membership_plan_id BIGINT, |
| | 90 | started_at TIMESTAMP NOT NULL, |
| | 91 | expires_at TIMESTAMP NOT NULL, |
| | 92 | cancelled_at TIMESTAMP, |
| | 93 | created_at TIMESTAMP NOT NULL, |
| | 94 | CONSTRAINT FKMembership_User FOREIGN KEY (user_id) |
| | 95 | REFERENCES "User"(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 96 | CONSTRAINT FKMembership_Plan FOREIGN KEY (membership_plan_id) |
| | 97 | REFERENCES MembershipPlan(id) ON DELETE SET NULL ON UPDATE CASCADE, |
| | 98 | CONSTRAINT chk_membership_dates CHECK (expires_at > started_at), |
| | 99 | CONSTRAINT chk_membership_cancelled CHECK (cancelled_at >= started_at) |
| | 100 | ); |
| | 101 | }}} |
| | 102 | |
| | 103 | AttributeType |
| | 104 | {{{ |
| | 105 | CREATE TABLE AttributeType ( |
| | 106 | id BIGSERIAL PRIMARY KEY, |
| | 107 | name VARCHAR(64) NOT NULL |
| | 108 | ); |
| | 109 | }}} |
| | 110 | |
| | 111 | AttributeValue |
| | 112 | {{{ |
| | 113 | CREATE TABLE AttributeValue ( |
| | 114 | id BIGSERIAL PRIMARY KEY, |
| | 115 | value VARCHAR(64) NOT NULL |
| | 116 | ); |
| | 117 | }}} |
| | 118 | |
| | 119 | AttributePair |
| | 120 | {{{ |
| | 121 | CREATE TABLE AttributePair ( |
| | 122 | id BIGSERIAL PRIMARY KEY, |
| | 123 | type_id BIGINT NOT NULL, |
| | 124 | value_id BIGINT NOT NULL, |
| | 125 | CONSTRAINT FKAttributePair_Type FOREIGN KEY (type_id) |
| | 126 | REFERENCES AttributeType(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 127 | CONSTRAINT FKAttributePair_Value FOREIGN KEY (value_id) |
| | 128 | REFERENCES AttributeValue(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 129 | ); |
| | 130 | }}} |
| | 131 | |
| | 132 | ResourceType |
| | 133 | {{{ |
| | 134 | CREATE TABLE ResourceType ( |
| | 135 | id BIGSERIAL PRIMARY KEY, |
| | 136 | name VARCHAR(64) NOT NULL |
| | 137 | ); |
| | 138 | }}} |
| | 139 | |
| | 140 | Genre |
| | 141 | {{{ |
| | 142 | CREATE TABLE Genre ( |
| | 143 | id BIGSERIAL PRIMARY KEY, |
| | 144 | name VARCHAR(64) NOT NULL |
| | 145 | ); |
| | 146 | }}} |
| | 147 | |
| | 148 | Resource |
| | 149 | {{{ |
| | 150 | CREATE TABLE Resource ( |
| | 151 | id BIGSERIAL PRIMARY KEY, |
| | 152 | title VARCHAR(256) NOT NULL, |
| | 153 | description TEXT , |
| | 154 | resource_type_id BIGINT NOT NULL, |
| | 155 | CONSTRAINT FKResource_Type FOREIGN KEY (resource_type_id) |
| | 156 | REFERENCES ResourceType(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 157 | ); |
| | 158 | }}} |
| | 159 | |
| | 160 | Edition |
| | 161 | {{{ |
| | 162 | CREATE TABLE Edition ( |
| | 163 | isbn VARCHAR(20) PRIMARY KEY, |
| | 164 | name VARCHAR(512) NOT NULL, |
| | 165 | resource_id BIGINT NOT NULL, |
| | 166 | publisher VARCHAR(128) NOT NULL, |
| | 167 | publish_year INT4 NOT NULL, |
| | 168 | format VARCHAR(32) NOT NULL, |
| | 169 | language VARCHAR(32) NOT NULL, |
| | 170 | num_pages INT NOT NULL, |
| | 171 | cover_type COVER NOT NULL DEFAULT 'paperback', |
| | 172 | CONSTRAINT FKEdition_Resource FOREIGN KEY (resource_id) |
| | 173 | REFERENCES Resource(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 174 | CONSTRAINT chk_publish_year CHECK (publish_year <= EXTRACT(YEAR FROM CURRENT_DATE)) |
| | 175 | ); |
| | 176 | }}} |
| | 177 | |
| | 178 | ResourceCopy |
| | 179 | {{{ |
| | 180 | CREATE TABLE ResourceCopy ( |
| | 181 | id BIGSERIAL PRIMARY KEY, |
| | 182 | edition_isbn VARCHAR(20) NOT NULL, |
| | 183 | library_id BIGINT NOT NULL, |
| | 184 | status INT4 NOT NULL, |
| | 185 | barcode VARCHAR(64) NOT NULL, |
| | 186 | created_at TIMESTAMP NOT NULL, |
| | 187 | updated_at TIMESTAMP NOT NULL, |
| | 188 | CONSTRAINT FKResourceCopy_Edition FOREIGN KEY (edition_isbn) |
| | 189 | REFERENCES Edition(isbn) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 190 | CONSTRAINT FKResourceCopy_Library FOREIGN KEY (library_id) |
| | 191 | REFERENCES Library(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 192 | CONSTRAINT chk_copy_status CHECK (status IN (1,2,3,4)) |
| | 193 | ); |
| | 194 | }}} |
| | 195 | |
| | 196 | Rental |
| | 197 | {{{ |
| | 198 | CREATE TABLE Rental ( |
| | 199 | id BIGSERIAL PRIMARY KEY, |
| | 200 | resource_copy_id BIGINT NOT NULL, |
| | 201 | rented_at TIMESTAMP NOT NULL, |
| | 202 | due_at TIMESTAMP NOT NULL, |
| | 203 | returned_at TIMESTAMP, |
| | 204 | membership_id BIGINT NOT NULL, |
| | 205 | penalty NUMERIC(19, 0), |
| | 206 | employee_id BIGINT, |
| | 207 | CONSTRAINT FKRental_Copy FOREIGN KEY (resource_copy_id) |
| | 208 | REFERENCES ResourceCopy(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 209 | CONSTRAINT FKRental_Membership FOREIGN KEY (membership_id) |
| | 210 | REFERENCES Membership(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 211 | CONSTRAINT FKRental_Employee FOREIGN KEY (employee_id) |
| | 212 | REFERENCES Employee(id) ON DELETE SET NULL ON UPDATE CASCADE, |
| | 213 | CONSTRAINT chk_rental_due_date CHECK (due_at > rented_at), |
| | 214 | CONSTRAINT chk_rental_returned_date CHECK (returned_at >= rented_at), |
| | 215 | CONSTRAINT chk_rental_penalty CHECK (penalty >= 0) |
| | 216 | ); |
| | 217 | }}} |
| | 218 | |
| | 219 | EventType |
| | 220 | {{{ |
| | 221 | CREATE TABLE EventType ( |
| | 222 | id BIGSERIAL PRIMARY KEY, |
| | 223 | name VARCHAR(128) NOT NULL |
| | 224 | ); |
| | 225 | }}} |
| | 226 | |
| | 227 | Room |
| | 228 | {{{ |
| | 229 | CREATE TABLE Room ( |
| | 230 | id BIGSERIAL PRIMARY KEY, |
| | 231 | name VARCHAR(128), |
| | 232 | library_id BIGINT NOT NULL, |
| | 233 | CONSTRAINT FKRoom_Library FOREIGN KEY (library_id) |
| | 234 | REFERENCES Library(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 235 | ); |
| | 236 | }}} |
| | 237 | |
| | 238 | Event |
| | 239 | {{{ |
| | 240 | CREATE TABLE Event ( |
| | 241 | id BIGSERIAL PRIMARY KEY, |
| | 242 | name VARCHAR(128) NOT NULL, |
| | 243 | description TEXT NOT NULL, |
| | 244 | library_id BIGINT NOT NULL, |
| | 245 | event_type_id BIGINT NOT NULL, |
| | 246 | capacity INT4 NOT NULL, |
| | 247 | start_time TIMESTAMP NOT NULL, |
| | 248 | duration INT4 NOT NULL, |
| | 249 | event_room_id BIGINT NOT NULL, |
| | 250 | CONSTRAINT FKEvent_Type FOREIGN KEY (event_type_id) |
| | 251 | REFERENCES EventType(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 252 | CONSTRAINT FKEvent_Library FOREIGN KEY (library_id) |
| | 253 | REFERENCES Library(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 254 | CONSTRAINT FKEvent_Room FOREIGN KEY (event_room_id) |
| | 255 | REFERENCES Room(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 256 | CONSTRAINT chk_event_capacity CHECK (capacity > 0), |
| | 257 | CONSTRAINT chk_event_duration CHECK (duration > 0) |
| | 258 | ); |
| | 259 | }}} |
| | 260 | |
| | 261 | EventRegistration |
| | 262 | {{{ |
| | 263 | CREATE TABLE EventRegistration ( |
| | 264 | id BIGSERIAL PRIMARY KEY, |
| | 265 | user_id BIGINT NOT NULL, |
| | 266 | event_id BIGINT NOT NULL, |
| | 267 | registered_at TIMESTAMP NOT NULL, |
| | 268 | CONSTRAINT FKEventReg_User FOREIGN KEY (user_id) |
| | 269 | REFERENCES "User"(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 270 | CONSTRAINT FKEventReg_Event FOREIGN KEY (event_id) |
| | 271 | REFERENCES Event(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 272 | ); |
| | 273 | }}} |
| | 274 | |
| | 275 | Review |
| | 276 | {{{ |
| | 277 | CREATE TABLE Review ( |
| | 278 | id BIGSERIAL PRIMARY KEY, |
| | 279 | user_id BIGINT NOT NULL, |
| | 280 | resource_edition_isbn VARCHAR(20) NOT NULL, |
| | 281 | rating INT4 NOT NULL, |
| | 282 | review_text TEXT NOT NULL, |
| | 283 | created_at TIMESTAMP NOT NULL, |
| | 284 | updated_at TIMESTAMP NOT NULL, |
| | 285 | CONSTRAINT FKReview_User FOREIGN KEY (user_id) |
| | 286 | REFERENCES "User"(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 287 | CONSTRAINT FKReview_Edition FOREIGN KEY (resource_edition_isbn) |
| | 288 | REFERENCES Edition(isbn) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 289 | CONSTRAINT chk_review_rating CHECK (rating BETWEEN 1 AND 5) |
| | 290 | ); |
| | 291 | }}} |
| | 292 | |
| | 293 | Reply |
| | 294 | {{{ |
| | 295 | CREATE TABLE Reply ( |
| | 296 | id BIGSERIAL PRIMARY KEY, |
| | 297 | user_id BIGINT NOT NULL, |
| | 298 | review_id BIGINT NOT NULL, |
| | 299 | text TEXT NOT NULL, |
| | 300 | create_at TIMESTAMP NOT NULL, |
| | 301 | updated_at TIMESTAMP NOT NULL, |
| | 302 | deleted BOOLEAN NOT NULL, |
| | 303 | parent_id BIGINT, |
| | 304 | CONSTRAINT FKReply_User FOREIGN KEY (user_id) |
| | 305 | REFERENCES "User"(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 306 | CONSTRAINT FKReply_Review FOREIGN KEY (review_id) |
| | 307 | REFERENCES Review(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 308 | CONSTRAINT FKReply_Parent FOREIGN KEY (parent_id) |
| | 309 | REFERENCES Reply(id) ON DELETE SET NULL ON UPDATE CASCADE |
| | 310 | ); |
| | 311 | }}} |
| | 312 | |
| | 313 | Author |
| | 314 | {{{ |
| | 315 | CREATE TABLE Author ( |
| | 316 | id BIGSERIAL PRIMARY KEY, |
| | 317 | name VARCHAR(64), |
| | 318 | surname VARCHAR(64), |
| | 319 | artistic_name VARCHAR(64), |
| | 320 | date_of_birth DATE, |
| | 321 | CONSTRAINT chk_author_dob CHECK (date_of_birth <= CURRENT_DATE) |
| | 322 | ); |
| | 323 | }}} |
| | 324 | |
| | 325 | Wishlist |
| | 326 | {{{ |
| | 327 | CREATE TABLE Wishlist ( |
| | 328 | id BIGSERIAL PRIMARY KEY, |
| | 329 | user_id BIGINT NOT NULL, |
| | 330 | CONSTRAINT FKWishlist_User FOREIGN KEY (user_id) |
| | 331 | REFERENCES "User"(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 332 | ); |
| | 333 | }}} |
| | 334 | |
| | 335 | Shelf |
| | 336 | {{{ |
| | 337 | CREATE TABLE Shelf ( |
| | 338 | id BIGSERIAL PRIMARY KEY, |
| | 339 | room_id BIGINT NOT NULL, |
| | 340 | genre_id BIGINT NOT NULL, |
| | 341 | CONSTRAINT FKShelf_Room FOREIGN KEY (room_id) |
| | 342 | REFERENCES Room(id) ON DELETE RESTRICT ON UPDATE CASCADE, |
| | 343 | CONSTRAINT FKShelf_Genre FOREIGN KEY (genre_id) |
| | 344 | REFERENCES Genre(id) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 345 | ); |
| | 346 | }}} |
| | 347 | |
| | 348 | Chapter |
| | 349 | {{{ |
| | 350 | CREATE TABLE Chapter ( |
| | 351 | id BIGSERIAL PRIMARY KEY, |
| | 352 | edition_isbn VARCHAR(20) NOT NULL, |
| | 353 | name VARCHAR(128), |
| | 354 | number INT4, |
| | 355 | CONSTRAINT FKChapter_Edition FOREIGN KEY (edition_isbn) |
| | 356 | REFERENCES Edition(isbn) ON DELETE RESTRICT ON UPDATE CASCADE |
| | 357 | ); |
| | 358 | }}} |
| | 359 | |
| | 360 | Resource_Genres |
| | 361 | {{{ |
| | 362 | CREATE TABLE Resource_Genres ( |
| | 363 | ResourceId BIGINT NOT NULL, |
| | 364 | GenreId BIGINT NOT NULL, |
| | 365 | PRIMARY KEY (ResourceId, GenreId), |
| | 366 | FOREIGN KEY (ResourceId) REFERENCES Resource(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 367 | FOREIGN KEY (GenreId) REFERENCES Genre(id) ON DELETE CASCADE ON UPDATE CASCADE |
| | 368 | ); |
| | 369 | }}} |
| | 370 | |
| | 371 | Edition_Attributes |
| | 372 | {{{ |
| | 373 | CREATE TABLE Edition_Attributes ( |
| | 374 | edition_id VARCHAR(20) NOT NULL, |
| | 375 | attribute_pair_id BIGINT NOT NULL, |
| | 376 | PRIMARY KEY (edition_id, attribute_pair_id), |
| | 377 | FOREIGN KEY (edition_id) REFERENCES Edition(isbn) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 378 | FOREIGN KEY (attribute_pair_id) REFERENCES AttributePair(id) ON DELETE CASCADE ON UPDATE CASCADE |
| | 379 | ); |
| | 380 | }}} |
| | 381 | |
| | 382 | Wishlist_entry |
| | 383 | {{{ |
| | 384 | CREATE TABLE Wishlist_entry ( |
| | 385 | edition_isbn VARCHAR(20) NOT NULL, |
| | 386 | wishlist_id BIGINT NOT NULL, |
| | 387 | PRIMARY KEY (edition_isbn, wishlist_id), |
| | 388 | FOREIGN KEY (edition_isbn) REFERENCES Edition(isbn) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 389 | FOREIGN KEY (wishlist_id) REFERENCES Wishlist(id) ON DELETE CASCADE ON UPDATE CASCADE |
| | 390 | ); |
| | 391 | }}} |
| | 392 | |
| | 393 | Chapter_authors |
| | 394 | {{{ |
| | 395 | CREATE TABLE Chapter_authors ( |
| | 396 | chapter_id BIGINT NOT NULL, |
| | 397 | author_id BIGINT NOT NULL, |
| | 398 | PRIMARY KEY (chapter_id, author_id), |
| | 399 | FOREIGN KEY (chapter_id) REFERENCES Chapter(id) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 400 | FOREIGN KEY (author_id) REFERENCES Author(id) ON DELETE CASCADE ON UPDATE CASCADE |
| | 401 | ); |
| | 402 | }}} |
| | 403 | |
| | 404 | Edition_authors |
| | 405 | {{{ |
| | 406 | CREATE TABLE Edition_authors ( |
| | 407 | edition_id VARCHAR(20) NOT NULL, |
| | 408 | author_id BIGINT NOT NULL, |
| | 409 | PRIMARY KEY (edition_id, author_id), |
| | 410 | FOREIGN KEY (edition_id) REFERENCES Edition(isbn) ON DELETE CASCADE ON UPDATE CASCADE, |
| | 411 | FOREIGN KEY (author_id) REFERENCES Author(id) ON DELETE CASCADE ON UPDATE CASCADE |
| | 412 | ); |
| | 413 | }}} |
| | 414 | |
| | 415 | **Views** |
| | 416 | |
| | 417 | vw_edition_copy_count |
| | 418 | {{{ |
| | 419 | CREATE VIEW vw_edition_copy_count AS |
| | 420 | SELECT |
| | 421 | e.isbn, |
| | 422 | e.name, |
| | 423 | COUNT(rc.id) AS total_copies |
| | 424 | FROM Edition e |
| | 425 | LEFT JOIN ResourceCopy rc |
| | 426 | ON rc.edition_isbn = e.isbn |
| | 427 | GROUP BY e.isbn, e.name; |
| | 428 | }}} |
| | 429 | |
| | 430 | vw_active_memberships |
| | 431 | {{{ |
| | 432 | CREATE VIEW vw_active_memberships AS |
| | 433 | SELECT |
| | 434 | m.id, |
| | 435 | m.user_id, |
| | 436 | u.first_name, |
| | 437 | u.last_name, |
| | 438 | u.email, |
| | 439 | m.membership_plan_id, |
| | 440 | mp.name AS membership_name, |
| | 441 | m.started_at, |
| | 442 | m.expires_at |
| | 443 | FROM Membership m |
| | 444 | JOIN "User" u ON m.user_id = u.id |
| | 445 | JOIN membershipplan mp ON mp.id = m.membership_plan_id |
| | 446 | WHERE m.cancelled_at IS NULL |
| | 447 | AND m.expires_at > NOW(); |
| | 448 | }}} |
| | 449 | |
| | 450 | vw_active_rentals |
| | 451 | {{{ |
| | 452 | CREATE VIEW vw_active_rentals AS |
| | 453 | SELECT |
| | 454 | r.id, |
| | 455 | r.resource_copy_id, |
| | 456 | e.name, |
| | 457 | r.membership_id, |
| | 458 | u.email, |
| | 459 | r.rented_at, |
| | 460 | r.due_at |
| | 461 | FROM Rental r |
| | 462 | JOIN resourcecopy rc ON r.resource_copy_id = rc.id |
| | 463 | JOIN edition e ON e.isbn = rc.edition_isbn |
| | 464 | JOIN membership m ON m.id = r.membership_id |
| | 465 | JOIN "User" u ON u.id = m.user_id |
| | 466 | WHERE r.returned_at IS NULL; |
| | 467 | }}} |
| | 468 | |
| | 469 | vw_sorted_by_rentals_rented_editions |
| | 470 | {{{ |
| | 471 | CREATE VIEW vw_sorted_by_rentals_rented_editions AS |
| | 472 | SELECT |
| | 473 | e.isbn, |
| | 474 | e.name, |
| | 475 | COUNT(r.id) AS rental_count |
| | 476 | FROM Rental r |
| | 477 | JOIN ResourceCopy rc |
| | 478 | ON r.resource_copy_id = rc.id |
| | 479 | JOIN Edition e |
| | 480 | ON rc.edition_isbn = e.isbn |
| | 481 | GROUP BY e.isbn, e.name; |
| | 482 | }}} |
| | 483 | |
| | 484 | vw_edition_ratings |
| | 485 | {{{ |
| | 486 | CREATE VIEW vw_edition_ratings AS |
| | 487 | SELECT |
| | 488 | e.isbn, |
| | 489 | e.name, |
| | 490 | AVG(r.rating) AS avg_rating, |
| | 491 | COUNT(r.id) AS review_count |
| | 492 | FROM Edition e |
| | 493 | LEFT JOIN Review r |
| | 494 | ON r.resource_edition_isbn = e.isbn |
| | 495 | GROUP BY e.isbn, e.name; |
| | 496 | }}} |
| | 497 | |
| | 498 | vw_user_activity |
| | 499 | {{{ |
| | 500 | CREATE VIEW vw_user_activity AS |
| | 501 | SELECT |
| | 502 | u.id AS user_id, |
| | 503 | u.email, |
| | 504 | COUNT(DISTINCT r.id) AS total_rentals, |
| | 505 | COUNT(DISTINCT rev.id) AS total_reviews, |
| | 506 | COUNT(DISTINCT er.id) AS total_event_registrations |
| | 507 | FROM "User" u |
| | 508 | LEFT JOIN Membership m |
| | 509 | ON m.user_id = u.id |
| | 510 | LEFT JOIN Rental r |
| | 511 | ON r.membership_id = m.id |
| | 512 | LEFT JOIN Review rev |
| | 513 | ON rev.user_id = u.id |
| | 514 | LEFT JOIN EventRegistration er |
| | 515 | ON er.user_id = u.id |
| | 516 | GROUP BY u.id; |
| | 517 | }}} |
| | 518 | |
| | 519 | vw_overdue_rentals |
| | 520 | {{{ |
| | 521 | CREATE VIEW vw_overdue_rentals AS |
| | 522 | SELECT |
| | 523 | r.id, |
| | 524 | r.resource_copy_id, |
| | 525 | e.name, |
| | 526 | r.membership_id, |
| | 527 | u.email, |
| | 528 | r.due_at |
| | 529 | FROM Rental r |
| | 530 | JOIN resourcecopy rc ON rc.id = r.resource_copy_id |
| | 531 | JOIN edition e ON e.isbn = rc.edition_isbn |
| | 532 | JOIN membership m ON m.id = r.membership_id |
| | 533 | JOIN "User" u ON u.id = m.user_id |
| | 534 | WHERE r.returned_at IS NULL |
| | 535 | AND r.due_at < NOW(); |
| | 536 | }}} |
| | 537 | |
| | 538 | vw_available_editions_for_rent |
| | 539 | {{{ |
| | 540 | CREATE VIEW vw_available_editions_for_rent AS |
| | 541 | SELECT |
| | 542 | e.isbn, |
| | 543 | e.name, |
| | 544 | COUNT(rc.id) AS total_copies, |
| | 545 | COUNT(ar.id) AS currently_rented_copies, |
| | 546 | (COUNT(rc.id) - COUNT(ar.id)) AS available_copies |
| | 547 | FROM Edition e |
| | 548 | LEFT JOIN ResourceCopy rc |
| | 549 | ON rc.edition_isbn = e.isbn |
| | 550 | LEFT JOIN Rental r |
| | 551 | ON r.resource_copy_id = rc.id |
| | 552 | AND r.returned_at IS NULL |
| | 553 | LEFT JOIN vw_active_rentals ar |
| | 554 | ON ar.resource_copy_id = rc.id |
| | 555 | GROUP BY e.isbn, e.name |
| | 556 | HAVING (COUNT(rc.id) - COUNT(ar.id)) > 0; |
| | 557 | }}} |
| | 558 | |
| | 559 | vw_future_events_for_lib |
| | 560 | {{{ |
| | 561 | CREATE VIEW vw_future_events_for_lib AS |
| | 562 | SELECT e.name AS event_name, |
| | 563 | e.description AS event_description, |
| | 564 | et.name AS type_of_event, |
| | 565 | l.name AS library_name, |
| | 566 | e.capacity AS event_capacity, |
| | 567 | e.start_time AS start_date_time, |
| | 568 | r.name AS room_name |
| | 569 | FROM event AS e |
| | 570 | JOIN library AS l ON e.library_id = l.id |
| | 571 | JOIN room AS r ON r.id = e.event_room_id |
| | 572 | JOIN eventtype AS et ON et.id = e.event_type_id |
| | 573 | WHERE e.start_time >= now() |
| | 574 | ORDER BY start_time; |
| | 575 | }}} |