From 4491c406071757a359bd796c38179021cb391a1c Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Fri, 20 Jan 2017 15:19:13 +0100
Subject: [PATCH] MiRna Overlay Db implemented

---
 frontend-js/src/main/js/ServerConnector.js    | 81 +++++++++++++++++++
 frontend-js/src/main/js/SessionData.js        | 16 ++++
 frontend-js/src/main/js/SessionObjectType.js  |  1 +
 frontend-js/src/main/js/map/data/MiRna.js     | 40 +++++++++
 .../src/main/js/map/overlay/MiRnaDbOverlay.js | 31 +++++++
 frontend-js/src/test/js/helper.js             | 16 ++++
 .../js/map/overlay/MiRnaDbOverlay-test.js     | 62 ++++++++++++++
 ...query=hsa-miR-125a-3p&token=MOCK_TOKEN_ID& |  1 +
 ...9170&targetType=ALIAS&token=MOCK_TOKEN_ID& |  1 +
 9 files changed, 249 insertions(+)
 create mode 100644 frontend-js/src/main/js/map/data/MiRna.js
 create mode 100644 frontend-js/src/main/js/map/overlay/MiRnaDbOverlay.js
 create mode 100644 frontend-js/src/test/js/map/overlay/MiRnaDbOverlay-test.js
 create mode 100644 frontend-js/testFiles/apiCalls/miRna/getMiRnasByQuery/projectId=sample&query=hsa-miR-125a-3p&token=MOCK_TOKEN_ID&
 create mode 100644 frontend-js/testFiles/apiCalls/miRna/getMiRnasByTarget/columns=name&projectId=sample&targetId=329170&targetType=ALIAS&token=MOCK_TOKEN_ID&

diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 4088ad4b7a..a2c861e1fe 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -16,6 +16,7 @@ var IdentifiedElement= require('./map/data/IdentifiedElement');
 var LayoutAlias = require('./map/data/LayoutAlias');
 var LayoutData = require('./map/data/LayoutData');
 var LayoutReaction = require('./map/data/LayoutReaction');
+var MiRna = require('./map/data/MiRna');
 var Project = require('./map/data/Project');
 var Reaction = require('./map/data/Reaction');
 var SessionData = require('./SessionData');
@@ -690,6 +691,41 @@ ServerConnector.getDrugsByTargetUrl = function(params) {
   });
 };
 
+ServerConnector.getMiRnasByQueryUrl = function(params) {
+  var query = params.query;
+  var projectId = params.projectId;
+  var token = params.token;
+
+  return this.getApiUrl({type:"miRna",
+    method:"getMiRnasByQuery",
+    params: {
+      projectId: projectId, 
+      query: query, 
+      token: token},
+  });
+};
+
+ServerConnector.getMiRnasByTargetUrl = function(params) {
+  var query = params.query;
+  var projectId = params.projectId;
+  var token = params.token;
+  var columns = this.idsToString(params.columns);
+  var targetId = params.target.getId();
+  var targetType = params.target.getType();
+  
+  return this.getApiUrl({type:"miRna",
+    method:"getMiRnasByTarget",
+    params: {
+      projectId: projectId, 
+      query: query, 
+      columns: columns, 
+      token: token,
+      targetId: targetId,
+      targetType: targetType,
+      },
+  });
+};
+
 ServerConnector.getChemicalsByQueryUrl = function(params) {
   var query = params.query;
   var projectId = params.projectId;
@@ -1012,6 +1048,28 @@ ServerConnector.getDrugsByQuery = function(params) {
   });
 };
 
+ServerConnector.getMiRnasByQuery = function(params) {
+  var self = this;
+  return new Promise(function(resolve, reject) {
+    return self.getProjectId(params.projectId).then(function(result) {
+      params.projectId = result;
+      return self.getToken();
+    }).then(function(token) {
+      params.token = token;
+      return self.readFile(self.getMiRnasByQueryUrl(params));
+    }).then(function(content) {
+      var array=JSON.parse(content);
+      var result = [];
+      for (var i = 0; i < array.length; i++) {
+        result.push(new MiRna(array[i]));
+      }
+      resolve(result);
+    }).catch(function(exception){
+      reject(exception);
+    });
+  });
+};
+
 ServerConnector.getChemicalsByQuery = function(params) {
   var self = this;
   return new Promise(function(resolve, reject) {
@@ -1057,6 +1115,29 @@ ServerConnector.getDrugNamesByTarget = function(params) {
   });
 };
 
+ServerConnector.getMiRnaNamesByTarget = function(params) {
+  var self = this;
+  params.columns = ["name"];
+  return new Promise(function(resolve, reject) {
+    return self.getProjectId(params.projectId).then(function(result) {
+      params.projectId = result;
+      return self.getToken();
+    }).then(function(token) {
+      params.token = token;
+      return self.readFile(self.getMiRnasByTargetUrl(params));
+    }).then(function(content) {
+      var result = [];
+      var object = JSON.parse(content);
+      for (var i=0;i<object.length;i++){
+        result.push(object[i].name);
+      }
+      resolve(result);
+    }).catch(function(exception){
+      reject(exception);
+    });
+  });
+};
+
 ServerConnector.getChemicalNamesByTarget = function(params) {
   var self = this;
   params.columns = ["name"];
diff --git a/frontend-js/src/main/js/SessionData.js b/frontend-js/src/main/js/SessionData.js
index 392790edef..2b9c36db3d 100644
--- a/frontend-js/src/main/js/SessionData.js
+++ b/frontend-js/src/main/js/SessionData.js
@@ -36,6 +36,8 @@ SessionData.prototype.setQuery = function(param) {
     this.setSearchQuery(param.query);
   } else if (param.type === "chemical") {
     this.setChemicalQuery(param.query);
+  } else if (param.type === "mirna") {
+    this.setMiRnaQuery(param.query);
   } else {
     throw new Error("Invalid query type: " + param.type);
   }
@@ -64,6 +66,20 @@ SessionData.prototype.getDrugQuery = function() {
   return result;
 };
 
+SessionData.prototype.setMiRnaQuery = function(value) {
+  var key = this.getKey(SessionObjectType.MI_RNA_QUERY);
+  Cookies.set(key, JSON.stringify(value));
+};
+
+SessionData.prototype.getMiRnaQuery = function() {
+  var key = this.getKey(SessionObjectType.MI_RNA_QUERY);
+  var result = Cookies.get(key);
+  if (result !== undefined) {
+    result = JSON.parse(result);
+  }
+  return result;
+};
+
 SessionData.prototype.setChemicalQuery = function(value) {
   var key = this.getKey(SessionObjectType.CHEMICAL_QUERY);
   Cookies.set(key, JSON.stringify(value));
diff --git a/frontend-js/src/main/js/SessionObjectType.js b/frontend-js/src/main/js/SessionObjectType.js
index 616d9e6621..911929e6dd 100644
--- a/frontend-js/src/main/js/SessionObjectType.js
+++ b/frontend-js/src/main/js/SessionObjectType.js
@@ -3,6 +3,7 @@
 var SessionObjectType = {
   CHEMICAL_QUERY : "CHEMICAL_QUERY",
   DRUG_QUERY : "DRUG_QUERY",
+  MI_RNA_QUERY : "MI_RNA_QUERY",
   SHOW_COMMENT : "SHOW_COMMENT",
   SELECTED_BACKGROUND_OVERLAY : "SELECTED_BACKGROUND_OVERLAY",
   SEARCH_QUERY : "SEARCH_QUERY",
diff --git a/frontend-js/src/main/js/map/data/MiRna.js b/frontend-js/src/main/js/map/data/MiRna.js
new file mode 100644
index 0000000000..2b8f60c887
--- /dev/null
+++ b/frontend-js/src/main/js/map/data/MiRna.js
@@ -0,0 +1,40 @@
+"use strict";
+
+var Target = require("./Target");
+
+function MiRna(javaObject) {
+  if (javaObject !== undefined) {
+    this.setName(javaObject.name);
+    this.setId(javaObject.id);
+    this.setTargets(javaObject.targets);
+  }
+}
+
+MiRna.prototype.setName = function(name) {
+  this._name = name;
+};
+
+MiRna.prototype.getName = function() {
+  return this._name;
+};
+
+MiRna.prototype.setId = function(id) {
+  this._id = id;
+};
+
+MiRna.prototype.getId = function() {
+  return this._id;
+};
+
+MiRna.prototype.setTargets = function(targets) {
+  this._targets = [];
+  for (var i = 0; i < targets.length; i++) {
+    this._targets.push(new Target(targets[i]));
+  }
+};
+
+MiRna.prototype.getTargets = function() {
+  return this._targets;
+};
+
+module.exports = MiRna;
diff --git a/frontend-js/src/main/js/map/overlay/MiRnaDbOverlay.js b/frontend-js/src/main/js/map/overlay/MiRnaDbOverlay.js
new file mode 100644
index 0000000000..23e5d9c33f
--- /dev/null
+++ b/frontend-js/src/main/js/map/overlay/MiRnaDbOverlay.js
@@ -0,0 +1,31 @@
+"use strict";
+
+var logger = require('../../logger');
+
+var Promise = require("bluebird");
+
+var IdentifiedElement = require('../data/IdentifiedElement');
+var AbstractTargettingDbOverlay = require('./AbstractTargettingDbOverlay');
+
+var ServerConnector = require('../../ServerConnector');
+
+function MiRnaDbOverlay(params) {
+  params.iconType= "target";
+  params.iconColorStart = 2;
+  // call super constructor
+  AbstractTargettingDbOverlay.call(this, params);
+  
+}
+
+MiRnaDbOverlay.prototype = Object.create(AbstractTargettingDbOverlay.prototype);
+MiRnaDbOverlay.prototype.constructor = MiRnaDbOverlay;
+
+MiRnaDbOverlay.prototype.getNamesByTargetFromServer = function(param) {
+  return ServerConnector.getMiRnaNamesByTarget(param);
+}
+
+MiRnaDbOverlay.prototype.getElementsByQueryFromServer = function(param) {
+  return ServerConnector.getMiRnasByQuery(param);
+}
+
+module.exports = MiRnaDbOverlay;
diff --git a/frontend-js/src/test/js/helper.js b/frontend-js/src/test/js/helper.js
index 52fb8a8766..6ca84dd1e2 100644
--- a/frontend-js/src/test/js/helper.js
+++ b/frontend-js/src/test/js/helper.js
@@ -14,6 +14,7 @@ var IdentifiedElement = require("../../main/js/map/data/IdentifiedElement");
 var LayoutAlias = require("../../main/js/map/data/LayoutAlias");
 var LayoutData = require("../../main/js/map/data/LayoutData");
 var LayoutReaction = require("../../main/js/map/data/LayoutReaction");
+var MiRnaDbOverlay = require("../../main/js/map/overlay/MiRnaDbOverlay");
 var Model = require("../../main/js/map/data/MapModel");
 var OverlayCollection = require("../../main/js/map/overlay/OverlayCollection");
 var Project = require("../../main/js/map/data/Project");
@@ -36,6 +37,10 @@ Helper.prototype.createChemicalTab = function() {
   return this.createPanelTab("chemicalTab");
 };
 
+Helper.prototype.createMiRnaTab = function() {
+  return this.createPanelTab("mirnaTab");
+};
+
 Helper.prototype.createPanelTab = function(id) {
   var result = document.createElement("div");
   result.id = id;
@@ -115,6 +120,17 @@ Helper.prototype.createChemicalDbOverlay = function(map) {
   return result;
 };
 
+Helper.prototype.createMiRnaDbOverlay = function(map) {
+  var result = new MiRnaDbOverlay({
+    map : map,
+    name : "mirna",
+    allowGeneralSearch : true,
+    allowSearchById : true,
+  });
+  map.registerSource(result);
+  return result;
+};
+
 Helper.prototype.createComment = function(element) {
   var elementType = "ALIAS";
   var elementId = this.idCounter++;
diff --git a/frontend-js/src/test/js/map/overlay/MiRnaDbOverlay-test.js b/frontend-js/src/test/js/map/overlay/MiRnaDbOverlay-test.js
new file mode 100644
index 0000000000..4e5efe554e
--- /dev/null
+++ b/frontend-js/src/test/js/map/overlay/MiRnaDbOverlay-test.js
@@ -0,0 +1,62 @@
+"use strict";
+
+var Helper = require('../../Helper');
+
+var logger = require('../../logger');
+
+var IdentifiedElement = require('../../../../main/js/map/data/IdentifiedElement');
+var MiRnaDbOverlay = require('../../../../main/js/map/overlay/MiRnaDbOverlay');
+
+var assert = require('assert');
+
+describe('MiRnaDbOverlay', function() {
+  var helper;
+  before(function() {
+    helper = new Helper();
+  });
+
+  it("constructor 1", function() {
+    var map = helper.createCustomMap();
+    var oc = new MiRnaDbOverlay({
+      map : map,
+      name : 'miRna'
+    });
+    assert.ok(oc);
+    assert.equal(oc.getName(), 'miRna');
+
+    assert.equal(logger.getWarnings.length, 0);
+  });
+
+  it("searchByQuery", function() {
+    var map = helper.createCustomMap();
+    map.getModel().setId(15781);
+    var searchDb = helper.createMiRnaDbOverlay(map);
+    return searchDb.searchByQuery("hsa-miR-125a-3p").then(function(miRnas) {
+      assert.equal(miRnas.length, 1);
+      assert.equal(searchDb.getQueries().length, 1);
+      return searchDb.getElementsByQuery(searchDb.getQueries()[0]);
+    }).then(function(elements) {
+      assert.equal(elements.length, 3);
+      return searchDb.getIdentifiedElements();
+    }).then(function(elements) {
+      assert.equal(elements.length, 0);
+    });
+  });
+
+  it("searchNamesByTarget", function() {
+    var map = helper.createCustomMap();
+    map.getModel().setId(15781);
+    var searchDb = helper.createMiRnaDbOverlay(map);
+
+    var target = new IdentifiedElement({
+      type : "ALIAS",
+      id : 329170,
+      modelId : 15781,
+    });
+
+    return searchDb.searchNamesByTarget(target).then(function(miRnaNames) {
+      assert.equal(miRnaNames.length, 0);
+    });
+  });
+
+});
diff --git a/frontend-js/testFiles/apiCalls/miRna/getMiRnasByQuery/projectId=sample&query=hsa-miR-125a-3p&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/miRna/getMiRnasByQuery/projectId=sample&query=hsa-miR-125a-3p&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000..ad629e97ae
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/miRna/getMiRnasByQuery/projectId=sample&query=hsa-miR-125a-3p&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[{"name":"hsa-miR-125a-3p","id":"hsa-miR-125a-3p","targets":[{"targetElements":[],"references":[{"title":"microRNA-125a-3p reduces cell proliferation and migration by targeting Fyn.","authors":["Ninio-Many L"," Grossman H"," Shomron N"," Chuderland D"," Shalgi R."],"journal":"Journal of cell science","year":2013,"link":"http://www.ncbi.nlm.nih.gov/pubmed/23606749","id":"23606749","citationCount":6}],"name":"FYN","targetParticipants":[{"name":"FYN","type":"HGNC Symbol","link":"http://www.genenames.org/cgi-bin/gene_symbol_report?match\u003dFYN","idObject":0}]},{"targetElements":[],"references":[{"title":"MicroRNA-125a inhibits cell growth by targeting glypican-4.","authors":["Feng C"," Li J"," Ruan J"," Ding K."],"journal":"Glycoconjugate journal","year":2012,"link":"http://www.ncbi.nlm.nih.gov/pubmed/22644326","id":"22644326","citationCount":4}],"name":"GPC4","targetParticipants":[{"name":"GPC4","type":"HGNC Symbol","link":"http://www.genenames.org/cgi-bin/gene_symbol_report?match\u003dGPC4","idObject":0}]},{"targetElements":[],"references":[{"title":"MiRNA-125a-3p is a negative regulator of the RhoA-actomyosin pathway in A549 cells.","authors":["Huang B"," Luo W"," Sun L"," Zhang Q"," Jiang L"," Chang J"," Qiu X"," Wang E."],"journal":"International journal of oncology","year":2013,"link":"http://www.ncbi.nlm.nih.gov/pubmed/23525486","id":"23525486","citationCount":4}],"name":"RHOA","targetParticipants":[{"name":"RHOA","type":"HGNC Symbol","link":"http://www.genenames.org/cgi-bin/gene_symbol_report?match\u003dRHOA","idObject":0}]}]}]
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/miRna/getMiRnasByTarget/columns=name&projectId=sample&targetId=329170&targetType=ALIAS&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/miRna/getMiRnasByTarget/columns=name&projectId=sample&targetId=329170&targetType=ALIAS&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000..0637a088a0
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/miRna/getMiRnasByTarget/columns=name&projectId=sample&targetId=329170&targetType=ALIAS&token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+[]
\ No newline at end of file
-- 
GitLab