diff --git a/frontend-js/src/main/js/map/data/SearchBioEntityGroup.js b/frontend-js/src/main/js/map/data/SearchBioEntityGroup.js new file mode 100644 index 0000000000000000000000000000000000000000..f444b4e1deff425472a0590f45fa098b9f2917d5 --- /dev/null +++ b/frontend-js/src/main/js/map/data/SearchBioEntityGroup.js @@ -0,0 +1,104 @@ +"use strict"; + +var Alias = require("./Alias"); +var BioEntity = require("./BioEntity"); +var Reaction = require("./Reaction"); + +// noinspection JSUnusedLocalSymbols +var logger = require('../../logger'); + +/** + * Class representing merged search bioEntities. + * + * @param bioEntity + * initial bioEntity from which group is created + */ +function SearchAliasGroup(bioEntity) { + if (!(bioEntity instanceof BioEntity)) { + throw new Error("Invalid argument"); + } + this._bioEntites = [bioEntity]; +} + +SearchAliasGroup.prototype.bioEntityMatch = function (newBioEntity) { + var result = true; + var self = this; + + for (var i = 0; i < self._bioEntites.length; i++) { + var bioEntity = self._bioEntites[i]; + if (self.bioEntityComparator(bioEntity, newBioEntity) !== 0) { + result = false; + } + } + return result; +}; + +SearchAliasGroup.prototype.addBioEntity = function (newBioEntity) { + this._bioEntites.push(newBioEntity); +}; + +SearchAliasGroup.prototype.getBioEntities = function () { + return this._bioEntites; +}; + +SearchAliasGroup.prototype.bioEntityComparator = function (bioEntity1, bioEntity2) { + if (bioEntity1 instanceof Alias && bioEntity2 instanceof Alias) { + if (bioEntity1.getName() !== bioEntity2.getName()) { + return -1; + } + if (bioEntity1.getModelId() !== bioEntity2.getModelId()) { + return -2; + } + if (bioEntity1.getCompartmentId() !== bioEntity2.getCompartmentId()) { + return -3; + } + if (bioEntity1.getType() !== bioEntity2.getType()) { + return -4; + } + if (bioEntity1.getOther("structuralState") !== bioEntity2.getOther("structuralState")) { + return -5; + } + + var computeSerializedModifications = function (modifications) { + if (modifications === undefined) { + return []; + } + var result = []; + for (var i = 0; i < modifications.length; i++) { + var modification = modifications[i]; + result.push(modification.name + "_" + modification.state); + } + result.sort(); + return result; + }; + var serializedModifications1 = computeSerializedModifications(bioEntity1.getOther("modifications")); + var serializedModifications2 = computeSerializedModifications(bioEntity2.getOther("modifications")); + if (serializedModifications1.length !== serializedModifications2.length) { + return -6; + } + for (var i = 0; i < serializedModifications1.length; i++) { + if (serializedModifications1[i] !== serializedModifications2[i]) { + return -7; + } + } + return 0; + } + if (bioEntity1 instanceof Reaction && bioEntity2 instanceof Reaction) { + if (bioEntity1.getId() !== bioEntity2.getId()) { + return -8; + } + return 0; + } + return -9; +}; + +SearchAliasGroup.prototype.setIcon = function (icon) { + this._icon = icon; +}; + +SearchAliasGroup.prototype.getIcon = function () { + return this._icon; +}; + + +module.exports = SearchAliasGroup; diff --git a/frontend-js/src/test/js/map/data/SearchBioEntityGroup-test.js b/frontend-js/src/test/js/map/data/SearchBioEntityGroup-test.js new file mode 100644 index 0000000000000000000000000000000000000000..64efc9319e55979fb4df18bfbb12d8697c556e18 --- /dev/null +++ b/frontend-js/src/test/js/map/data/SearchBioEntityGroup-test.js @@ -0,0 +1,138 @@ +"use strict"; + +require("../../mocha-config"); + +var Alias = require('../../../../main/js/map/data/Alias'); +var SearchBioEntityGroup = require('../../../../main/js/map/data/SearchBioEntityGroup'); + + +var chai = require('chai'); +var assert = chai.assert; +var logger = require('../../logger'); + +describe('SearchBioEntityGroup', function () { + beforeEach(function () { + logger.flushBuffer(); + }); + + describe("constructor", function () { + it("with alias", function () { + var alias = helper.createAlias(); + var group = new SearchBioEntityGroup(alias); + assert.ok(group); + assert.equal(logger.getWarnings().length, 0); + assert.ok(group.bioEntityMatch(alias)); + }); + it("with reaction", function () { + var reaction = helper.createReaction(); + var group = new SearchBioEntityGroup(reaction); + assert.ok(group); + assert.equal(logger.getWarnings().length, 0); + assert.ok(group.bioEntityMatch(reaction)); + }); + it("with invalid", function () { + try { + new SearchBioEntityGroup({}); + assert.ok(false, "Error expected"); + } catch (e) { + assert.equal(e.message.indexOf("Error expected"), -1) + } + }); + + }); + describe("bioEntityComparator", function () { + it("equal", function () { + var map = helper.createCustomMap(); + var alias1 = helper.createAlias(map); + var alias2 = helper.createAlias(map); + var group = new SearchBioEntityGroup(alias1); + assert.ok(group.bioEntityComparator(alias1, alias2) === 0); + }); + it("different name", function () { + var map = helper.createCustomMap(); + var alias1 = helper.createAlias(map); + var alias2 = helper.createAlias(map); + alias2.setName("different name"); + var group = new SearchBioEntityGroup(alias1); + assert.ok(group.bioEntityComparator(alias1, alias2) !== 0); + }); + it("different type", function () { + var map = helper.createCustomMap(); + var alias1 = helper.createAlias(map); + var alias2 = helper.createAlias(map); + alias2.setType("different type"); + var group = new SearchBioEntityGroup(alias1); + assert.ok(group.bioEntityComparator(alias1, alias2) !== 0); + }); + it("different state", function () { + var map = helper.createCustomMap(); + var alias1 = helper.createAlias(map); + var alias2 = helper.createAlias(map); + var otherData = {structuralState: "different state"}; + alias2.setOther(otherData); + var group = new SearchBioEntityGroup(alias1); + assert.ok(group.bioEntityComparator(alias1, alias2) !== 0); + }); + it("different modifications", function () { + var map = helper.createCustomMap(); + var alias1 = helper.createAlias(map); + var alias2 = helper.createAlias(map); + var otherData = {modifications: [{"name": "S250", "state": "PHOSPHORYLATED"}]}; + alias2.setOther(otherData); + var group = new SearchBioEntityGroup(alias1); + assert.ok(group.bioEntityComparator(alias1, alias2) !== 0); + }); + it("different class", function () { + var map = helper.createCustomMap(); + var alias = helper.createAlias(map); + var reaction = helper.createReaction(map); + var group = new SearchBioEntityGroup(alias); + assert.ok(group.bioEntityComparator(alias, reaction) !== 0); + }); + + it("different map", function () { + var map = helper.createCustomMap(); + var alias1 = helper.createAlias(map); + var alias2 = helper.createAlias(map); + alias2.setModelId(-1); + var group = new SearchBioEntityGroup(alias1); + assert.ok(group.bioEntityComparator(alias1, alias2) !== 0); + }); + + it("different compartment", function () { + var map = helper.createCustomMap(); + var alias1 = helper.createAlias(map); + var alias2 = helper.createAlias(map); + alias2.setCompartmentId(-3); + var group = new SearchBioEntityGroup(alias1); + assert.ok(group.bioEntityComparator(alias1, alias2) !== 0); + }); + + + it("different reactions", function () { + var map = helper.createCustomMap(); + var reaction1 = helper.createReaction(map); + var reaction2 = helper.createReaction(map); + var group = new SearchBioEntityGroup(reaction1); + assert.ok(group.bioEntityComparator(reaction1, reaction2) !== 0); + }); + }); + + it("addBioEntity", function () { + var map = helper.createCustomMap(); + var alias1 = helper.createAlias(map); + var alias2 = helper.createAlias(map); + var group = new SearchBioEntityGroup(alias1); + group.addBioEntity(alias2); + assert.equal(2, group.getBioEntities().length); + }); + + it("setIcon", function () { + var map = helper.createCustomMap(); + var alias1 = helper.createAlias(map); + var group = new SearchBioEntityGroup(alias1); + group.setIcon("icon.png"); + assert.equal("icon.png", group.getIcon()); + }); + +});