Skip to main content

Bulk Update with RestQL

The following example bulk updates key-value collection data via RestQL.

Assume these credentials:

SDK download

Download the appropriate SDK for Python or JavaScript.

pyC8 requires Python 3.5+. Python 3.6 or higher is recommended

To install pyC8, run

$ pip3 install pyC8

Alternatively, you can use conda:

conda install -c conda-forge pyC8

Alternatively, you can use pipenv:

pipenv install --pre pyC8

Any one of these three commands will install Python and enable you to develop applications.

Code Sample

class APIRequest {
_headers = {
Accept: "application/json",
"Content-Type": "application/json",
};

constructor(url) {
this._url = url;
}

login(email, password) {
const endpoint = "/_open/auth";
const self = this;
return new Promise(function (resolve, reject) {
self.req(endpoint, {
body: { email, password },
method: "POST",
})
.then(({ jwt, ...data }) => {
self._headers.authorization = `bearer ${jwt}`;
resolve(data);
})
.catch(reject);
});
}

_handleResponse(response, resolve, reject) {
if (response.ok) {
resolve(response.json());
} else {
reject(response);
}
}

req(endpoint, { body, ...options } = {}) {
const self = this;
return new Promise(function (resolve, reject) {
fetch(self._url + endpoint, {
headers: self._headers,
body: body ? JSON.stringify(body) : undefined,
...options,
}).then((response) => self._handleResponse(response, resolve, reject));
});
}
}

const EMAIL = "nemo@nautilus.com";
const PASSWORD = "xxxxxx";
const HTTP_URL = "https://api-play.paas.macrometa.io";
const FABRIC_NAME = "_system";
const COLLECTION_NAME = "superhero";

//Variables
const inputDocs = [
{ "_key": "james.kirk@mafabriccrometa.io", "value": "James"},
{ "_key": "han.solo@macrfabricometa.io", "value": "Han"},
{ "_key": "bruce.wayne@mfabricacrometa.io", "value": "Bruce"}
];

const updateKeys = ["james.kirk@mafabriccrometa.io", "bruce.wayne@mfabricacrometa.io"];
const updateKeyValue = {
"bruce.wayne@mfabricacrometa.io": { key: "bruce.wayne@mfabricacrometa.io", value: "Bruce Wayne"},
"james.kirk@mafabriccrometa.io": { key: "james.kirk@mafabriccrometa.io", value: "James T Kirk"}
};

//Queries
const insertData = `FOR doc in @InputDocs \
INSERT {"_key": doc._key, "value": doc.value} IN ${COLLECTION_NAME}`;

const getData = `FOR doc IN ${COLLECTION_NAME} RETURN doc`;

const updateData = `FOR i IN ${COLLECTION_NAME} \
FILTER i._key IN @updateKeys \
UPDATE i with { value: (i._key == @updateKeyValue[i._key].key) ? @updateKeyValue[i._key].value : i.value } IN ${COLLECTION_NAME}`;

const run = async function () {
try {
const connection = new APIRequest(HTTP_URL);

/* -------------------- Log in (nemo@nautilus.com/xxxxxxx) -------------------- */
await connection.login(EMAIL, PASSWORD);
console.log("Login Successfully using", EMAIL);

/* -------------------------- Create doc collection ------------------------- */
const collection = await connection.req(`/_fabric/${FABRIC_NAME}/_api/kv/${COLLECTION_NAME}`, {
body: { stream: false },
method: "POST",
});

console.log("COLLECTION CREATED SUCCESSFULLY", collection);

/* ------------------------ Save a RestQL query ----------------------- */
const saveRestQlQuery = (queryName, query, parameter) =>
connection.req(`/_fabric/${FABRIC_NAME}/_api/restql`, {
body: {
query: {
name: queryName,
value: query,
parameter,
},
},
method: "POST",
});

console.log("------- Save the RestQl Queries ------");
await saveRestQlQuery("insertData", insertData, {});
await saveRestQlQuery("getData", getData, {});
await saveRestQlQuery("updateData", updateData, {});

console.log("Queries Saved Successfully");

/* ----------------------- Run a RestQL query ---------------------- */
const executeRestql = (queryName, parameter) =>
connection.req(`/_fabric/${FABRIC_NAME}/_api/restql/execute/${queryName}`, {
body: {
bindVars: parameter,
},
method: "POST",
});

console.log("------- Bulk run RestQl queries ------");

await executeRestql("insertData", {
InputDocs: inputDocs,
});
console.log("Data Inserted \n");

console.log("Get Data...");

const dataBeforeUpdate = await executeRestql("getData");
console.log(dataBeforeUpdate.result);
console.log("\n");

await executeRestql("updateData", {
updateKeys,
updateKeyValue,
});

console.log("Data updated \n");

const dataAfterUpdate = await executeRestql("getData");
console.log(dataAfterUpdate.result);
console.log("\n");
} catch (e) {
console.error(e);
}
};

run();