Juvix imports
module arch.node.engines.local_time_series_storage_behaviour;
import arch.node.engines.local_time_series_storage_messages open;
import arch.node.engines.local_time_series_storage_config open;
import arch.node.engines.local_time_series_storage_environment open;
import prelude open;
import arch.node.types.basics open;
import arch.node.types.identities open;
import arch.node.types.messages open;
import arch.node.types.engine open;
import arch.node.types.anoma as Anoma open;
Local Time Series Storage Behaviour¶
Overview¶
A time series storage engine acts as a database that can store, retrieve, and delete time series data.
Action arguments¶
LocalTSStorageActionArgument¶
type LocalTSStorageActionArgument := Unit;
LocalTSStorageActionArguments¶
LocalTSStorageActionArguments : Type := List LocalTSStorageActionArgument;
Actions¶
Auxiliary Juvix code
LocalTSStorageAction¶
LocalTSStorageAction : Type :=
  Action
    LocalTSStorageCfg
    LocalTSStorageLocalState
    LocalTSStorageMailboxState
    LocalTSStorageTimerHandle
    LocalTSStorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
LocalTSStorageActionInput¶
LocalTSStorageActionInput : Type :=
  ActionInput
    LocalTSStorageCfg
    LocalTSStorageLocalState
    LocalTSStorageMailboxState
    LocalTSStorageTimerHandle
    LocalTSStorageActionArguments
    Anoma.Msg;
LocalTSStorageActionEffect¶
LocalTSStorageActionEffect : Type :=
  ActionEffect
    LocalTSStorageLocalState
    LocalTSStorageMailboxState
    LocalTSStorageTimerHandle
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
LocalTSStorageActionExec¶
LocalTSStorageActionExec : Type :=
  ActionExec
    LocalTSStorageCfg
    LocalTSStorageLocalState
    LocalTSStorageMailboxState
    LocalTSStorageTimerHandle
    LocalTSStorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
getDataAction¶
Get data from the time series database.
- State update
- The state remains unchanged.
- Messages to be sent
- A GetDataTSStorageDBResponsemessage with the requested data.
- Engines to be spawned
- No engine is created by this action.
- Timer updates
- No timers are set or cancelled.
getDataAction
  (input : LocalTSStorageActionInput) : Option LocalTSStorageActionEffect :=
  let
    env := ActionInput.env input;
    trigger := ActionInput.trigger input;
    cfg := ActionInput.cfg input;
    local := EngineEnv.localState env;
  in case getEngineMsgFromTimestampedTrigger trigger of
       | some mkEngineMsg@{
                msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgGetRequest request);
                sender := sender;
              } :=
         let
           result :=
             queryDB
               (LocalTSStorageLocalState.db local)
               (GetDataTSStorageDBRequest.query request);
         in case result of {
              | some data :=
                some
                  mkActionEffect@{
                    env := env;
                    msgs :=
                      [
                        mkEngineMsg@{
                          sender := getEngineIDFromEngineCfg cfg;
                          target := sender;
                          mailbox := some 0;
                          msg :=
                            Anoma.MsgLocalTSStorage
                              (LocalTSStorageMsgGetResponse
                                mkGetDataTSStorageDBResponse@{
                                  query :=
                                    GetDataTSStorageDBRequest.query request;
                                  data := data;
                                });
                        };
                      ];
                    timers := [];
                    engines := [];
                  }
              | none := none
            }
       | _ := none;
recordDataAction¶
Record new data in the time series database.
- State update
- Updates the database with new time series data, if successful.
- Messages to be sent
- A RecordDataTSStorageDBResponsemessage indicating success/failure.
- Several DataChangedTSStorageDBmessages to those interested engines, if successful.
- Engines to be spawned
- No engine is created by this action.
- Timer updates
- No timers are set or cancelled.
recordDataAction
  (input : LocalTSStorageActionInput) : Option LocalTSStorageActionEffect :=
  let
    env := ActionInput.env input;
    trigger := ActionInput.trigger input;
    cfg := ActionInput.cfg input;
    local := EngineEnv.localState env;
    newTime := advanceTime (LocalTSStorageLocalState.localClock local);
  in case getEngineMsgFromTimestampedTrigger trigger of
       | some mkEngineMsg@{
                msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgRecordRequest request);
                sender := sender;
              } :=
         let
           query := RecordDataTSStorageDBRequest.query request;
           db := LocalTSStorageLocalState.db local;
           data := queryDB db query;
         in case data of {
              | some value :=
                let
                  newDb := updateDB db query value;
                  newEnv :=
                    env@EngineEnv{localState := mkLocalTSStorageLocalState@{
                                                  db := newDb;
                                                  localClock := newTime;
                                                }};
                  responseMsg :=
                    mkEngineMsg@{
                      sender := getEngineIDFromEngineCfg cfg;
                      target := sender;
                      mailbox := some 0;
                      msg :=
                        Anoma.MsgLocalTSStorage
                          (LocalTSStorageMsgDeleteResponse
                            mkDeleteDataTSStorageDBResponse@{
                              query := query;
                              success := true;
                            });
                    };
                  notificationMsg :=
                    \{target :=
                      mkEngineMsg@{
                        sender := getEngineIDFromEngineCfg cfg;
                        target := target;
                        mailbox := some 0;
                        msg :=
                          Anoma.MsgLocalTSStorage
                            (LocalTSStorageMsgDataChanged
                              mkDataChangedTSStorageDB@{
                                query := query;
                                data := value;
                                timestamp := newTime;
                              });
                      }};
                  notificationMsgs :=
                    map notificationMsg (getNotificationTargets query);
                in some
                  mkActionEffect@{
                    env := newEnv;
                    msgs := responseMsg :: notificationMsgs;
                    timers := [];
                    engines := [];
                  }
              | none :=
                some
                  mkActionEffect@{
                    env := env;
                    msgs :=
                      [
                        mkEngineMsg@{
                          sender := getEngineIDFromEngineCfg cfg;
                          target := sender;
                          mailbox := some 0;
                          msg :=
                            Anoma.MsgLocalTSStorage
                              (LocalTSStorageMsgRecordResponse
                                mkRecordDataTSStorageDBResponse@{
                                  query := query;
                                  success := false;
                                });
                        };
                      ];
                    timers := [];
                    engines := [];
                  }
            }
       | _ := none;
deleteDataAction¶
Delete data from the time series database.
- State update
- Updates the database by removing specified time series data, if successful.
- Messages to be sent
- A DeleteDataTSStorageDBResponsemessage indicating success/failure.
- Several DataChangedTSStorageDBmessages to those interested engines, if successful.
- Engines to be spawned
- No engine is created by this action.
- Timer updates
- No timers are set or cancelled.
deleteDataAction
  (input : LocalTSStorageActionInput) : Option LocalTSStorageActionEffect :=
  let
    env := ActionInput.env input;
    trigger := ActionInput.trigger input;
    cfg := ActionInput.cfg input;
    local := EngineEnv.localState env;
    newTime := advanceTime (LocalTSStorageLocalState.localClock local);
  in case getEngineMsgFromTimestampedTrigger trigger of
       | some mkEngineMsg@{
                msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgDeleteRequest request);
                sender := sender;
              } :=
         let
           query := DeleteDataTSStorageDBRequest.query request;
           db := LocalTSStorageLocalState.db local;
           data := queryDB db query;
         in case data of {
              | some value :=
                let
                  newDb := updateDB db query "";
                  newEnv :=
                    env@EngineEnv{localState := mkLocalTSStorageLocalState@{
                                                  db := newDb;
                                                  localClock := newTime;
                                                }};
                  responseMsg :=
                    mkEngineMsg@{
                      sender := getEngineIDFromEngineCfg cfg;
                      target := sender;
                      mailbox := some 0;
                      msg :=
                        Anoma.MsgLocalTSStorage
                          (LocalTSStorageMsgDeleteResponse
                            mkDeleteDataTSStorageDBResponse@{
                              query := query;
                              success := true;
                            });
                    };
                  notificationMsg :=
                    \{target :=
                      mkEngineMsg@{
                        sender := getEngineIDFromEngineCfg cfg;
                        target := target;
                        mailbox := some 0;
                        msg :=
                          Anoma.MsgLocalTSStorage
                            (LocalTSStorageMsgDataChanged
                              mkDataChangedTSStorageDB@{
                                query := query;
                                data := value;
                                timestamp := newTime;
                              });
                      }};
                  notificationMsgs :=
                    map notificationMsg (getNotificationTargets query);
                in some
                  mkActionEffect@{
                    env := newEnv;
                    msgs := responseMsg :: notificationMsgs;
                    timers := [];
                    engines := [];
                  }
              | none :=
                some
                  mkActionEffect@{
                    env := env;
                    msgs :=
                      [
                        mkEngineMsg@{
                          sender := getEngineIDFromEngineCfg cfg;
                          target := sender;
                          mailbox := some 0;
                          msg :=
                            Anoma.MsgLocalTSStorage
                              (LocalTSStorageMsgDeleteResponse
                                mkDeleteDataTSStorageDBResponse@{
                                  query := query;
                                  success := false;
                                });
                        };
                      ];
                    timers := [];
                    engines := [];
                  }
            }
       | _ := none;
Action Labels¶
getDataActionLabel¶
getDataActionLabel : LocalTSStorageActionExec := Seq [getDataAction];
recordDataActionLabel¶
recordDataActionLabel : LocalTSStorageActionExec := Seq [recordDataAction];
deleteDataActionLabel¶
deleteDataActionLabel : LocalTSStorageActionExec := Seq [deleteDataAction];
Guards¶
Auxiliary Juvix code
LocalTSStorageGuard¶
LocalTSStorageGuard : Type :=
  Guard
    LocalTSStorageCfg
    LocalTSStorageLocalState
    LocalTSStorageMailboxState
    LocalTSStorageTimerHandle
    LocalTSStorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
LocalTSStorageGuardOutput¶
LocalTSStorageGuardOutput : Type :=
  GuardOutput
    LocalTSStorageCfg
    LocalTSStorageLocalState
    LocalTSStorageMailboxState
    LocalTSStorageTimerHandle
    LocalTSStorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
LocalTSStorageGuardEval¶
LocalTSStorageGuardEval : Type :=
  GuardEval
    LocalTSStorageCfg
    LocalTSStorageLocalState
    LocalTSStorageMailboxState
    LocalTSStorageTimerHandle
    LocalTSStorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
getDataGuard¶
- Condition
- Message type is LocalTSStorageMsgGetRequest.
getDataGuard
  (trigger : LocalTSStorageTimestampedTrigger)
  (cfg : EngineCfg LocalTSStorageCfg)
  (env : LocalTSStorageEnv)
  : Option LocalTSStorageGuardOutput :=
  case getEngineMsgFromTimestampedTrigger trigger of
    | some mkEngineMsg@{
             msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgGetRequest _);
           } :=
      some
        mkGuardOutput@{
          action := getDataActionLabel;
          args := [];
        }
    | _ := none;
recordDataGuard¶
- Condition
- Message type is LocalTSStorageMsgRecordRequest.
recordDataGuard
  (trigger : LocalTSStorageTimestampedTrigger)
  (cfg : EngineCfg LocalTSStorageCfg)
  (env : LocalTSStorageEnv)
  : Option LocalTSStorageGuardOutput :=
  case getEngineMsgFromTimestampedTrigger trigger of
    | some mkEngineMsg@{
             msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgRecordRequest _);
           } :=
      some
        mkGuardOutput@{
          action := recordDataActionLabel;
          args := [];
        }
    | _ := none;
deleteDataGuard¶
- Condition
- Message type is LocalTSStorageMsgDeleteRequest.
deleteDataGuard
  (trigger : LocalTSStorageTimestampedTrigger)
  (cfg : EngineCfg LocalTSStorageCfg)
  (env : LocalTSStorageEnv)
  : Option LocalTSStorageGuardOutput :=
  case getEngineMsgFromTimestampedTrigger trigger of
    | some mkEngineMsg@{
             msg := Anoma.MsgLocalTSStorage (LocalTSStorageMsgDeleteRequest _);
           } :=
      some
        mkGuardOutput@{
          action := deleteDataActionLabel;
          args := [];
        }
    | _ := none;
The Local Time Series Storage Behaviour¶
LocalTSStorageBehaviour¶
LocalTSStorageBehaviour : Type :=
  EngineBehaviour
    LocalTSStorageCfg
    LocalTSStorageLocalState
    LocalTSStorageMailboxState
    LocalTSStorageTimerHandle
    LocalTSStorageActionArguments
    Anoma.Msg
    Anoma.Cfg
    Anoma.Env;
Instantiation¶
localTSStorageBehaviour : LocalTSStorageBehaviour :=
  mkEngineBehaviour@{
    guards := First [getDataGuard; recordDataGuard; deleteDataGuard];
  };
Local Time Series Storage Action Flowcharts¶
getData Flowchart¶
flowchart TD
  subgraph C[Conditions]
    CMsg>LocalTSStorageMsgGetRequest]
  end
  G(getDataGuard)
  A(getDataAction)
  C --> G -- *getDataActionLabel* --> A --> E
  subgraph E[Effects]
    EMsg>LocalTSStorageMsgGetResponse]
  endgetData flowchart
recordData Flowchart¶
flowchart TD
  subgraph C[Conditions]
    CMsg>LocalTSStorageMsgRecordRequest]
  end
  G(recordDataGuard)
  A(recordDataAction)
  C --> G -- *recordDataActionLabel* --> A --> E
  subgraph E[Effects]
    EEnv[(DB update)]
    EMsg1>LocalTSStorageMsgRecordResponse]
    EMsg2>LocalTSStorageMsgDataChanged]
  endrecordData flowchart
deleteData Flowchart¶
flowchart TD
  subgraph C[Conditions]
    CMsg>LocalTSStorageMsgDeleteRequest]
  end
  G(deleteDataGuard)
  A(deleteDataAction)
  C --> G -- *deleteDataActionLabel* --> A --> E
  subgraph E[Effects]
    EEnv[(DB update)]
    EMsg1>LocalTSStorageMsgDeleteResponse]
    EMsg2>LocalTSStorageMsgDataChanged]
  enddeleteData flowchart