Skip to main content

Bulk Update with RestQL

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

Assume these credentials:

Driver download

Download the appropriate drivers 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 = "[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]", "value": "James"},
{ "_key": "[email protected]", "value": "Han"},
{ "_key": "[email protected]", "value": "Bruce"}
];

const updateKeys = ["[email protected]", "[email protected]"];
const updateKeyValue = {
"[email protected]": { key: "[email protected]", value: "Bruce Wayne"},
"[email protected]": { key: "[email protected]", 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(FEDERATION_URL);

/* -------------------- Log in ([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/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();