Views are read-time projections in ClickHouse. A static SELECT defines the view over one or more base tables or other views. Moose wraps ClickHouse VIEW with a simple View class in TypeScript or Python. You provide the view name, the SELECT, and the list of source tables/views so Moose can order DDL correctly during migrations.
Use View when you want a virtual read-time projection and don't need write-time transformation or a separate storage table. For write-time pipelines and backfills, use a Materialized View instead.
import { View, sql } from "@514labs/moose-lib";import { users } from "./Users";import { events } from "./Events"; export const activeUserEvents = new View( "active_user_events", sql` SELECT ${events.columns.id} AS event_id, ${users.columns.id} AS user_id, ${users.columns.name} AS user_name, ${events.columns.ts} AS ts FROM ${events} JOIN ${users} ON ${events.columns.user_id} = ${users.columns.id} WHERE ${users.columns.active} = 1 `, [events, users],);from moose_lib import Viewfrom tables import users, events active_user_events = View( "active_user_events", """ SELECT {events.columns.id} AS event_id, {users.columns.id} AS user_id, {users.columns.name} AS user_name, {events.columns.ts} AS ts FROM {events} JOIN {users} ON {events.columns.user_id} = {users.columns.id} WHERE {users.columns.active} = 1 """, [events, users],)# View(name: str, select_statement: str, base_tables: list[OlapTable | View])View( "view_name", "SELECT ... FROM {someTable}", [someTable],)