Skip to content

Query Engine Service Architecture

Service Architecture

flowchart LR
    client(Client)
    api(API)
    qe{{Query Engine}}

    pg[(Postgres)]

    subgraph Redis
        jobs_stream([Jobs Stream])
        results[(Results Hashes)]
        end

    client <--> api
    api --> jobs_stream
    api <--> results
    api <--> pg
    jobs_stream --> qe
    qe --> results
    pg -.-> qe

Sequence Diagram

sequenceDiagram
    actor User
    participant Client
    participant API
    participant Redis
    participant QueryEngine
    participant Postgres

    User->>Client: Create client
    Client->>API: Authenticate
    API->>Client: Return authentication credentials
    User->>Client: Enters SQL Query

    Client->>API: Calls QueryEngine.Query to start sql execution
    API->>Redis: Submit query request to Redis stream
    API-)API: Spawn query status check request
    API--)Postgres: Log query execution to Postgres

    critical Execute Query
        Redis->>QueryEngine: Pull query request
        QueryEngine->>Postgres: Initiate Postgres connector
        QueryEngine-)QueryEngine: Spawn query execution job
        
        alt Query Cancelled
            API->>Redis: Submit cancellation request to Redis stream
            Redis->>QueryEngine: Pull cancellation request
            QueryEngine--)QueryEngine: Cancel query execution
            QueryEngine->>Redis: Load cancellation status into Redis hash
        else Query Succeeded
            QueryEngine->>Redis: Load query results into Redis hash
        else Query Failed
            QueryEngine->>Redis: Load error information into Redis hash
        end
    end

    critical Wait for Results
        loop While status is Pending or Running
            API->>Redis: Check status
            API->>API: Sleep with backoff
        end
        alt Success
            API->>Redis: Pull Results
            API->>Client: Stream results
            Client->>User: Return data to user
        else Failed | Cancelled
            API->>Redis: Pull error information
            API->>Client: Stream error information
            Client->>User: Throw error
        else Timeout
            API->>Redis: Submit cancellation to request to Redis stream
            Redis->>QueryEngine: Pull cancellation request from Redis stream
            QueryEngine--)QueryEngine: Cancel query execution
            API->>Redis: Pull timeout error information
            API->>Client: Stream timeout error information
            Client->>User: Throw error
        end
    end