UNPKG

@tpluscode/sparql-builder

Version:

Simple JS library to build SPARQL queries

62 lines (61 loc) 1.71 kB
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 ``; }, });