package org.molgenis.data.semanticsearch.explain.service; import org.apache.lucene.search.Explanation; import org.elasticsearch.client.Client; import org.molgenis.data.semanticsearch.explain.bean.ExplainedQueryString; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import static org.mockito.Mockito.mock; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; public class ElasticSearchExplainServiceImplTest { private ElasticSearchExplainService elasticSearchExplainService; private ExplainServiceHelper explainServiceHelper; @BeforeClass public void setup() { explainServiceHelper = new ExplainServiceHelper(); Client client = mock(Client.class); elasticSearchExplainService = new ElasticSearchExplainServiceImpl(client, explainServiceHelper); } @Test public void testRegExp() { String description = "weight(label:high in 328) [PerFieldSimilarity], result of:"; String actual = explainServiceHelper.getMatchedWord(description); assertEquals(actual, "high"); String description2 = "weight(label:length^0.5 in 328) [PerFieldSimilarity], result of:"; String actual2 = explainServiceHelper.getMatchedWord(description2); assertEquals(actual2, "length"); } @Test public void testRemoveBoostFromQuery() { String description = "Measurement^0.5 glucose^0.25 fasting^0.5"; assertEquals(explainServiceHelper.removeBoostFromQuery(description), "Measurement glucose fasting"); String description2 = "Measurement^5 glucose^5.0 fasting^00.52"; assertEquals(explainServiceHelper.removeBoostFromQuery(description2), "Measurement glucose fasting"); String description3 = "Measurement glucose 5 fasting43"; assertEquals(explainServiceHelper.removeBoostFromQuery(description3), "Measurement glucose 5 fasting43"); String description4 = "glycemia^0.03125"; assertEquals(explainServiceHelper.removeBoostFromQuery(description4), "glycemia"); } @Test public void testDiscoverMatchedQueries() { Explanation explanation_1 = new Explanation(Float.valueOf("5.381672"), "sum of:"); Explanation explanation_2 = new Explanation(Float.valueOf("3.6267629"), "sum of:"); explanation_2.addDetail(new Explanation(Float.valueOf("2.0587344"), "weight(label:high in 328) [PerFieldSimilarity], result of:")); explanation_2.addDetail(new Explanation(Float.valueOf("1.5680285"), "weight(label:blood in 328) [PerFieldSimilarity], result of:")); Explanation explanation_3 = new Explanation(Float.valueOf("1.754909"), "max of:"); explanation_3.addDetail(new Explanation(Float.valueOf("1.754909"), "weight(label:medication in 328) [PerFieldSimilarity], result of:")); explanation_1.addDetail(explanation_2); explanation_1.addDetail(explanation_3); System.out.println(explanation_1); Set<String> actual = explainServiceHelper.findMatchedWords(explanation_1); assertEquals(actual.size(), 2); assertTrue(actual.contains("high blood")); assertTrue(actual.contains("medication")); } @Test public void testRecursivelyFindQuery() { Map<String, String> expanedQueryMap = new HashMap<String, String>(); expanedQueryMap.put("hypertension", "hypertension"); expanedQueryMap.put("hypertensive disorder", "hypertension"); expanedQueryMap.put("high blood pressure", "hypertension"); expanedQueryMap.put("medication", "medication"); expanedQueryMap.put("drug", "medication"); expanedQueryMap.put("pill", "medication"); Map<String, Double> findMatchQueries = explainServiceHelper.findMatchQueries("high blood", expanedQueryMap); assertEquals(findMatchQueries.get("high blood pressure"), 73.333, 0.001); Map<String, Double> findMatchQueries2 = explainServiceHelper.findMatchQueries("medication", expanedQueryMap); assertEquals(findMatchQueries2.get("medication"), 100.0, 0.001); } @Test public void testReverseSearchQueryStrings() { Explanation explanation_1 = new Explanation(Float.valueOf("5.381672"), "sum of:"); Explanation explanation_2 = new Explanation(Float.valueOf("3.6267629"), "sum of:"); explanation_2.addDetail(new Explanation(Float.valueOf("2.0587344"), "weight(label:high in 328) [PerFieldSimilarity], result of:")); explanation_2.addDetail(new Explanation(Float.valueOf("1.5680285"), "weight(label:blood in 328) [PerFieldSimilarity], result of:")); Explanation explanation_3 = new Explanation(Float.valueOf("1.754909"), "max of:"); explanation_3.addDetail(new Explanation(Float.valueOf("1.754909"), "weight(label:medication in 328) [PerFieldSimilarity], result of:")); explanation_1.addDetail(explanation_2); explanation_1.addDetail(explanation_3); Map<String, String> expanedQueryMap = new HashMap<String, String>(); expanedQueryMap.put("hypertension", "hypertension"); expanedQueryMap.put("hypertensive disorder", "hypertension"); expanedQueryMap.put("high blood pressure", "hypertension"); expanedQueryMap.put("medication", "medication"); expanedQueryMap.put("drug", "medication"); expanedQueryMap.put("pill", "medication"); Set<ExplainedQueryString> reverseSearchQueryStrings = elasticSearchExplainService .findQueriesFromExplanation(expanedQueryMap, explanation_1); Iterator<ExplainedQueryString> iterator = reverseSearchQueryStrings.iterator(); ExplainedQueryString first = iterator.next(); assertEquals(first.getMatchedWords(), "high blood"); assertEquals(first.getQueryString(), "high blood pressure"); assertEquals(first.getTagName(), "hypertension"); assertEquals((int) first.getScore(), 73); ExplainedQueryString second = iterator.next(); assertEquals(second.getMatchedWords(), "medication"); assertEquals(second.getQueryString(), "medication"); assertEquals(second.getTagName(), "medication"); assertEquals((int) second.getScore(), 100); } }