grnsight
Version:
Web app and service for visualizing models of gene regulatory networks
100 lines (91 loc) • 3.77 kB
JavaScript
const Sequelize = require("sequelize");
require("dotenv").config();
var env = process.env.NODE_ENV || "development";
var config = require("../config/config")[env];
var sequelize = new Sequelize(
config.databaseName,
process.env.DB_USERNAME,
process.env.DB_PASSWORD,
{
host: config.databaseHost,
dialect: config.databaseDialect,
pool: {
max: 5,
min: 0,
idle: 10000
}
}
);
const buildNetworkSourceQuery = function () {
return "SELECT * FROM gene_regulatory_network.source ORDER BY time_stamp DESC;";
};
const buildNetworkGeneFromSourceQuery = function (gene) {
return `SELECT DISTINCT gene_id, display_gene_id FROM
gene_regulatory_network.gene WHERE (gene.gene_id ='${gene}'
OR gene.display_gene_id ='${gene}')`;
};
const buildNetworkGenesQuery = function (geneString) {
let genes = "(";
let geneList = geneString.split(",");
geneList.forEach(x => genes += ( `(network.regulator_gene_id =\'${x}\') OR `));
genes = `${genes.substring(0, genes.length - 4)}) AND (`;
geneList.forEach(x => genes += ( `(network.target_gene_id =\'${x}\') OR `));
return `${genes.substring(0, genes.length - 4)})`;
};
const buildGenerateNetworkQuery = function (genes, source, timestamp) {
return `SELECT DISTINCT regulator_gene_id, target_gene_id FROM
gene_regulatory_network.network WHERE
time_stamp='${timestamp}' AND source='${source}' AND
${buildNetworkGenesQuery(genes)} ORDER BY regulator_gene_id DESC;`;
};
const buildQueryByType = function (queryType, query) {
const networkQueries = {
"NetworkSource": () => buildNetworkSourceQuery(),
"NetworkGeneFromSource": () => buildNetworkGeneFromSourceQuery(query.gene),
"GenerateNetwork": () => buildGenerateNetworkQuery(query.genes, query.source, query.timestamp)
};
if (Object.keys(networkQueries).includes(query.type)) {
return networkQueries[query.type]();
}
};
// const response = convertResponseToJSON(req.query.type, req.query, stdname);
const convertResponseToJSON = function (queryType, query, totalOutput) {
let JSONOutput = {};
switch (queryType) {
case "NetworkSource":
JSONOutput.sources = {};
totalOutput.forEach(function (connection) {
const timestamp = connection.time_stamp;
const source = connection.source;
const displayName = connection.display_name;
JSONOutput.sources[`${displayName}: ${timestamp.toISOString().split("T")[0]}`] = {timestamp, source};
});
return JSONOutput;
case "NetworkGeneFromSource":
JSONOutput.displayGeneId = totalOutput.length > 0 ? totalOutput[0].display_gene_id : null;
JSONOutput.geneId = totalOutput.length > 0 ? totalOutput[0].gene_id : null;
return JSONOutput;
case "GenerateNetwork":
JSONOutput.links = {};
for (let connection of totalOutput) {
if (JSONOutput.links[connection.regulator_gene_id] === undefined) {
JSONOutput.links[connection.regulator_gene_id] = [connection.target_gene_id];
} else {
JSONOutput.links[connection.regulator_gene_id].push(connection.target_gene_id);
}
}
return JSONOutput;
default:
return JSONOutput;
}
};
module.exports = {
buildNetworkSourceQuery: buildNetworkSourceQuery,
queryNetworkDatabase: function (req, res) {
sequelize.query(buildQueryByType(req.query.type, req.query), { type: sequelize.QueryTypes.SELECT })
.then(function (stdname) {
const response = convertResponseToJSON(req.query.type, req.query, stdname);
return res.send(response);
});
}
};