Skip to content
Snippets Groups Projects
Commit bf097211 authored by Piotr Gawron's avatar Piotr Gawron
Browse files

search by coordinates can be limited to the types

parent 6da94fbe
No related branches found
No related tags found
1 merge request!254Resolve "Main view: Compartments are not selectable"
......@@ -21,58 +21,61 @@ import lcsb.mapviewer.services.SecurityException;
@RestController
public class BioEntitiesController extends BaseController {
@Autowired
private BioEntitiesRestImpl bioEntitiesRestImpl;
@Autowired
private BioEntitiesRestImpl bioEntitiesRestImpl;
@RequestMapping(value = "/projects/{projectId}/models/{modelId}/bioEntities:search", method = { RequestMethod.GET },
produces = { MediaType.APPLICATION_JSON_VALUE })
public List<Map<String, Object>> getClosestElementsByCoordinates(//
@PathVariable(value = "projectId") String projectId, //
@PathVariable(value = "modelId") String modelId, //
@CookieValue(value = Configuration.AUTH_TOKEN) String token, //
@RequestParam(value = "coordinates", defaultValue = "") String coordinates, //
@RequestParam(value = "query", defaultValue = "") String query, //
@RequestParam(value = "count", defaultValue = "") String count, //
@RequestParam(value = "perfectMatch", defaultValue = "false") String perfectMatch//
) throws QueryException, SecurityException {
if (!coordinates.trim().isEmpty()) {
if (modelId.equals("*")) {
throw new QueryException("modelId must be defined when searching by coordinates");
}
if (count.trim().isEmpty()) {
count = "5";
}
String[] tmp = coordinates.split(",");
if (tmp.length != 2) {
throw new QueryException("Coordinates must be in the format: 'xxx.xx,yyy.yy'");
}
Double x = null;
Double y = null;
try {
x = Double.valueOf(tmp[0]);
y = Double.valueOf(tmp[1]);
} catch (NumberFormatException e) {
throw new QueryException("Coordinates must be in the format: 'xxx.xx,yyy.yy'", e);
}
Point2D pointCoordinates = new Point2D.Double(x, y);
return bioEntitiesRestImpl.getClosestElementsByCoordinates(projectId, modelId, token, pointCoordinates, Integer.valueOf(count), perfectMatch);
} else if (!query.trim().isEmpty()) {
if (count.trim().isEmpty()) {
count = "100";
}
return bioEntitiesRestImpl.getElementsByQuery(projectId, token, modelId, query, Integer.valueOf(count), perfectMatch);
} else {
return new ArrayList<>();
}
}
@RequestMapping(value = "/projects/{projectId}/models/{modelId}/bioEntities:search", method = {
RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
public List<Map<String, Object>> getClosestElementsByCoordinates(//
@PathVariable(value = "projectId") String projectId, //
@PathVariable(value = "modelId") String modelId, //
@CookieValue(value = Configuration.AUTH_TOKEN) String token, //
@RequestParam(value = "coordinates", defaultValue = "") String coordinates, //
@RequestParam(value = "query", defaultValue = "") String query, //
@RequestParam(value = "count", defaultValue = "") String count, //
@RequestParam(value = "type", defaultValue = "") String type, //
@RequestParam(value = "perfectMatch", defaultValue = "false") String perfectMatch//
) throws QueryException, SecurityException {
if (!coordinates.trim().isEmpty()) {
if (modelId.equals("*")) {
throw new QueryException("modelId must be defined when searching by coordinates");
}
if (count.trim().isEmpty()) {
count = "5";
}
String[] tmp = coordinates.split(",");
if (tmp.length != 2) {
throw new QueryException("Coordinates must be in the format: 'xxx.xx,yyy.yy'");
}
Double x = null;
Double y = null;
try {
x = Double.valueOf(tmp[0]);
y = Double.valueOf(tmp[1]);
} catch (NumberFormatException e) {
throw new QueryException("Coordinates must be in the format: 'xxx.xx,yyy.yy'", e);
}
Point2D pointCoordinates = new Point2D.Double(x, y);
return bioEntitiesRestImpl.getClosestElementsByCoordinates(projectId, modelId, token, pointCoordinates,
Integer.valueOf(count), perfectMatch, type);
} else if (!query.trim().isEmpty()) {
if (count.trim().isEmpty()) {
count = "100";
}
return bioEntitiesRestImpl.getElementsByQuery(projectId, token, modelId, query, Integer.valueOf(count),
perfectMatch);
} else {
return new ArrayList<>();
}
}
@RequestMapping(value = "/projects/{projectId}/models/{modelId}/bioEntities/suggestedQueryList", method = { RequestMethod.GET, RequestMethod.POST },
produces = { MediaType.APPLICATION_JSON_VALUE })
public String[] getSuggestedQueryList(//
@PathVariable(value = "projectId") String projectId, //
@CookieValue(value = Configuration.AUTH_TOKEN) String token//
) throws SecurityException {
return bioEntitiesRestImpl.getSuggestedQueryList(projectId, token);
}
@RequestMapping(value = "/projects/{projectId}/models/{modelId}/bioEntities/suggestedQueryList", method = {
RequestMethod.GET, RequestMethod.POST }, produces = { MediaType.APPLICATION_JSON_VALUE })
public String[] getSuggestedQueryList(//
@PathVariable(value = "projectId") String projectId, //
@CookieValue(value = Configuration.AUTH_TOKEN) String token//
) throws SecurityException {
return bioEntitiesRestImpl.getSuggestedQueryList(projectId, token);
}
}
\ No newline at end of file
......@@ -2,8 +2,10 @@ package lcsb.mapviewer.api.projects.models.bioEntities;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -31,15 +33,22 @@ public class BioEntitiesRestImpl extends BaseRestImpl {
private ISearchService searchService;
public List<Map<String, Object>> getClosestElementsByCoordinates(String projectId, String modelId, String token,
Point2D coordinates, Integer count, String perfectMatch) throws UserAccessException, SecurityException {
Point2D coordinates, Integer count, String perfectMatch, String type) throws UserAccessException, SecurityException {
List<Map<String, Object>> resultMap = new ArrayList<>();
Model model = getModelService().getLastModelByProjectId(projectId, token);
Model submodel = model.getSubmodelById(modelId);
Set<String> types = new HashSet<>();
if (!type.isEmpty()) {
for (String str : type.split(",")) {
types.add(str.toLowerCase());
}
}
List<BioEntity> elements = searchService.getClosestElements(submodel, coordinates, count,
perfectMatch.equalsIgnoreCase("true"));
perfectMatch.equalsIgnoreCase("true"), types);
for (BioEntity object : elements) {
Map<String, Object> result = createMinifiedSearchResult(object);
resultMap.add(result);
......
......@@ -6,6 +6,7 @@ import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
......@@ -49,7 +50,7 @@ public class BioEntitiesControllerTest extends RestTestFunctions {
BioEntitiesRestImpl projectRest = createMockProjectRest("testFiles/model/sample.xml");
int count = 3;
List<Map<String, Object>> result = projectRest.getClosestElementsByCoordinates("sample", "0", token,
new Point2D.Double(1, 2), count, "false");
new Point2D.Double(1, 2), count, "false", "");
assertEquals(count, result.size());
String json = mapper.writeValueAsString(result);
......
......@@ -3,6 +3,7 @@ package lcsb.mapviewer.services.impl;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
......@@ -44,10 +45,6 @@ import lcsb.mapviewer.model.map.statistics.SearchType;
import lcsb.mapviewer.persist.dao.map.ModelDao;
import lcsb.mapviewer.services.interfaces.ISearchHistoryService;
import lcsb.mapviewer.services.interfaces.ISearchService;
import lcsb.mapviewer.services.search.data.FullAliasView;
import lcsb.mapviewer.services.search.data.FullAliasViewFactory;
import lcsb.mapviewer.services.search.data.FullReactionView;
import lcsb.mapviewer.services.search.data.FullReactionViewFactory;
import lcsb.mapviewer.services.search.data.SearchElementResult;
import lcsb.mapviewer.services.utils.SearchIndexer;
......@@ -567,7 +564,8 @@ public class SearchService implements ISearchService {
}
@Override
public List<BioEntity> getClosestElements(Model model, Point2D point, int numberOfElements, boolean perfectHit) {
public List<BioEntity> getClosestElements(Model model, Point2D point, int numberOfElements, boolean perfectHit,
Collection<String> types) {
List<BioEntity> result = new ArrayList<>();
// probably this could be improved algorithmitically, right now all objects
......@@ -575,11 +573,13 @@ public class SearchService implements ISearchService {
// of results
List<DistanceToObject> tmpList = new ArrayList<>();
for (Reaction reaction : model.getReactions()) {
tmpList.add(new DistanceToObject(reaction, point));
if (types.size() == 0 || types.contains(reaction.getStringType().toLowerCase())) {
tmpList.add(new DistanceToObject(reaction, point));
}
}
for (Element alias : model.getElements()) {
if (alias instanceof Species) {
tmpList.add(new DistanceToObject(alias, point));
for (Element element : model.getElements()) {
if ((element instanceof Species && types.size() == 0) || types.contains(element.getStringType().toLowerCase())) {
tmpList.add(new DistanceToObject(element, point));
}
}
Collections.sort(tmpList);
......
package lcsb.mapviewer.services.interfaces;
import java.awt.geom.Point2D;
import java.util.Collection;
import java.util.List;
import org.apache.log4j.Logger;
......@@ -296,7 +297,7 @@ public interface ISearchService {
* how many closest elements should be returned
* @return list of the closest elements
*/
List<BioEntity> getClosestElements(Model model, Point2D point, int numberOfElements, boolean perfectHit);
List<BioEntity> getClosestElements(Model model, Point2D point, int numberOfElements, boolean perfectHit, Collection<String> types);
/**
* Returns list of autocomplete strings for the partial query.
......
......@@ -6,6 +6,7 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
......@@ -287,7 +288,7 @@ public class SearchServiceTest extends ServiceTestFunctions {
public void testSearchClosest() throws Exception {
try {
Model model = getModelForFile("testFiles/graph_path_example3.xml", true);
List<BioEntity> elements = searchService.getClosestElements(model, new Point2D.Double(0, 0), 5, false);
List<BioEntity> elements = searchService.getClosestElements(model, new Point2D.Double(0, 0), 5, false, new ArrayList<>());
assertNotNull(elements);
assertEquals(5, elements.size());
assertTrue(elements.get(0) instanceof Species);
......@@ -335,7 +336,7 @@ public class SearchServiceTest extends ServiceTestFunctions {
protein3.setY(0);
model.addElement(protein3);
List<BioEntity> elements = searchService.getClosestElements(model, new Point2D.Double(10, 10), 5, false);
List<BioEntity> elements = searchService.getClosestElements(model, new Point2D.Double(10, 10), 5, false, new ArrayList<>());
assertNotNull(elements);
assertEquals(3, elements.size());
BioEntity sAlias = elements.get(0);
......@@ -355,7 +356,7 @@ public class SearchServiceTest extends ServiceTestFunctions {
public void testSearchClosestWithEmptyModel() throws Exception {
try {
Model model = new ModelFullIndexed(null);
List<BioEntity> elements = searchService.getClosestElements(model, new Point2D.Double(0, 0), 5, false);
List<BioEntity> elements = searchService.getClosestElements(model, new Point2D.Double(0, 0), 5, false, new ArrayList<>());
assertNotNull(elements);
assertEquals(0, elements.size());
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment