AgE 2.5 : ZapytaniaImplSekwencje

Sekwencje wykonania zapytań

Dla lepszego zrozumienia poniżej zaprezentowano diagramy sekwencji dla kilku przypadków użycia mechanizmu query w domyślnych implementacjach.

Gdy cache nie posiada jeszcze rezultatu dla danego query.

Po wykonaniu na agregacie query(IQuery, IAddressSelector), agregat wykonuje na dostępnej mu implementacji (która jest w rzeczywistości cachem) init(IAgent). W cache'u nie ma jeszcze rezultatu dla tego agregata więc init(IAgent) jest delegowany do opakowanego w nim query, które tworzy i inicjalizuje obiekt QueryableQueryResult. Następnie dla tak stworzonego rezultatu tworzony jest obiekt CacheResultQuery, który go opakowuje. W rzeczywistości agregatowi zwracany jest właśnie CacheQueryResult.

Kolejnym etapem jest wykonanie shouldStop(IAgent, IQueryResult) na cache'u. Cache z otrzymanego rezultatu (w rzeczywistości obiektu CacheQueryResult) odczytuje flagę shouldRefresh i w związku z ustawieniem jej na true sam zwraca agregatowi false.

Ponieważ uzyskano false, wykonywany jest update(IPropertiesSet, IQueryResult) dla propertiesów każdego z agentów agregata na cache'u. Update jest delegowany do opakowanego query. Query po wykonaniu wyliczeń wykonuje na rezultacie update(IPropertiesSet). Uzyskany rezultat jest następnie (w dalszym ciągu opakowany jako CacheQueryResult) zwracany agregatowi.

Agregat na zakończenie wykonuje na cache'u finish(IAgent, IQueryResult), które jest delegowane do query. Wynik jest zapisywany jako CacheQueryResult (z flagą shouldRefresh ustawioną na false i zaktualizowanym krokiem ostatniego odświeżania) w mapie z adresem wywołującego agregata jako kluczem oraz zwracany jako rezultat wywołania query(IQuery, IAddressSelector) - tym razem już bez opakowania.

Gdy cache przechowuje rezultat dla danego query ale jest on nieaktualny.

Po wykonaniu na agregacie query(IQuery, IAddressSelector), agregat wykonuje na dostępnej mu implementacji (która jest w rzeczywistości cachem) init(IAgent). Cache pobiera z mapy obiekt CacheQueryResult i na podstawie pobranego z niego znacznika kroku ostatniego odświeżania stwierdza że rezultat jest nieaktualny. Deleguje zatem inicjalizację do opakowywanego query, które konstruuje i zwraca nowy QueryableQueryResult. Ten rezultat jest zapisywany następnie w CacheQueryResulcie. Jest w nim także ustawiana flaga shouldRefresh na true. Tak przygotowany CacheQueryResult jest zwracany agregatowi.

Kolejnym etapem jest wykonanie shouldStop(IAgent, IQueryResult) na cache'u. Cache z otrzymanego rezultatu (w rzeczywistości obiektu CacheQueryResult) odczytuje flagę shouldRefresh i w związku z ustawieniem jej na true sam zwraca agregatowi false.

Ponieważ uzyskano false, wykonywany jest update(IPropertiesSet, IQueryResult) dla propertiesów każdego z agentów agregata na cache'u. Update jest delegowany do opakowanego query. Query po wykonaniu wyliczeń wykonuje na rezultacie update(IPropertiesSet). Uzyskany rezultat jest następnie (w dalszym ciągu opakowany jako CacheQueryResult) zwracany agregatowi.

Agregat na zakończenie wykonuje na cache'u finish(IAgent, IQueryResult), które jest delegowane do query. Wynik jest zapisywany jako CacheQueryResult (z flagą shouldRefresh ustawioną na false i zaktualizowanym krokiem ostatniego odświeżania) w mapie z adresem wywołującego agregata jako kluczem oraz zwracany jako rezultat wywołania query(IQuery, IAddressSelector) - tym razem już bez opakowania.

Gdy cache przechowuje rezultat dla danego query i jest on aktualny.

Po wykonaniu na agregacie query(IQuery, IAddressSelector), agregat wykonuje na dostępnej mu implementacji (która jest w rzeczywistości cachem) init(IAgent). Cache pobiera z mapy obiekt CacheQueryResult i na podstawie pobranego z niego znacznika kroku ostatniego odświeżania stwierdza że rezultat jest aktualny. Zwraca zatem agregatowi jako rezultat ten CacheQueryResult (który flagę shouldRefresh ma ustawioną na false).

Kolejnym etapem jest wykonanie shouldStop(IAgent, IQueryResult) na cache'u. Cache z otrzymanego rezultatu (w rzeczywistości obiektu CacheQueryResult) odczytuje flagę shouldRefresh i w związku z ustawieniem jej na false sam zwraca agregatowi true.

Ponieważ uzyskano true, nie musi być wykonywany pełny update po wszystkich agentach agregata.

Agregat na zakończenie wywołuje na cache'u finish(IAgent, IQueryResult). Cache stwierdza że opakowany we właściwym CacheQueryResulcie rezultat jest aktualny i zwraca go jako rezultat tej metody.

Jako wynik wywołania query(IQuery, IAddressSelector) zwracany jest zatem zcache'owany rezultat.

Attachments:

sequence1.png (image/png)
sequence2.png (image/png)
sequence3.png (image/png)