@tpluscode/sparql-builder
Version:
Simple JS library to build SPARQL queries
62 lines (61 loc) • 1.71 kB
JavaScript
import { sparql } from '@tpluscode/rdf-string';
import RDF from '@rdfjs/data-model';
function isTemplateArray(arg) {
return Array.isArray(arg);
}
function addGrouping(builder) {
return (strings, ...values) => {
let by;
if (isTemplateArray(strings)) {
by = sparql(strings, ...values);
}
else if (typeof strings === 'string') {
by = sparql `${RDF.variable(strings)}`;
}
else {
by = sparql `${strings}`;
}
const grouping = { by };
const childBuilder = {
...builder,
groupings: [...builder.groupings, grouping],
};
const thenBuilder = {
...childBuilder,
THEN: {
BY: addGrouping(childBuilder),
},
};
return {
...thenBuilder,
AS(variable) {
if (typeof variable === 'string') {
grouping.as = RDF.variable(variable);
}
else {
grouping.as = variable;
}
return thenBuilder;
},
};
};
}
export default () => ({
groupings: [],
GROUP() {
return {
BY: addGrouping(this),
};
},
groupByClause() {
if (this.groupings.some(Boolean)) {
return this.groupings.reduce((result, grouping) => {
if (grouping.as) {
return sparql `${result}\n (${grouping.by} as ${grouping.as})`;
}
return sparql `${result}\n (${grouping.by})`;
}, sparql `GROUP BY`);
}
return sparql ``;
},
});