Working with data

Performing mutations

While queries fetch and transform data, mutations allow you to make changes - like updating records, triggering actions, or writing data to destinations.

Declaring mutable operations

Operations that perform changes are marked with the write modifier in service definitions:

service FlightsService {
   // Operation that makes changes
   write operation bookFlight(BookingRequest):BookingConfirmation
   
   // Regular query operation
   operation getFlights():Flight[]
}

Invoking mutations

While queries use the find or stream keywords, mutations use the call directive:

find { Passengers[] }
call FlightsService::sendFlightManifest

Write protection

Operations marked with write are excluded from being called during regular queries (i.e., in find or stream blocks). They can only be invoked using call.

Type conversion in mutations

TaxiQL automatically handles type conversion between your source data and the mutation operation’s input requirements:

// Source data model
model Movie {
   id: FilmId
   title: Title
}

// Target model for database
model Film {
   @Id
   filmId: FilmId
   title: Title
   reviewScore: ReviewScore  // Additional field not in source
}

service FilmDatabase {
   write operation saveFilm(Film):Film
}

// TaxiQL will automatically discover missing data
find { Movie[] }
call FilmDatabase::saveFilm

Explicit projections

You can control the transformation of data before mutation using projections:

find { Film[] } as {
   id: FilmId
   title: Title = upperCase(Title)  // Transform data before saving
   rating: ReviewScore
}
call FilmDatabase::saveFilm

Single vs batch mutations

The input type of your mutation operation determines whether data is processed individually or in batches:

service FilmService {
   // Processes one film at a time
   write operation saveSingle(Film):Film
   
   // Processes films in batches
   write operation saveBatch(Film[]):Film[]
}

Batch processing

Using array types in mutation operations signals that the operation expects to handle multiple records in a single call. This can be more efficient for bulk operations.

Previous
Transforming data (projections)
Next
Functions