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

Add support for csv result format

parent 73705e16
No related branches found
No related tags found
No related merge requests found
...@@ -41,12 +41,19 @@ app.get(`${apiPath}/:resultClass/paginated`, async (req, res, next) => { ...@@ -41,12 +41,19 @@ app.get(`${apiPath}/:resultClass/paginated`, async (req, res, next) => {
try { try {
const data = await getPaginatedResults({ const data = await getPaginatedResults({
resultClass: req.params.resultClass, resultClass: req.params.resultClass,
page: parseInt(req.query.page) || null, page: req.query.page == null ? null : req.query.page,
pagesize: parseInt(req.query.pagesize) || null, pagesize: parseInt(req.query.pagesize) || null,
sortBy: req.query.sortBy || null, sortBy: req.query.sortBy || null,
sortDirection: req.query.sortDirection || null, sortDirection: req.query.sortDirection || null,
constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints), constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints),
resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat
}); });
// test csv result format
// res.writeHead(200, {
// 'Content-Type': 'text/csv',
// 'Content-Disposition': 'attachment; filename=results.csv'
// });
// res.end(data);
res.json(data); res.json(data);
} catch(error) { } catch(error) {
next(error); next(error);
...@@ -60,6 +67,7 @@ app.get(`${apiPath}/:resultClass/all`, async (req, res, next) => { ...@@ -60,6 +67,7 @@ app.get(`${apiPath}/:resultClass/all`, async (req, res, next) => {
facetClass: req.query.facetClass || null, facetClass: req.query.facetClass || null,
constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints), constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints),
variant: req.query.variant || null, variant: req.query.variant || null,
resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat
}); });
res.json({ res.json({
results: data results: data
...@@ -74,6 +82,7 @@ app.get(`${apiPath}/:resultClass/count`, async (req, res, next) => { ...@@ -74,6 +82,7 @@ app.get(`${apiPath}/:resultClass/count`, async (req, res, next) => {
const count = await getResultCount({ const count = await getResultCount({
resultClass: req.params.resultClass, resultClass: req.params.resultClass,
constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints), constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints),
resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat
}); });
res.json({ count }); res.json({ count });
} catch(error) { } catch(error) {
...@@ -88,7 +97,8 @@ app.get(`${apiPath}/:resultClass/instance/:uri`, async (req, res, next) => { ...@@ -88,7 +97,8 @@ app.get(`${apiPath}/:resultClass/instance/:uri`, async (req, res, next) => {
facetClass: req.query.facetClass || null, facetClass: req.query.facetClass || null,
constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints), constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints),
variant: req.query.variant || null, variant: req.query.variant || null,
uri: req.params.uri uri: req.params.uri,
resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat
}); });
// there is always one object in the 'data' array // there is always one object in the 'data' array
res.json(data[0]); res.json(data[0]);
...@@ -105,6 +115,7 @@ app.get(`${apiPath}/:facetClass/facet/:id`, async (req, res, next) => { ...@@ -105,6 +115,7 @@ app.get(`${apiPath}/:facetClass/facet/:id`, async (req, res, next) => {
sortBy: req.query.sortBy || null, sortBy: req.query.sortBy || null,
sortDirection: req.query.sortDirection || null, sortDirection: req.query.sortDirection || null,
constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints), constraints: req.query.constraints == null ? null : JSON.parse(req.query.constraints),
resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat
}); });
res.json(data); res.json(data);
} catch(error) { } catch(error) {
...@@ -134,6 +145,7 @@ app.get(`${apiPath}/search`, async (req, res, next) => { ...@@ -134,6 +145,7 @@ app.get(`${apiPath}/search`, async (req, res, next) => {
longMin: longMin, longMin: longMin,
latMax: latMax, latMax: latMax,
longMax: longMax, longMax: longMax,
resultFormat: req.query.resultFormat == null ? 'json' : req.query.resultFormat
}); });
res.json(data); res.json(data);
} catch(error) { } catch(error) {
......
...@@ -24,7 +24,8 @@ export const getPaginatedResults = async ({ ...@@ -24,7 +24,8 @@ export const getPaginatedResults = async ({
pagesize, pagesize,
constraints, constraints,
sortBy, sortBy,
sortDirection sortDirection,
resultFormat
}) => { }) => {
const data = await getPaginatedData({ const data = await getPaginatedData({
resultClass, resultClass,
...@@ -32,20 +33,26 @@ export const getPaginatedResults = async ({ ...@@ -32,20 +33,26 @@ export const getPaginatedResults = async ({
pagesize, pagesize,
constraints, constraints,
sortBy, sortBy,
sortDirection sortDirection,
resultFormat
}); });
return { if (resultFormat === 'json') {
pagesize: pagesize, return {
page: page, pagesize: pagesize,
results: data page: page,
}; results: data
};
} else {
return data;
}
}; };
export const getAllResults = ({ export const getAllResults = ({
// resultClass, // TODO: handle other classes than manuscripts // resultClass, // TODO: handle other classes than manuscripts
facetClass, facetClass,
constraints, constraints,
variant variant,
resultFormat
}) => { }) => {
let q = ''; let q = '';
let filterTarget = ''; let filterTarget = '';
...@@ -80,12 +87,13 @@ export const getAllResults = ({ ...@@ -80,12 +87,13 @@ export const getAllResults = ({
// if (variant == 'productionPlaces') { // if (variant == 'productionPlaces') {
// console.log(prefixes + q) // console.log(prefixes + q)
// } // }
return runSelectQuery(prefixes + q, endpoint, makeObjectList); return runSelectQuery(prefixes + q, endpoint, makeObjectList, resultFormat);
}; };
export const getResultCount = ({ export const getResultCount = ({
resultClass, resultClass,
constraints constraints,
resultFormat
}) => { }) => {
let q = countQuery; let q = countQuery;
q = q.replace('<FACET_CLASS>', facetConfigs[resultClass].facetClass); q = q.replace('<FACET_CLASS>', facetConfigs[resultClass].facetClass);
...@@ -100,7 +108,7 @@ export const getResultCount = ({ ...@@ -100,7 +108,7 @@ export const getResultCount = ({
facetID: null facetID: null
})); }));
} }
return runSelectQuery(prefixes + q, endpoint, mapCount); return runSelectQuery(prefixes + q, endpoint, mapCount, resultFormat);
}; };
const getPaginatedData = ({ const getPaginatedData = ({
...@@ -109,7 +117,8 @@ const getPaginatedData = ({ ...@@ -109,7 +117,8 @@ const getPaginatedData = ({
pagesize, pagesize,
constraints, constraints,
sortBy, sortBy,
sortDirection sortDirection,
resultFormat
}) => { }) => {
let q = facetResultSetQuery; let q = facetResultSetQuery;
const facetConfig = facetConfigs[resultClass]; const facetConfig = facetConfigs[resultClass];
...@@ -163,8 +172,8 @@ const getPaginatedData = ({ ...@@ -163,8 +172,8 @@ const getPaginatedData = ({
resultSetProperties = ''; resultSetProperties = '';
} }
q = q.replace('<RESULT_SET_PROPERTIES>', resultSetProperties); q = q.replace('<RESULT_SET_PROPERTIES>', resultSetProperties);
// console.log(prefixes + q) console.log(prefixes + q);
return runSelectQuery(prefixes + q, endpoint, makeObjectList); return runSelectQuery(prefixes + q, endpoint, makeObjectList, resultFormat);
}; };
export const getByURI = ({ export const getByURI = ({
...@@ -172,7 +181,8 @@ export const getByURI = ({ ...@@ -172,7 +181,8 @@ export const getByURI = ({
facetClass, facetClass,
constraints, constraints,
//variant, //variant,
uri uri,
resultFormat
}) => { }) => {
let q; let q;
switch (resultClass) { switch (resultClass) {
...@@ -194,5 +204,5 @@ export const getByURI = ({ ...@@ -194,5 +204,5 @@ export const getByURI = ({
// if (variant === 'productionPlaces') { // if (variant === 'productionPlaces') {
// console.log(prefixes + q) // console.log(prefixes + q)
// } // }
return runSelectQuery(prefixes + q, endpoint, makeObjectList); return runSelectQuery(prefixes + q, endpoint, makeObjectList, resultFormat);
}; };
...@@ -25,6 +25,7 @@ export const getFacet = ({ ...@@ -25,6 +25,7 @@ export const getFacet = ({
sortBy, sortBy,
sortDirection, sortDirection,
constraints, constraints,
resultFormat
}) => { }) => {
const facetConfig = facetConfigs[facetClass][facetID]; const facetConfig = facetConfigs[facetClass][facetID];
// choose query template and result mapper: // choose query template and result mapper:
...@@ -104,7 +105,7 @@ export const getFacet = ({ ...@@ -104,7 +105,7 @@ export const getFacet = ({
// if (facetID == 'productionPlace') { // if (facetID == 'productionPlace') {
// console.log(prefixes + q) // console.log(prefixes + q)
// } // }
return runSelectQuery(prefixes + q, endpoint, mapper); return runSelectQuery(prefixes + q, endpoint, mapper, resultFormat);
}; };
const generateSelectedBlock = ({ const generateSelectedBlock = ({
......
import axios from 'axios'; import axios from 'axios';
import querystring from 'querystring'; import querystring from 'querystring';
const defaultSelectHeaders = {
'Content-Type': 'application/x-www-form-urlencoded',
'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'
// }; // };
export const runSelectQuery = async (query, endpoint, resultMapper) => { export const runSelectQuery = async (query, endpoint, resultMapper, resultFormat) => {
let MIMEtype = resultFormat === 'json'
? 'application/sparql-results+json; charset=utf-8'
: 'text/csv; charset=utf-8';
const headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': MIMEtype
};
try { try {
const response = await axios({ const response = await axios({
method: 'post', method: 'post',
headers: defaultSelectHeaders, headers: headers,
url: endpoint, url: endpoint,
data: querystring.stringify({ query }), data: querystring.stringify({ query }),
}); });
return resultMapper(response.data.results.bindings); if (resultFormat === 'json') {
return resultMapper(response.data.results.bindings);
} else {
return response.data;
}
} catch(error) { } catch(error) {
if (error.response) { if (error.response) {
// The request was made and the server responded with a status code // The request was made and the server responded with a status code
......
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