Skip to content
Snippets Groups Projects
Commit 24e5c012 authored by esikkala's avatar esikkala
Browse files

Backend: use async/await, simplify sparql api

parent 65496e79
No related branches found
No related tags found
No related merge requests found
...@@ -17,61 +17,73 @@ app.use(function(req, res, next) { ...@@ -17,61 +17,73 @@ app.use(function(req, res, next) {
next(); next();
}); });
app.get(`${apiPath}/:resultClass/paginated`, (req, res, next) => { // https://medium.com/@Abazhenov/using-async-await-in-express-with-node-8-b8af872c0016
return getPaginatedResults({ app.get(`${apiPath}/:resultClass/paginated`, async (req, res, next) => {
resultClass: req.params.resultClass, try {
page: parseInt(req.query.page) || null, const data = await getPaginatedResults({
pagesize: parseInt(req.query.pagesize) || null, resultClass: req.params.resultClass,
uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), page: parseInt(req.query.page) || null,
spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters), pagesize: parseInt(req.query.pagesize) || null,
sortBy: req.query.sortBy || null, uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters),
sortDirection: req.query.sortDirection || null spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters),
}).then(data => { sortBy: req.query.sortBy || null,
sortDirection: req.query.sortDirection || null
});
res.json(data); res.json(data);
}).catch(next); } catch(error) {
next(error);
}
}); });
app.get(`${apiPath}/:resultClass/all`, (req, res, next) => { app.get(`${apiPath}/:resultClass/all`, async (req, res, next) => {
return getAllResults({ try {
resultClass: req.params.resultClass, const data = await getAllResults({
facetClass: req.query.facetClass || null, resultClass: req.params.resultClass,
uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), facetClass: req.query.facetClass || null,
spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters), uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters),
variant: req.query.variant || null, spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters),
}).then(data => { variant: req.query.variant || null,
});
res.json({ res.json({
resultCount: data.count, resultCount: data.count,
results: data results: data
}); });
}).catch(next); } catch(error) {
next(error);
}
}); });
app.get(`${apiPath}/:resultClass/instance/:uri`, (req, res, next) => { app.get(`${apiPath}/:resultClass/instance/:uri`, async (req, res, next) => {
return getByURI({ try {
resultClass: req.params.resultClass, const data = await getByURI({
facetClass: req.query.facetClass || null, resultClass: req.params.resultClass,
uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), facetClass: req.query.facetClass || null,
spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters), uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters),
variant: req.query.variant || null, spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters),
uri: req.params.uri variant: req.query.variant || null,
}) uri: req.params.uri
.then(data => { });
res.json(data[0]); // there is always one object in the 'data' array
}).catch(next); res.json(data[0]);
} catch(error) {
next(error);
}
}); });
app.get(`${apiPath}/:facetClass/facet/:id`, (req, res, next) => { app.get(`${apiPath}/:facetClass/facet/:id`, async (req, res, next) => {
return getFacet({ try {
facetClass: req.params.facetClass, const data = await getFacet({
facetID: req.params.id, facetClass: req.params.facetClass,
sortBy: req.query.sortBy, facetID: req.params.id,
sortDirection: req.query.sortDirection, sortBy: req.query.sortBy,
uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters), sortDirection: req.query.sortDirection,
spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters) uriFilters: req.query.uriFilters == null ? null : JSON.parse(req.query.uriFilters),
}) spatialFilters: req.query.spatialFilters == null ? null : JSON.parse(req.query.spatialFilters)
.then(data => { });
res.json(data); res.json(data);
}).catch(next); } catch(error) {
next(error);
}
}); });
/* Routes are matched to a url in order of their definition /* Routes are matched to a url in order of their definition
......
import SparqlSearchEngine from './SparqlSearchEngine'; import { runSelectQuery } from './SparqlApi';
import { prefixes } from './SparqlQueriesPrefixes'; import { prefixes } from './SparqlQueriesPrefixes';
import { endpoint, countQuery, facetResultSetQuery } from './SparqlQueriesGeneral'; import { endpoint, countQuery, facetResultSetQuery } from './SparqlQueriesGeneral';
import { manuscriptProperties, productionPlacesQuery, migrationsQuery } from './SparqlQueriesManuscripts'; import { manuscriptProperties, productionPlacesQuery, migrationsQuery } from './SparqlQueriesManuscripts';
...@@ -11,9 +11,7 @@ import { mapCount } from './Mappers'; ...@@ -11,9 +11,7 @@ import { mapCount } from './Mappers';
import { makeObjectList } from './SparqlObjectMapper'; import { makeObjectList } from './SparqlObjectMapper';
import { generateFilter } from './Filters'; import { generateFilter } from './Filters';
const sparqlSearchEngine = new SparqlSearchEngine(); export const getPaginatedResults = async ({
export const getPaginatedResults = ({
resultClass, resultClass,
page, page,
pagesize, pagesize,
...@@ -22,22 +20,34 @@ export const getPaginatedResults = ({ ...@@ -22,22 +20,34 @@ export const getPaginatedResults = ({
sortBy, sortBy,
sortDirection sortDirection
}) => { }) => {
return Promise.all([ const [ resultCount, paginatedData ] = await Promise.all([
getResultCount(resultClass, uriFilters, spatialFilters), getResultCount(resultClass, uriFilters, spatialFilters),
getPaginatedData({ resultClass, page, pagesize, uriFilters, spatialFilters, sortBy, sortDirection }), getPaginatedData({ resultClass, page, pagesize, uriFilters, spatialFilters, sortBy, sortDirection }),
]) ]);
.then(data => { return {
return { resultCount: resultCount,
resultCount: data[0].count, pagesize: pagesize,
pagesize: pagesize, page: page,
page: page, results: paginatedData
results: data[1] };
};
});
}; };
// return Promise.all([
// getResultCount(resultClass, uriFilters, spatialFilters),
// getPaginatedData({ resultClass, page, pagesize, uriFilters, spatialFilters, sortBy, sortDirection }),
// ])
// .then(data => {
// return {
// resultCount: data[0].count,
// pagesize: pagesize,
// page: page,
// results: data[1]
// };
// });
export const getAllResults = ({ export const getAllResults = ({
resultClass, resultClass, // TODO: handle other classes than manuscripts
facetClass, facetClass,
uriFilters, uriFilters,
spatialFilters, spatialFilters,
...@@ -73,7 +83,7 @@ export const getAllResults = ({ ...@@ -73,7 +83,7 @@ export const getAllResults = ({
// if (variant == 'productionPlaces') { // if (variant == 'productionPlaces') {
// console.log(prefixes + q) // console.log(prefixes + q)
// } // }
return sparqlSearchEngine.doSearch(prefixes + q, endpoint, makeObjectList); return runSelectQuery(prefixes + q, endpoint, makeObjectList);
}; };
const getResultCount = (resultClass, uriFilters, spatialFilters) => { const getResultCount = (resultClass, uriFilters, spatialFilters) => {
...@@ -91,7 +101,7 @@ const getResultCount = (resultClass, uriFilters, spatialFilters) => { ...@@ -91,7 +101,7 @@ const getResultCount = (resultClass, uriFilters, spatialFilters) => {
facetID: null facetID: null
})); }));
} }
return sparqlSearchEngine.doSearch(prefixes + q, endpoint, mapCount); return runSelectQuery(prefixes + q, endpoint, mapCount);
}; };
const getPaginatedData = ({ const getPaginatedData = ({
...@@ -142,7 +152,7 @@ const getPaginatedData = ({ ...@@ -142,7 +152,7 @@ const getPaginatedData = ({
} }
q = q.replace('<RESULT_SET_PROPERTIES>', resultSetProperties); q = q.replace('<RESULT_SET_PROPERTIES>', resultSetProperties);
// console.log(prefixes + q) // console.log(prefixes + q)
return sparqlSearchEngine.doSearch(prefixes + q, endpoint, makeObjectList); return runSelectQuery(prefixes + q, endpoint, makeObjectList);
}; };
export const getByURI = ({ export const getByURI = ({
...@@ -173,5 +183,5 @@ export const getByURI = ({ ...@@ -173,5 +183,5 @@ export const getByURI = ({
// if (variant === 'productionPlaces') { // if (variant === 'productionPlaces') {
// console.log(prefixes + q) // console.log(prefixes + q)
// } // }
return sparqlSearchEngine.doSearch(prefixes + q, endpoint, makeObjectList); return runSelectQuery(prefixes + q, endpoint, makeObjectList);
}; };
import { has } from 'lodash'; import { has } from 'lodash';
import SparqlSearchEngine from './SparqlSearchEngine'; import { runSelectQuery } from './SparqlApi';
import { endpoint, facetValuesQuery } from './SparqlQueriesGeneral'; import { endpoint, facetValuesQuery } from './SparqlQueriesGeneral';
import { prefixes } from './SparqlQueriesPrefixes'; import { prefixes } from './SparqlQueriesPrefixes';
import { facetConfigs } from './FacetConfigs'; import { facetConfigs } from './FacetConfigs';
...@@ -9,8 +9,6 @@ import { ...@@ -9,8 +9,6 @@ import {
mapHierarchicalFacet, mapHierarchicalFacet,
} from './Mappers'; } from './Mappers';
const sparqlSearchEngine = new SparqlSearchEngine();
export const getFacet = ({ export const getFacet = ({
facetClass, facetClass,
facetID, facetID,
...@@ -77,5 +75,5 @@ export const getFacet = ({ ...@@ -77,5 +75,5 @@ export const getFacet = ({
// //console.log(uriFilters) // //console.log(uriFilters)
// console.log(prefixes + q) // console.log(prefixes + q)
// } // }
return sparqlSearchEngine.doSearch(prefixes + q, endpoint, mapper); return runSelectQuery(prefixes + q, endpoint, mapper);
}; };
...@@ -18,10 +18,8 @@ export const mapPlaces = (sparqlBindings) => { ...@@ -18,10 +18,8 @@ export const mapPlaces = (sparqlBindings) => {
return results; return results;
}; };
export const mapCount = (sparqlBindings) => { export const mapCount = sparqlBindings => {
return { return sparqlBindings[0].count.value;
count: sparqlBindings[0].count.value
};
}; };
export const mapFacet = sparqlBindings => { export const mapFacet = sparqlBindings => {
......
//import fetch from 'node-fetch';
import axios from 'axios'; import axios from 'axios';
// const { URLSearchParams } = require('url'); import querystring from 'querystring';
const defaultSelectHeaders = { const defaultSelectHeaders = {
'Content-Type': 'application/x-www-form-urlencoded', 'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/sparql-results+json; charset=utf-8' 'Accept': 'application/sparql-results+json; charset=utf-8'
}; };
const defaultConstructHeaders = { // const defaultConstructHeaders = {
'Content-Type': 'application/x-www-form-urlencoded', // 'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'text/turtle' // 'Accept': 'text/turtle'
}; // };
class SparqlApi {
constructor({ endpoint }) {
this.endpoint = endpoint;
}
// query(query, { headers }) { export const runSelectQuery = async (query, endpoint, resultMapper) => {
// return new Promise((resolve, reject) => { try {
// const params = new URLSearchParams(); const response = await axios({
// params.append('query', query); method: 'post',
// fetch(this.endpoint, { headers: defaultSelectHeaders,
// method: 'post', url: endpoint,
// body: params, data: querystring.stringify({ query }),
// headers: headers, });
// }) const { bindings } = response.data.results;
// .then(res => { return bindings.length === 0 ? [] : resultMapper(bindings);
// if (res.ok) { // res.status >= 200 && res.status < 300 } catch(error) {
// return resolve(res.text()); if (error.response) {
// } else { // The request was made and the server responded with a status code
// return reject(res.statusText); // that falls out of the range of 2xx
// } console.log(error.response.data);
// }); //console.log(error.response.status);
// }); //console.log(error.response.headers);
// } } else if (error.request) {
// The request was made but no response was received
selectQuery = async query => { // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
try { // http.ClientRequest in node.js
const response = await axios({ console.log(error.request);
method: 'post', } else {
headers: defaultSelectHeaders, // Something happened in setting up the request that triggered an Error
url: this.endpoint, console.log('Error', error.message);
data: { query }
});
return JSON.parse(response);
} catch(error) {
console.error(error);
} }
console.log(error.config);
} }
};
// selectQuery(query, params = { headers: defaultSelectHeaders }) {
// return this.query(query, params).then(data => {
// return JSON.parse(data);
// });
// }
//
// constructQuery(query, params = { headers: defaultConstructHeaders }) {
// return this.query(query, params);
// }
}
export default SparqlApi;
import SparqlApi from './SparqlApi';
class SparqlSearchEngine {
doSearch(sparqlQuery, endpoint, mapper) {
const sparqlApi = new SparqlApi({ endpoint });
return sparqlApi.selectQuery(sparqlQuery)
.then((data) => {
if (data.results.bindings.length === 0) {
return [];
}
return mapper ? mapper(data.results.bindings) : data.results.bindings;
});
}
}
export default SparqlSearchEngine;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment