Skip to main content

Bulk Update with RestQL

This tutorial is about using RestQL to bulk update document Collection data.

note

If you are new to Macrometa GDN, we strongly recommend reading Essentials of Macrometa GDN.

Pre-requisite

Let's assume your

Driver download

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

To install pyC8, simply run

$ pip3 install pyC8

or, if you prefer to use conda:

conda install -c conda-forge pyC8

or pipenv:

pipenv install --pre pyC8

Once the installation process is finished, you can begin developing applications in Python.

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 = "[email protected]";
const PASSWORD = "xxxxxx";
const FEDERATION_URL = "https://api-gdn.paas.macrometa.io";
const FABRIC_NAME = "_system";
const COLLECTION_NAME = "superhero";

//Variables
const inputDocs = [
{ _key: "[email protected]", firstname: "James", lastname: "Kirk", email: "[email protected]", zipcode: "12312" },
{ _key: "[email protected]", firstname: "Han", lastname: "Solo", email: "[email protected]", zipcode: "12311" },
{ _key: "[email protected]", firstname: "Bruce", lastname: "Wayne", email: "[email protected]", zipcode: "12345" }
];

const updateKeys = ["[email protected]", "[email protected]"];
const updateKeyValue = {
"[email protected]": { key: "[email protected]", zipcode: "22222" },
"[email protected]": { key: "[email protected]", zipcode: "55555" },
};

//Queries
const insertData = `FOR doc in @InputDocs \
INSERT {"firstname":doc.firstname, "lastname":doc.lastname, "email":doc.email, "zipcode":doc.zipcode, "_key": doc._key} 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 { zipcode: (i._key == @updateKeyValue[i._key].key) ? @updateKeyValue[i._key].zipcode : i.zipcode } IN ${COLLECTION_NAME}`;

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

/* -------------------- Login ([email protected]/xxxxxxx) -------------------- */
await connection.login(EMAIL, PASSWORD);
console.log("Login Successfully using", EMAIL);

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

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

/* ------------------------ Saving 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");

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

console.log("------- Execute the 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();