Published
Edited
Mar 31, 2021
Importers
1 star
Insert cell
md`# Cantabular API helpers`
Insert cell
QUERY = `
query($dataset: String!, $variables: [String!]!, $filters: [Filter!]) {
dataset(name: $dataset) {
table(variables: $variables, filters: $filters) {
dimensions {
count
categories {
code
label
}
variable {
name
label
}
}
values
}
}
}
`.replace(/\s+/g, " ")
Insert cell
FILTERED_QUERY = `
query($dataset: String!, $geographyVariable: String!, $topicVariable: String!, $topicCode: String!) {
dataset(name: $dataset) {
table(variables: [$geographyVariable, $topicVariable], filters: [{variable: $topicVariable, codes: [$topicCode]}]) {
dimensions {
count
categories {
code
label
}
variable {
name
label
}
}
values
}
}
}
`.replace(/\s+/g, " ");
Insert cell
POPULATION_QUERY = `
query($dataset: String!, $geographyVariable: String!) {
dataset(name: $dataset) {
table(variables: [$geographyVariable]) {
dimensions {
count
categories {
code
label
}
variable {
name
label
}
}
values
}
}
}
`.replace(/\s+/g, " ");
Insert cell
CATEGORIES_QUERY = `
query($dataset: String!, $variable: String!) {
dataset(name: $dataset) {
variables(names: [$variable]) {
edges {
node {
categories {
edges {
node {
code
label
}
}
}
}
}
}
}
}
`.replace(/\s+/g, " ");
Insert cell
VARIABLES_QUERY = `
query($dataset: String!) {
dataset(name: $dataset) {
variables {
edges {
node {
name
label
}
}
}
}
}
`.replace(/\s+/g, " ");
Insert cell
async function queryCantabularGraphQL(url, query, variables) {
return await d3.json(url, {
body: JSON.stringify({
"query": query,
"variables": variables,
}),
headers: {"Content-Type": "application/json"},
method: "POST",
mode: "cors"
});
}
Insert cell
function processCounts(table) {
const dimLengths = table.dimensions.map((d) => d.count);
const dimIndices = table.dimensions.map(() => 0);
let result = [];
for (let i = 0; i < table.values.length; i++) {
result.push(populateRow(table, dimIndices, i));
let j = dimIndices.length - 1;
while (j >= 0) {
dimIndices[j] += 1;
if (dimIndices[j] < dimLengths[j]) break;
dimIndices[j] = 0;
j -= 1;
}
}
return result;
}
Insert cell
function populateRow(table, indices, n) {
const obj = {};
indices.forEach((index, i) => {
const dim = table.dimensions[i];
obj[dim.variable.label] = dim.categories[index].label;
});
obj['value'] = table.values[n];
return obj;
}
Insert cell
d3 = require("d3@6");
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more