{"version":3,"sources":["../src/query.js"],"names":[],"mappings":"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","file":"src/query.js","sourcesContent":["\nconst REQUEST_LIMIT = 0; // 0 for no effect, may be use for testing to limit results returned\n\nclass Query {\n constructor(uri) {\n // uri: address of server\n this.uri = uri;\n }\n\n neo4j(query, params, onResult, cacheKey) {\n // query: string\n // params: Object with params as properties\n // onResult: function(error, data)\n // cacheKey: store/retrieve results with this key - if absent then the cache will be ignored\n let key = \"_aspace_\" + cacheKey;\n if (cacheKey && localStorage[key]) {\n let resultFromCache = JSON.parse(localStorage[key]);\n if (!resultFromCache.error) {\n onResult(resultFromCache.error, resultFromCache.data);\n return;\n }\n }\n //TODO: actually check for changes before using cache\n\n if (REQUEST_LIMIT) query += \" limit \" + REQUEST_LIMIT;\n d3.json(this.uri)\n //TODO When the landing page has been created, pass authentication detail to use in Query constructor\n // Base64 of Neo4j:Anz@1016 (current test authentication) - can change in Neo4j browser using :server change-password\n .header(\"Authorization\", \"Basic bmVvNGo6QW56QDEwMTY=\")\n .post(JSON.stringify({query, params}), (error, data) => {\n if (cacheKey) {\n localStorage[key] = JSON.stringify({\n timestamp: Date.now(),\n uri: this.uri,\n query,\n params,\n error,\n data\n });\n }\n onResult(error, data);\n })\n ;\n }\n\n //TODO: this is redundant when we are using getSpaceNodeData - remove it\n getSpaceNames(onResult) {\n this.neo4j(\n \"match (n:SpaceNode) return n.name\",\n {},\n (error, data) => onResult(_(data.data).map(function(d) { return d[0]; } )),\n \"spaceNodeNames\"\n );\n }\n\n promiseSpaceNodeData() {\n return new Promise((resolve, reject) => {\n // resolve: {name: {colour, paths},...}\n // reject: error\n this.neo4j(\n `match\n (n:SpaceNode),\n p = shortestPath((n)-[*]-(m:SpaceNode))\n where\n n.name <> m.name\n and reduce(result = True, n in nodes(p) | result and ('SpaceNode' in labels(n)))\n return\n n.name,\n n.colour,\n collect({path: extract(s in nodes(p) | s.name)})`,\n {},\n (error, data) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve(data.data.map(d => ({\n name: d[0],\n colour: d[1],\n paths: d[2].map(d => d.path)\n })));\n },\n \"spaceNodeData\"\n );\n })\n }\n\n promiseHierarchyData(attribute) {\n // attribute: name of an attribute of type \"hierarchy\"\n return new Promise((resolve, reject) => {\n // resolve: {name, hierarchy}\n // reject: error\n this.neo4j(\n `match\n (a:SpaceAttribute {name: {name}})-[:exists_in]->(root:Hierarchy),\n p = (root)-[:has_child*]->(leaf)\n where\n not 'Hierarchy' in labels(leaf)\n return\n extract(n in nodes(p) | n.name) as path,\n id(leaf) as hierarchy_id`,\n {name: attribute},\n (error, data) => {\n if (error) {\n reject(error);\n return;\n }\n\n let top = [];\n for (let d of data.data) {\n let children = top;\n let path = d[0];\n for (let j in path) {\n let childIndex = children.map(d => d.name).indexOf(path[j]);\n if (childIndex < 0) {\n childIndex = children.length;\n let child = {\n name: path[j],\n children: []\n };\n // If this is a leaf, assign the id\n if (+j === path.length - 1) {\n child.hierarchy_id = d[1];\n }\n children.push(child);\n }\n children = children[childIndex].children;\n }\n }\n // Properly form into a d3-friendly hierarchy object\n if (top.length > 1) {\n resolve({\n name: attribute,\n hierarchy: {\n root: {\n name: \"root\",\n children: top\n }\n }\n });\n }\n else {\n resolve({\n name: attribute,\n hierarchy: {\n root: top[0]\n }\n });\n }\n },\n attribute + \"_hierarchyData\"\n );\n })\n }\n\n promiseSpaceAttributeData(name) {\n return new Promise((resolve, reject) => {\n // resolve: [{name, type, hierarchyRoot?},...], hierarchyAttributes)\n // reject: error\n this.neo4j(\n `match (n:SpaceNode { name: {name} })-[:has]->(a:SpaceAttribute)\n return n.name as node, a.name, a.pretty, a.type\n union\n match (n:SpaceNode { name: {name} })--(m:SpaceNode)-[:has]->(a:SpaceAttribute)\n return m.name as node, a.name, a.pretty, a.type`,\n {name},\n (error, data) => {\n if (error) {\n reject(error);\n return;\n }\n\n let attributes = [];\n let aggNodes = d3.set();\n for (let d of data.data) {\n if (d[0] === name) {\n // Regular attributes\n attributes.push({\n node: d[0],\n name: d[1],\n pretty: d[2],\n type: d[3],\n hidden: false\n });\n }\n else {\n // Get the aggregates where relevant\n if (!aggNodes.has(d[0])) {\n aggNodes.add(d[0]);\n attributes.push({\n node: d[0],\n name: d[0],\n pretty: \"Count\",\n type: \"count\",\n hidden: false\n });\n }\n if (d[3] === \"currency\") {\t\t//TODO: include other summable types, e.g. people in BU\n attributes.push({\n node: d[0],\n name: d[1],\n pretty: \"Sum of \" + d[2],\n type: \"sum_currency\",\n hidden: false\n });\n }\n }\n }\n resolve(attributes);\n },\n name + \"_spaceAttributeData\"\n );\n })\n }\n\n promisePointData(name, attributes) {\n return new Promise((resolve, reject) => {\n // resolve:\n // reject: error\n let queryMatch = `match (n:${name}) `;\n let queryReturn = \"return id(n) as neo4jId\";\n let nodes = d3.set([name]);\n for (let a of attributes) {\n if (!nodes.has(a.node)) {\n nodes.add(a.node);\n queryMatch += (`, (n)--(o${a.node}:${a.node}) `);\n }\n switch (a.type) {\n //TODO: add other aggregates, like avg, med, sd?\n case \"count\":\n queryReturn += `, count(o${a.node})`;\n break;\n case \"sum_currency\":\n queryReturn += `, sum(o${a.node}.${a.name})`;\n break;\n // Hierarchy types need to match with the corresponding leaf in the attribute's hierarchy model\n case \"hierarchy\":\n queryReturn += \", id(n) as hierarchy_id\";\n break;\n default:\n queryReturn += \", n.\" + a.name;\n }\n }\n attributes.unshift({\n name: \"neo4jId\",\n pretty: \"Neo4j ID\",\n node: name,\n type: \"unique\",\n hidden: true\n });\n this.neo4j(\n queryMatch + queryReturn,\n {},\t\t//TODO: use params properly\n (error, data) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(data.data);\n },\n name + \"_data\"\n );\n })\n }\n\n promiseRelationshipData(name, paths) {\n return new Promise((resolve, reject) => {\n // resolve: {nameNode: [idThere, [idHere, ...]]}\n // reject: error\n let query = paths.map(path => {\n let pathString = `(n:${path[0]})`\n + path.slice(1, -1).map(d => `--(:${d})`).join(\"\")\n + `--(m:${path[path.length - 1]})`\n ;\n return `match ${pathString} return distinct '${path[path.length - 1]}' as name, id(m), collect(distinct id(n)) `\n ;\n }).join(\" union \");\n\n this.neo4j(\n query,\n {},\n (error, data) => {\n if (error) {\n reject(error);\n return;\n }\n let relationships = {};\n for (let d of data.data) {\n if (!relationships[d[0]]) {\n relationships[d[0]] = [];\n }\n relationships[d[0]].push([d[1], d[2]]);\n }\n\n resolve(relationships);\n },\n name + \"_relationships\"\n );\n })\n }\n\n}\n\n"]}