Creare trigger e funzioni definite dall'utente

Completato

Azure Cosmos DB supporta pre-trigger e post-trigger. I pre-trigger vengono eseguiti prima della modifica di un elemento del database e i post-trigger dopo. I trigger non vengono eseguiti automaticamente. È necessario specificare i trigger per ogni operazione di database in cui si desidera eseguirli. Dopo aver definito un trigger, è necessario registrarlo usando gli SDK di Azure Cosmos DB.

Per alcuni esempi d come registrare e chiamare un trigger, vedere pre-trigger e post-trigger.

Pre-trigger

L'esempio seguente illustra come viene usato un pre-trigger per convalidare le proprietà di un elemento di Azure Cosmos creato. Aggiunge una proprietà timestamp a un elemento appena aggiunto se non ne contiene uno.

function validateToDoItemTimestamp() {
    var context = getContext();
    var request = context.getRequest();

    // item to be created in the current operation
    var itemToCreate = request.getBody();

    // validate properties
    if (!("timestamp" in itemToCreate)) {
        var ts = new Date();
        itemToCreate["timestamp"] = ts.getTime();
    }

    // update the item that will be created
    request.setBody(itemToCreate);
}

I pre-trigger non possono avere parametri di input. L'oggetto richiesta nel trigger viene usato per modificare il messaggio di richiesta associato all'operazione. Nell'esempio precedente il pre-trigger viene eseguito quando si crea un elemento di Azure Cosmos e il corpo del messaggio di richiesta contiene l'elemento da creare in formato JSON.

Quando i trigger vengono registrati, è possibile specificare le operazioni con le quali è possibile eseguirli. Questo trigger deve essere creato con un valore TriggerOperation di TriggerOperation.Create, l'uso del trigger in un'operazione di sostituzione non è consentito.

Per alcuni esempi di come registrare e chiamare un pre-trigger, vedere l'articolo sui pre-trigger.

Post-trigger

L'esempio seguente mostra un post-trigger. Il trigger esegue query sull'elemento dei metadati, aggiornandolo con le informazioni relative all'elemento appena creato.

function updateMetadata() {
var context = getContext();
var container = context.getCollection();
var response = context.getResponse();

// item that was created
var createdItem = response.getBody();

// query for metadata document
var filterQuery = 'SELECT * FROM root r WHERE r.id = "_metadata"';
var accept = container.queryDocuments(container.getSelfLink(), filterQuery,
    updateMetadataCallback);
if(!accept) throw "Unable to update metadata, abort";

function updateMetadataCallback(err, items, responseOptions) {
    if(err) throw new Error("Error" + err.message);
        if(items.length != 1) throw 'Unable to find metadata document';

        var metadataItem = items[0];

        // update metadata
        metadataItem.createdItems += 1;
        metadataItem.createdNames += " " + createdItem.id;
        var accept = container.replaceDocument(metadataItem._self,
            metadataItem, function(err, itemReplaced) {
                    if(err) throw "Unable to update metadata, abort";
            });
        if(!accept) throw "Unable to update metadata, abort";
        return;
    }
}

Un aspetto importante da tenere presente è l'esecuzione transazionale dei trigger in Azure Cosmos DB. Questo post-trigger viene eseguito come parte della stessa transazione per lo stesso elemento sottostante. Un'eccezione durante l'esecuzione di post-trigger determina l'esito negativo dell'intera transazione. Viene eseguito il rollback di qualsiasi elemento di cui è stato eseguito il commit e verrà restituita un'eccezione.

Funzioni definite dall'utente

L'esempio seguente crea una funzione definita dall'utente per calcolare l'imposta sul reddito per varie fasce di reddito. Questa funzione definita dall'utente viene quindi usata all'interno di una query. Ai fini di questo esempio si supponga che ci sia un contenitore denominato "Incomes" con le proprietà indicate di seguito:

{
   "name": "User One",
   "country": "USA",
   "income": 70000
}

L'esempio di codice seguente è una definizione di funzione per calcolare l'imposta sul reddito per varie parentesi di reddito:

function tax(income) {

        if(income == undefined)
            throw 'no input';

        if (income < 1000)
            return income * 0.1;
        else if (income < 10000)
            return income * 0.2;
        else
            return income * 0.4;
    }