Search
ctrl/
Ask AI
Light
Dark
System

Object types

Define an abstract type:

Copy
abstract type HasImage {
    # just a URL to the image
    required image: str;
    index on (.image);
}

Define a type extending from the abstract:

Copy
type User extending HasImage {
    required name: str {
        # Ensure unique name for each User.
        constraint exclusive;
    }
}

Define a type with constraints and defaults for properties:

Copy
type Review {
    required body: str;
    required rating: int64 {
        constraint min_value(0);
        constraint max_value(5);
    }
    required flag: bool {
        default := False;
    }

    required author: User;
    required movie: Movie;

    required creation_time: datetime {
        default := datetime_current();
    }
}

Define a type with a property that is computed from the combination of the other properties:

Copy
type Person extending HasImage {
    required first_name: str {
        default := '';
    }
    required middle_name: str {
        default := '';
    }
    required last_name: str;
    full_name :=
        (
            (
                (.first_name ++ ' ')
                if .first_name != '' else
                ''
            ) ++
            (
                (.middle_name ++ ' ')
                if .middle_name != '' else
                ''
            ) ++
            .last_name
        );
    bio: str;
}

Define an abstract links:

Copy
abstract link crew {
    # Provide a way to specify some "natural"
    # ordering, as relevant to the movie. This
    # may be order of importance, appearance, etc.
    list_order: int64;
}

abstract link directors {
    extending crew;
};

abstract link actors {
    extending crew;
};

Define a type using abstract links and a computed property that aggregates values from another linked type:

Copy
type Movie extending HasImage {
    required title: str;
    required year: int64;

    # Add an index for accessing movies by title and year,
    # separately and in combination.
    index on (.title);
    index on (.year);
    index on ((.title, .year));

    description: str;

    multi directors: Person {
        extending crew;
    };
    multi actors: Person {
        extending crew
    };

    avg_rating := math::mean(.<movie[is Review].rating);
}

Define an auto-incrementing scalar type and an object type using it as a property:

Copy
scalar type TicketNo extending sequence;

type Ticket {
    number: TicketNo {
        constraint exclusive;
    }
}