From 5772751558ac0d9b813a57a109bd15d411b47a9c Mon Sep 17 00:00:00 2001 From: Daviti Gogshelidze <daviti1@mail.com> Date: Fri, 14 Jun 2019 17:03:03 +0200 Subject: [PATCH] Syncronise spatial search with KG --- deploy/datasets/query.js | 111 +++++++++++++++++++++++-------- deploy/datasets/spatialRouter.js | 5 +- 2 files changed, 88 insertions(+), 28 deletions(-) diff --git a/deploy/datasets/query.js b/deploy/datasets/query.js index 17ee2c7b7..973e47243 100644 --- a/deploy/datasets/query.js +++ b/deploy/datasets/query.js @@ -17,21 +17,10 @@ let getPublicAccessToken const fetchDatasetFromKg = async (arg) => { - const accessToken = arg && arg.user && arg.user.tokenset && arg.user.tokenset.access_token - const releasedOnly = !accessToken - let publicAccessToken - if (!accessToken && getPublicAccessToken) { - publicAccessToken = await getPublicAccessToken() - } - const option = accessToken || publicAccessToken || process.env.ACCESS_TOKEN - ? { - auth: { - 'bearer': accessToken || publicAccessToken || process.env.ACCESS_TOKEN - } - } - : {} + const userState = getUserToken(arg) + return await new Promise((resolve, reject) => { - request(`${queryUrl}${releasedOnly ? '&databaseScope=RELEASED' : ''}`, option, (err, resp, body) => { + request(`${queryUrl}${userState.releasedOnly ? '&databaseScope=RELEASED' : ''}`, userState.option, (err, resp, body) => { if (err) return reject(err) if (resp.statusCode >= 400) @@ -196,17 +185,15 @@ exports.getPreview = ({ datasetName, templateSelected }) => getPreviewFile({ dat * change to real spatial query */ const cachedMap = new Map() -const fetchSpatialDataFromKg = async ({ templateName, queryArg }) => { - // const cachedResult = cachedMap.get(templateName) - // if (cachedResult) - // return cachedResult - - try { - const filename = path.join(STORAGE_PATH, templateName + '.json') +const fetchSpatialDataFromKg = async ({ templateName, queryArg, req }) => { + try { + // const filename = path.join(STORAGE_PATH, templateName + '.json') + const filename = path.join(__dirname + '/data/waxholm-hbp-00937-transformed.json') const exists = fs.existsSync(filename) if (!exists) return [] + const data = fs.readFileSync(filename, 'utf-8') const json = JSON.parse(data) @@ -216,16 +203,39 @@ const fetchSpatialDataFromKg = async ({ templateName, queryArg }) => { cubeDots.push(element.split('_')) }); - // cachedMap.set(templateName, json.filter(filterByqueryArg(cubeDots))) - return json.filter(filterByqueryArg(cubeDots)) - } catch (e) { + + if (templateName !== 'Waxholm Space rat brain atlas v.2.0') { + return json.filter(filterByqueryArg(cubeDots)) + } else { + if (user && user.req) { + const centerDifference = [-9.550781, -24.355468, -9.707031] + let calculatedCubeDots = [] + cubeDots.forEach((dots, index) => { + calculatedCubeDots[index] = cubeDots[index].map((num, idx) => { + return +num - centerDifference[idx] + }) + }) + + calculatedCubeDots = calculatedCubeDots.map(x => transformToWoxel(x)) + + const resultFromKG = await getSpatialSearchOk({calculatedCubeDots, req}) + + if (resultFromKG && resultFromKG['total'] && resultFromKG['total'] > 0) { + return json.filter(filterByqueryArg(cubeDots)) + } else { + return [] + } + } + + } + } catch (e) { console.log('datasets#query.js#fetchSpatialDataFromKg', 'read file and parse json failed', e) return [] } } -exports.getSpatialDatasets = async ({ templateName, queryGeometry, queryArg }) => { - return await fetchSpatialDataFromKg({ templateName, queryArg }) +exports.getSpatialDatasets = async ({ templateName, queryGeometry, queryArg, req }) => { + return await fetchSpatialDataFromKg({ templateName, queryArg, req }) } @@ -242,4 +252,53 @@ function filterByqueryArg(cubeDots) { } return false; } + + +async function getSpatialSearchOk(arg) { + + const userState = getUserToken(arg.req) + const option = { + headers: { + 'Authorization': userState.token + } + } + + const spatialQuery = 'https://kg.humanbrainproject.org/query/minds/core/dataset/v1.0.0/spatialSimple/instances?size=10&boundingBox=waxholmV2:180,750,390,200,780,400' + + return await new Promise((resolve, reject) => { + request(`${spatialQuery}${'&boundingBox=waxholmV2:' + arg.calculatedCubeDots[0].concat(arg.calculatedCubeDots[1])}${userState.releasedOnly ? '&databaseScope=RELEASED' : ''}`, option, (err, resp, body) => { + if (err) + return reject(err) + if (resp.statusCode >= 400) + return reject(resp.statusCode) + const json = JSON.parse(body) + return resolve(json) + }) + }) +} + +function getUserToken(arg) { + const accessToken = arg && arg.user && arg.user.tokenset && arg.user.tokenset.access_token + const releasedOnly = !accessToken + let publicAccessToken + if (!accessToken && getPublicAccessToken) { + publicAccessToken = await getPublicAccessToken() + } + const option = accessToken || publicAccessToken || process.env.ACCESS_TOKEN + ? { + auth: { + 'bearer': accessToken || publicAccessToken || process.env.ACCESS_TOKEN + } + } + : {} + + return {option, releasedOnly, token: accessToken || publicAccessToken || process.env.ACCESS_TOKEN} +} + +const transformToWoxel = (coord) => { + const transl = [-9550781,-24355468,-9707031].map(v => v / 1e6) + const voxelDim = [0.0390625, 0.0390625, 0.0390625] + return coord.map((v, idx) => (v - transl[idx]) / voxelDim[idx] ) +} + diff --git a/deploy/datasets/spatialRouter.js b/deploy/datasets/spatialRouter.js index 584eae6db..400da2aee 100644 --- a/deploy/datasets/spatialRouter.js +++ b/deploy/datasets/spatialRouter.js @@ -24,8 +24,9 @@ router.get('/templateName/:templateName/:queryGeometry/:queryArg', (req, res, ne error: errorString, trace: 'dataset#spatialRouter' }) - - getSpatialDatasets({ templateName, queryGeometry, queryArg }) + + + getSpatialDatasets({ templateName, queryGeometry, queryArg, req }) .then(arr => res.status(200).json(arr)) .catch(error => { next({ -- GitLab