iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
Software Development

一起看無間道學EdgeDB系列 第 17

[Day17] - 四幕:被遺忘的時光

  • 分享至 

  • xImage
  •  

Full schema preview

本日所有schema搶先看

劇情提要

臥底近十年後,建明與永仁在Hi-Fi鋪相遇。建明請永仁推薦設備,並一起試聽了「被遺忘的時光」。試聽過程中,建明請永仁換了一條音源線,歌聲立刻變得更加立體,好像真人就在眼前唱歌一般。畢竟這首歌建明聽過太多次,有太多懷念的過去(詳情請見無間道Ⅱ)。

scene04

此劇照引用自IMDb-無間道

EdgeQL query

insert此場景時間2002年11月28日

insert FuzzyTime {fuzzy_year:= 2002, fuzzy_month:=11, fuzzy_day:=28};

insert店家Hi-Fi鋪

insert Store {name:="Hi-Fi鋪"};

update lau

增加飾演建明十年後的演員劉德華至lauactors multi link中(留意這邊使用的是+=)。

nested insert有點像,我們不需要先insert劉德華,再update lau,直接於updateinsert即可。

update lau 
set {
    actors+= (insert Actor {
            name:="劉德華",
            eng_name:= "Andy",
            nickname:= "華仔",
   })
};

update chen

chenupdate可以同時:

  • 將經典台詞「高音甜、中音準、低音勁。一句講哂,通透啦即係。」指定給classic_lines property(留意這邊使用的是:=)。
  • 增加飾演永仁十年後的演員梁朝偉至chenactors multi link中(留意這邊使用的是+=)。
update chen 
set {
    classic_lines := ["高音甜、中音準、低音勁。一句講哂,通透啦即係。"],
    actors+= (insert Actor {
            name:="梁朝偉",
            eng_name:= "Tony",
            nickname:= "偉仔",
   })
};

insert ChenLauContact

insert ChenLauContact {
    how:= "面對面",
    detail:= "臥底近十年後,建明與永仁在Hi-Fi鋪相遇,一起試聽了`被遺忘的時光", 
    `when`:=  assert_single(
            (select FuzzyTime filter .fuzzy_fmt="2002/11/28_HH24:MI:SS_ID")
    ),
    where:= assert_single((select Store filter .name="Hi-Fi鋪")),
};

編寫is_hi_fi_store_open()

如果我們想要知道Hi-Fi鋪是否處於營業時間,可以寫一個is_hi_fi_store_open()function來判斷。

假設Hi-Fi鋪每天的營業時間為11:00~22:00,但:

  • 每星期三公休。
  • 13:00 ~ 14:00及19:00 ~ 20:00為休息時間。

is_hi_fi_store_open() function接收兩個變數,一個是dowDayOfWeek型態)代表星期幾造訪,另一個是visit_hourint64型態)代表幾點造訪,回傳值則為bool型態。

這邊我們可以使用range()搭配multirange()來處理某時段是否為營業時間。首先將營業時間拆成11~1314~1920~22三個range並包成一個array後,傳給一個multirange,並在with區塊中將其命名為open_hours

接著判斷dow是否不是星期三,且visit_hour是否在open_hours區間內(使用contains)。如果是的話,代表該時間為店家營業時間,回傳true;否則即為休息時間,回傳false

function is_hi_fi_store_open(dow: DayOfWeek, visit_hour: int64) -> bool
using (
    with open_hours:= multirange([range(11, 13), 
                                  range(14, 19), 
                                  range(20, 22)])
    select dow != DayOfWeek.Wednesday and contains(open_hours, visit_hour)
);

編寫test_hi_fi_store_open()test_hi_fi_store_close()

搭配allnot可以編寫test_hi_fi_store_open()test_hi_fi_store_close()來確認is_hi_fi_store_open()是否可以準確依照傳入時間,回傳正確的bool值。

function test_hi_fi_store_open() -> bool
using (all({
        is_hi_fi_store_open(DayOfWeek.Monday, 12),
        is_hi_fi_store_open(DayOfWeek.Friday, 15),
        is_hi_fi_store_open(DayOfWeek.Saturday, 21),
    })
);

function test_hi_fi_store_close() -> bool 
using (not all({
        is_hi_fi_store_open(DayOfWeek.Wednesday, 12),
        is_hi_fi_store_open(DayOfWeek.Thursday, 13),
        is_hi_fi_store_open(DayOfWeek.Sunday, 19),
    })
);

執行end migration

did you create function 'default::is_hi_fi_store_open'? [y,n,l,c,b,s,q,?]
> y
did you create function 'default::test_hi_fi_store_close'? [y,n,l,c,b,s,q,?]
> y
did you create function 'default::test_hi_fi_store_open'? [y,n,l,c,b,s,q,?]
> y

測試test_hi_fi_store_open()test_hi_fi_store_close()

select test_hi_fi_store_open(); # {true}
select test_hi_fi_store_close(); # {true}

insert此場景的Scene

insert Scene {
    title:= "被遺忘的時光",
    detail:= "臥底近十年後,建明與永仁在Hi-Fi鋪相遇。建明請永仁推薦設備,並一起" ++
             "試聽了`被遺忘的時光`。試聽過程中,建明請永仁換了一條音源線,歌聲立" ++
             "刻變得更加立體,好像真人就在眼前唱歌一般,畢竟這首歌建明聽過太多" ++
             "次,有太多懷念的過去(詳情請見無間道Ⅱ)。",
    remarks:= "簽單日期為2002/11/28", 
    who:= {chen, lau},
    `when`:=  assert_single(
            (select FuzzyTime filter .fuzzy_fmt="2002/11/28_HH24:MI:SS_ID")
    ),
    where:= assert_single((select Store filter .name="Hi-Fi鋪")),         
};

無間吹水

永仁幫建明刷卡的單據日期為2002年11月28日,但永仁於劇末的墓碑往生日期為2002年11月27日,這個問題20年來留給觀眾許多討論空間。有人說這是因為墓碑日期為陰曆,有人則說這是導演與編劇特地想表達「無間輪迴」之意。但根據2022年4K修復版上映時的訪問,似乎這只是一個單純的道具準備疏失。

參考資料

無間EdgeDB四幕:被遺忘的時光


上一篇
[Day16] - 三幕:黑白顛倒
下一篇
[Day18] - 五幕:三年之後又三年
系列文
一起看無間道學EdgeDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言