@startuml allowmixing package Client { object "Query Interface" as query_interface } package Algebra { object "Unifier" as unifier object "Bytecode Builder" as bytecode_builder object "Parser" as parser object "Lexer" as lexer } query_interface --> lexer lexer --> parser parser --> unifier unifier --> bytecode_builder package Query { object "Schema Builder" as schema_builder object "Facts Builder" as facts_builder object "Optimizer" as optimizer object "Commands Generator" as commands_generator object "B+ Tree" as b_plus_tree } bytecode_builder --> optimizer optimizer --> commands_generator facts_builder --> commands_generator schema_builder --> commands_generator commands_generator --> b_plus_tree b_plus_tree --> query_interface package Coordinator { object "File Historical Hashes" as file_historical_hashes object "Location Hashes" as location_hashes object "Command Parser" as command_parser object "Curator" as curator } commands_generator <-- command_parser package Disk { object "Merkle Tree Root Generator" as merkle_tree object "WAL Reader" as wal_reader object "WAL Writer" as wal_writer object "ARIES" as aries object "SHA256 Hasher" as sha object "Executor" as executor map storage { write => +λ read => +λ } object "Courier" as courier database Wal } executor *--> merkle_tree executor *--> sha curator --> command_parser command_parser --> executor location_hashes *--> curator file_historical_hashes *--> curator executor --> aries aries --> wal_reader aries --> wal_writer wal_writer --> Wal wal_reader --> Wal courier <-- wal_reader courier --> storage @enduml