Light
Dark
System
v4latest
v4latest
v3
v2
v1

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;
    }
}
Light
Dark
System

We use ChatGPT with additional context from our documentation to answer your questions. Not all answers will be accurate. Please join our Discord if you need more help.