package services; import helpers.ElasticsearchTestGrid; import helpers.JsonLdConstants; import helpers.JsonTest; import helpers.ResourceHelpers; import models.Record; import models.Resource; import models.TripleCommit; import org.elasticsearch.common.geo.GeoPoint; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import services.repository.BaseRepository; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.*; import static org.junit.Assert.assertEquals; public class BaseRepositoryTest extends ElasticsearchTestGrid implements JsonTest { private static Map<String, String> mMetadata = new HashMap<>(); private static BaseRepository mBaseRepo; final private static QueryContext mDefaultQueryContext; static { try { mBaseRepo = new BaseRepository(mConfig, ElasticsearchTestGrid.getEsRepo()); } catch (Exception e) { e.printStackTrace(); } mDefaultQueryContext = new QueryContext(null); mDefaultQueryContext.setElasticsearchFieldBoosts(new SearchConfig().getBoostsForElasticsearch()); } @BeforeClass public static void setUp() { mMetadata.put(TripleCommit.Header.AUTHOR_HEADER, "Anonymous"); mMetadata.put(TripleCommit.Header.DATE_HEADER, "2016-04-08T17:34:37.038+02:00"); } @Test public void testResourceWithIdentifiedSubObject() throws IOException { Resource resource1 = new Resource("Person", "info:id001"); resource1.put(JsonLdConstants.CONTEXT, "http://schema.org/"); Resource resource2 = new Resource("Event", "info:OER15"); resource2.put(JsonLdConstants.CONTEXT, "http://schema.org/"); resource1.put("attended", resource2); Resource expected1 = getResourceFromJsonFile("BaseRepositoryTest/testResourceWithIdentifiedSubObject.OUT.1.json"); Resource expected2 = getResourceFromJsonFile("BaseRepositoryTest/testResourceWithIdentifiedSubObject.OUT.2.json"); mBaseRepo.addResource(resource1, mMetadata); mBaseRepo.addResource(resource2, mMetadata); Assert.assertEquals(expected1, mBaseRepo.getResource("info:id001")); Assert.assertEquals(expected2, mBaseRepo.getResource("info:OER15")); } @Test public void testResourceWithUnidentifiedSubObject() throws IOException { Resource resource = new Resource("Person", "info:id002"); resource.put(JsonLdConstants.CONTEXT, "http://schema.org/"); Resource value = new Resource("Foo", null); resource.put("attended", value); Resource expected = getResourceFromJsonFile("BaseRepositoryTest/testResourceWithUnidentifiedSubObject.OUT.1.json"); mBaseRepo.addResource(resource, mMetadata); Assert.assertEquals(expected, mBaseRepo.getResource("info:id002")); } @Test public void testDeleteResourceWithMentionedResources() throws IOException, InterruptedException { // setup: 1 Person ("in1") who has 2 affiliations Resource in1 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceWithMentionedResources.IN.1.json"); Resource in2 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceWithMentionedResources.IN.2.json"); Resource in3 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceWithMentionedResources.IN.3.json"); Resource expected1 = getResourceFromJsonFile( "BaseRepositoryTest/testDeleteResourceWithMentionedResources.OUT.1.json"); Resource expected2 = getResourceFromJsonFile( "BaseRepositoryTest/testDeleteResourceWithMentionedResources.OUT.2.json"); mBaseRepo.addResource(in1, mMetadata); mBaseRepo.addResource(in2, mMetadata); mBaseRepo.addResource(in3, mMetadata); // delete affiliation "Oh No Company" and check whether it has been removed // from referencing resources Resource toBeDeleted = mBaseRepo.getResource("info:urn:uuid:49d8b330-e3d5-40ca-b5cb-2a8dfca70987"); mBaseRepo.deleteResource(toBeDeleted.getAsString(JsonLdConstants.ID), mMetadata); Resource result1 = mBaseRepo.getResource("info:urn:uuid:49d8b330-e3d5-40ca-b5cb-2a8dfca70456"); Resource result2 = mBaseRepo.getResource("info:urn:uuid:49d8b330-e3d5-40ca-b5cb-2a8dfca70123"); Assert.assertEquals(expected1, result1); Assert.assertEquals(expected2, result2); Assert.assertNull(mBaseRepo.getResource("info:urn:uuid:49d8b330-e3d5-40ca-b5cb-2a8dfca70987")); } @Test public void testDeleteLastResourceInList() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteLastResourceInList.DB.1.json"); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteLastResourceInList.DB.2.json"); Resource out = getResourceFromJsonFile("BaseRepositoryTest/testDeleteLastResourceInList.OUT.1.json"); mBaseRepo.addResource(db1, mMetadata); mBaseRepo.addResource(db2, mMetadata); mBaseRepo.deleteResource("urn:uuid:3a25e950-a3c0-425d-946d-9806665ec665", mMetadata); Assert.assertNull(mBaseRepo.getResource("urn:uuid:3a25e950-a3c0-425d-946d-9806665ec665")); Assert.assertEquals(out, mBaseRepo.getResource("urn:uuid:c7f5334a-3ddb-4e46-8653-4d8c01e25503")); } @Test public void testDeleteResourceFromList() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceFromList.DB.1.json"); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceFromList.DB.2.json"); Resource db3 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceFromList.DB.3.json"); Resource out1 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceFromList.OUT.1.json"); Resource out2 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceFromList.OUT.2.json"); mBaseRepo.addResource(db1, mMetadata); mBaseRepo.addResource(db2, mMetadata); mBaseRepo.addResource(db3, mMetadata); mBaseRepo.deleteResource("urn:uuid:3a25e950-a3c0-425d-946d-9806665ec665", mMetadata); Assert.assertNull(mBaseRepo.getResource("urn:uuid:3a25e950-a3c0-425d-946d-9806665ec665")); Assert.assertEquals(out1, mBaseRepo.getResource("urn:uuid:c7f5334a-3ddb-4e46-8653-4d8c01e25503")); Assert.assertEquals(out2, mBaseRepo.getResource("urn:uuid:7cfb9aab-1a3f-494c-8fb1-64755faf180c")); } @Test public void testDeletedResourceIsRemovedFromIndex() throws IOException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testDeletedResourceIsRemovedFromIndex.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); mBaseRepo.deleteResource(db1.getId(), mMetadata); Assert.assertEquals(0, mBaseRepo.getResources("about.@id", db1.getId()).size()); } @Test public void testRemoveReference() throws IOException { Resource in = getResourceFromJsonFile("BaseRepositoryTest/testRemoveReference.IN.json"); Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testRemoveReference.DB.1.json"); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testRemoveReference.DB.2.json"); Resource out1 = getResourceFromJsonFile("BaseRepositoryTest/testRemoveReference.OUT.1.json"); Resource out2 = getResourceFromJsonFile("BaseRepositoryTest/testRemoveReference.OUT.2.json"); mBaseRepo.addResource(db1, mMetadata); mBaseRepo.addResource(db2, mMetadata); mBaseRepo.addResource(in, mMetadata); Resource get1 = mBaseRepo.getResource(out1.getAsString(JsonLdConstants.ID)); Resource get2 = mBaseRepo.getResource(out2.getAsString(JsonLdConstants.ID)); assertEquals(out1, get1); assertEquals(out2, get2); } @Test public void testGetResourcesWithWildcard() throws IOException, InterruptedException { Resource in1 = getResourceFromJsonFile("BaseRepositoryTest/testGetResourcesWithWildcard.DB.1.json"); Resource in2 = getResourceFromJsonFile("BaseRepositoryTest/testGetResourcesWithWildcard.DB.2.json"); mBaseRepo.addResource(in1, mMetadata); mBaseRepo.addResource(in2, mMetadata); Assert.assertEquals(2, mBaseRepo.getResources("\\*.@id", "info:123").size()); mBaseRepo.deleteResource(in1.getAsString(JsonLdConstants.ID), mMetadata); mBaseRepo.deleteResource(in2.getAsString(JsonLdConstants.ID), mMetadata); } @Test public void testSearchRankingNameHitsFirst() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testSearchRanking.DB.1.json"); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testSearchRanking.DB.2.json"); Resource db3 = getResourceFromJsonFile("BaseRepositoryTest/testSearchRanking.DB.3.json"); Resource db4 = getResourceFromJsonFile("BaseRepositoryTest/testSearchRanking.DB.4.json"); mBaseRepo.addResource(db2, mMetadata); mBaseRepo.addResource(db3, mMetadata); mBaseRepo.addResource(db4, mMetadata); mBaseRepo.addResource(db1, mMetadata); try { QueryContext queryContext = new QueryContext(null); queryContext.setElasticsearchFieldBoosts( // new String[] { // "about.name.@value^9.0", // "about.name.@value.variations^9.0", // "about.name.@value.simple_tokenized^9.0", // "about.alternateName.@value^6.0", "about.alternateName.@value.variations^6.0", // "about.alternateName.@value.simple_tokenized^6.0"}); List<Resource> actualList = ResourceHelpers.unwrapRecords(mBaseRepo.query("oerworldmap", 0, 10, null, null, queryContext).getItems()); List<String> actualNameList = getNameList(actualList); // must provide 3 hits because search is reduced on "about.name.@value" and // "about.alternateName.@value" Assert.assertTrue("Result size list is: " + actualNameList.size(), actualNameList.size() == 3); // hits 1 and 2 must contain "oerworldmap" in field "name". for (int i = 0; i < 2; i++) { Assert.assertTrue(actualNameList.get(i).toLowerCase().contains("oerworldmap")); } // hit 3 must not contain "oerworldmap" in field "name" for (int i = 2; i < 3; i++) { Assert.assertFalse(actualNameList.get(i).toLowerCase().contains("oerworldmap")); } // Resources db6 must not be found, since it only contains "oerworldmap" // in the field url // that is not in the list of searchable fields Assert.assertFalse(actualNameList.contains("Another Provider 4")); } // finally { mBaseRepo.deleteResource("urn:uuid:c7f5334a-3ddb-4e46-8653-4d8c01e00001", mMetadata); mBaseRepo.deleteResource("urn:uuid:c7f5334a-3ddb-4e46-8653-4d8c01e00002", mMetadata); mBaseRepo.deleteResource("urn:uuid:c7f5334a-3ddb-4e46-8653-4d8c01e00003", mMetadata); mBaseRepo.deleteResource("urn:uuid:c7f5334a-3ddb-4e46-8653-4d8c01e00004", mMetadata); mBaseRepo.deleteResource("urn:uuid:3a25e950-a3c0-425d-946d-980666500001", mMetadata); } } @Test public void testExactPersonHits() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testExactPersonHits.DB.1.json"); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testExactPersonHits.DB.2.json"); mBaseRepo.addResource(db1, mMetadata); mBaseRepo.addResource(db2, mMetadata); List<Resource> searchResults = mBaseRepo.query("Berger", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Did not get expected number of hits (1).", searchResults.size() == 1); Assert.assertTrue("Exact search hit was not found.", ((Resource) searchResults.get(0).get("about")).getId().equals(db1.getId())); mBaseRepo.deleteResource("urn:uuid:e00a2017-0b78-41f9-9171-8aec2f4b9ca2", mMetadata); mBaseRepo.deleteResource("urn:uuid:026ef084-8151-4749-8317-e2c5f46e06c6", mMetadata); } @Test public void testZoomedQueryResults() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testZoomedQueryResults.DB.1.json"); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testZoomedQueryResults.DB.2.json"); Resource db3 = getResourceFromJsonFile("BaseRepositoryTest/testZoomedQueryResults.DB.3.json"); mBaseRepo.addResource(db1, mMetadata); mBaseRepo.addResource(db2, mMetadata); mBaseRepo.addResource(db3, mMetadata); QueryContext queryContext = new QueryContext(null); // query before zooming List<Resource> beforeZoomList = ResourceHelpers.unwrapRecords(mBaseRepo.query("*", 0, 10, null, null, queryContext).getItems()); Assert.assertTrue(beforeZoomList.size() == 3); List<String> beforeZoomNames = getNameList(beforeZoomList); Assert.assertTrue(beforeZoomNames.contains("In Zoom Organization 1")); Assert.assertTrue(beforeZoomNames.contains("In Zoom Organization 2")); Assert.assertTrue(beforeZoomNames.contains("Out Of Zoom Organization 3")); // "zoom" queryContext.setZoomTopLeft(new GeoPoint(8.0, 2.5)); queryContext.setZoomBottomRight(new GeoPoint(4.0, 8.0)); // query after zooming List<Resource> afterZoomList = ResourceHelpers.unwrapRecords(mBaseRepo.query("*", 0, 10, null, null, queryContext).getItems()); Assert.assertTrue(afterZoomList.size() == 2); List<String> afterZoomNames = getNameList(afterZoomList); Assert.assertTrue(afterZoomNames.contains("In Zoom Organization 1")); Assert.assertTrue(afterZoomNames.contains("In Zoom Organization 2")); Assert.assertFalse(afterZoomNames.contains("Out Of Zoom Organization 3")); mBaseRepo.deleteResource("urn:uuid:eea2cb2a-9f4c-11e5-945f-001999ac0001", mMetadata); mBaseRepo.deleteResource("urn:uuid:eea2cb2a-9f4c-11e5-945f-001999ac0002", mMetadata); mBaseRepo.deleteResource("urn:uuid:eea2cb2a-9f4c-11e5-945f-001999ac0003", mMetadata); } @Test public void testPolygonFilteredSearch() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testPolygonFilteredSearch.DB.1.json"); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testPolygonFilteredSearch.DB.2.json"); Resource db3 = getResourceFromJsonFile("BaseRepositoryTest/testPolygonFilteredSearch.DB.3.json"); mBaseRepo.addResource(db1, mMetadata); mBaseRepo.addResource(db2, mMetadata); mBaseRepo.addResource(db3, mMetadata); QueryContext queryContext = new QueryContext(null); // query before filtering List<Resource> beforeFilterList = ResourceHelpers.unwrapRecords(mBaseRepo.query("*", 0, 10, null, null, queryContext).getItems()); Assert.assertTrue(beforeFilterList.size() == 3); List<String> beforeFilterNames = getNameList(beforeFilterList); Assert.assertTrue(beforeFilterNames.contains("Out Of Polygon Organization 1")); Assert.assertTrue(beforeFilterNames.contains("In Polygon Organization 2")); Assert.assertTrue(beforeFilterNames.contains("In Polygon Organization 3")); // filter into polygon List<GeoPoint> polygon = new ArrayList<>(); polygon.add(new GeoPoint(12.0, 13.0)); polygon.add(new GeoPoint(12.0, 14.0)); polygon.add(new GeoPoint(11.0, 14.0)); polygon.add(new GeoPoint(6.0, 4.0)); polygon.add(new GeoPoint(6.0, 3.0)); polygon.add(new GeoPoint(7.0, 3.0)); queryContext.setPolygonFilter(polygon); // query after filtering List<Resource> afterFilterList = ResourceHelpers.unwrapRecords(mBaseRepo.query("*", 0, 10, null, null, queryContext).getItems()); Assert.assertTrue(afterFilterList.size() == 2); List<String> afterFilterNames = getNameList(afterFilterList); Assert.assertFalse(afterFilterNames.contains("Out Of Polygon Organization 1")); Assert.assertTrue(afterFilterNames.contains("In Polygon Organization 2")); Assert.assertTrue(afterFilterNames.contains("In Polygon Organization 3")); mBaseRepo.deleteResource("urn:uuid:eea2cb2a-9f4c-11e5-945f-001999ac0001", mMetadata); mBaseRepo.deleteResource("urn:uuid:eea2cb2a-9f4c-11e5-945f-001999ac0002", mMetadata); mBaseRepo.deleteResource("urn:uuid:eea2cb2a-9f4c-11e5-945f-001999ac0003", mMetadata); } @Test public void testZoomedPolygonQueryResults() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testZoomedPolygonQueryResults.DB.1.json"); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testZoomedPolygonQueryResults.DB.2.json"); Resource db3 = getResourceFromJsonFile("BaseRepositoryTest/testZoomedPolygonQueryResults.DB.3.json"); mBaseRepo.addResource(db1, mMetadata); mBaseRepo.addResource(db2, mMetadata); mBaseRepo.addResource(db3, mMetadata); QueryContext queryContext = new QueryContext(null); // query before zooming List<Resource> beforeFilterList = ResourceHelpers.unwrapRecords(mBaseRepo.query("*", 0, 10, null, null, queryContext).getItems()); Assert.assertTrue(beforeFilterList.size() == 3); List<String> beforeFilterNames = getNameList(beforeFilterList); Assert.assertTrue(beforeFilterNames.contains("Out Of Polygon Zoom Organization 1")); Assert.assertTrue(beforeFilterNames.contains("In Polygon Zoom Organization 2")); Assert.assertTrue(beforeFilterNames.contains("Out Of Polygon Zoom Organization 3")); // filter into polygon List<GeoPoint> polygon = new ArrayList<>(); polygon.add(new GeoPoint(12.0, 13.0)); polygon.add(new GeoPoint(12.0, 14.0)); polygon.add(new GeoPoint(11.0, 14.0)); polygon.add(new GeoPoint(6.0, 4.0)); polygon.add(new GeoPoint(6.0, 3.0)); polygon.add(new GeoPoint(7.0, 3.0)); queryContext.setPolygonFilter(polygon); // and // "zoom" queryContext.setZoomTopLeft(new GeoPoint(8.0, 2.5)); queryContext.setZoomBottomRight(new GeoPoint(4.0, 8.0)); // query after zooming List<Resource> afterFilterList = ResourceHelpers.unwrapRecords(mBaseRepo.query("*", 0, 10, null, null, queryContext).getItems()); Assert.assertTrue(afterFilterList.size() == 1); List<String> afterFilterNames = getNameList(afterFilterList); Assert.assertFalse(afterFilterNames.contains("Out Of Polygon Zoom Organization 1")); Assert.assertTrue(afterFilterNames.contains("In Polygon Zoom Organization 2")); Assert.assertFalse(afterFilterNames.contains("Out Of Polygon Zoom Organization 3")); mBaseRepo.deleteResource("urn:uuid:eea2cb2a-9f4c-11e5-945f-001999ac0001", mMetadata); mBaseRepo.deleteResource("urn:uuid:eea2cb2a-9f4c-11e5-945f-001999ac0002", mMetadata); mBaseRepo.deleteResource("urn:uuid:eea2cb2a-9f4c-11e5-945f-001999ac0003", mMetadata); } @Test public void testSearchFuzzyWordSplit() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testSearchFuzzyWordSplit.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); // query correct spelling: List<Resource> correctQuery = ResourceHelpers.unwrapRecords(mBaseRepo.query("Letest", 0, 10, null, null, mDefaultQueryContext).getItems()); Assert.assertTrue("Could not find \"Letest\".", correctQuery.size() == 1); // query with white space inserted List<Resource> alternateQuery = ResourceHelpers.unwrapRecords(mBaseRepo.query("Le Test", 0, 10, null, null, mDefaultQueryContext).getItems()); Assert.assertTrue("Could not find \"Le Test\".", alternateQuery.size() == 1); System.out.println("alternateName: " + getNameList(alternateQuery)); mBaseRepo.deleteResource("urn:uuid:c407eede-7f00-11e5-a636-c48e8ff00001", mMetadata); mBaseRepo.deleteResource("urn:uuid:c407eede-7f00-11e5-a636-c48e8ff00002", mMetadata); } @Test public void testSearchFuzzyExtension() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testSearchFuzzyExtension.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); // query correct spelling: List<Resource> correctQuery = mBaseRepo.query("foobar.ao", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Could not find \"foobar.ao\".", correctQuery.size() == 1); // query with extension being dropped List<Resource> alternateQuery = mBaseRepo.query("foobar", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Could not find \"foobar\".", alternateQuery.size() == 1); mBaseRepo.deleteResource("urn:uuid:9843bac3-028f-4be8-ac54-92dcfea00001", mMetadata); mBaseRepo.deleteResource("urn:uuid:9843bac3-028f-4be8-ac54-92dcfea00002", mMetadata); } @Test public void testSearchFuzzyDiacritica() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testSearchFuzzyDiacritica.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); // query with diacritica List<Resource> correctQuery = mBaseRepo.query("tóobar.ao", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Could not find \"tóobar.ao\".", correctQuery.size() == 1); // query without diacritica List<Resource> alternateQuery = mBaseRepo.query("toobar.ao", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Could not find \"toobar.ao\".", alternateQuery.size() == 1); mBaseRepo.deleteResource("urn:uuid:9843bac3-028f-4be8-ac54-92dcfeb00001", mMetadata); mBaseRepo.deleteResource("urn:uuid:9843bac3-028f-4be8-ac54-92dcfeb00002", mMetadata); } @Test public void testAbbreviatedSearch() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testAbbreviatedSearch.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); // query with first letter only --> no hit List<Resource> oneLetterQuery = mBaseRepo.query("d", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Search result given by one letter search.", oneLetterQuery.size() == 0); // query with first two letters only --> no hit List<Resource> twoLettersQuery = mBaseRepo.query("do", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Search result given by two letter search.", twoLettersQuery.size() == 0); // query with first first three letters --> no hit List<Resource> threeLettersQuery = mBaseRepo.query("don", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Search result given by three letter search.", threeLettersQuery.size() == 0); // query with first first eight letters --> no hit List<Resource> eightLettersQuery = mBaseRepo.query("dontfind", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Search result given by eight letter search.", eightLettersQuery.size() == 0); // query with all letters --> hit List<Resource> allLettersQuery = mBaseRepo.query("dontfindmeabbreviated", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("No search result given by all letters search.", allLettersQuery.size() == 1); mBaseRepo.deleteResource("urn:uuid:9843bac3-028f-4be8-ac54-threeeb00001", mMetadata); mBaseRepo.deleteResource("urn:uuid:9843bac3-028f-4be8-ac54-threeeb00002", mMetadata); } @Test public void testSearchSpecialChars() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testSearchSpecialChars.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); // query without special chars List<Resource> withoutChars = mBaseRepo.query("OERforever", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Could not find \"OERforever\".", withoutChars.size() == 1); // query with special chars List<Resource> withChars = mBaseRepo.query("OERforever!", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Could not find \"OERforever!\".", withChars.size() == 1); mBaseRepo.deleteResource("", mMetadata); } @Test public void testSearchHyphenWords() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testSearchHyphenWords.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); // query complete word List<Resource> completeWord = mBaseRepo.query("e-paideia", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Could not find \"e-paideia\".", completeWord.size() == 1); // query abbreviated word List<Resource> abbreviatedWord = mBaseRepo.query("e-pai", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Accidentally found \"e-pai\".", abbreviatedWord.size() == 0); // query without hyphen List<Resource> withoutHyphen = mBaseRepo.query("epai", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Accidentally found \"epai\".", withoutHyphen.size() == 0); mBaseRepo.deleteResource("", mMetadata); } @Test public void testSearchMissing() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testSearchMissing.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testSearchMissing.DB.2.json"); mBaseRepo.addResource(db2, mMetadata); // query all by name List<Resource> queryByName = mBaseRepo.query("Service", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Did not find all by name.", queryByName.size() == 2); // query with special chars List<Resource> queryMissingChannel = mBaseRepo.query("_missing_:about.availableChannel", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Accidentally found non-missing resource.", queryMissingChannel.size() < 2); Assert.assertTrue("Did not find _missing_ resource.", queryMissingChannel.size() > 0); mBaseRepo.deleteResource("", mMetadata); } @Test public void testSearchKeyword() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testSearchKeyword.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); List<Resource> queryByKeyword = mBaseRepo.query("TVET", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Did not find resource by keyword.", queryByKeyword.size() == 1); List<Resource> queryByLowercaseKeyword = mBaseRepo.query("tvet", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Did not find resource by lowercased keyword.", queryByLowercaseKeyword.size() == 1); List<Resource> queryByUppercaseKeyword = mBaseRepo.query("Vocational Education And Training", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Did not find resource by uppercased keyword.", queryByUppercaseKeyword.size() == 1); mBaseRepo.deleteResource("", mMetadata); } @Test public void testRankKeyword() throws IOException, InterruptedException { for (int i=1; i<=8; i++){ Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testRankKeyword.IN."+i+".json"); mBaseRepo.addResource(db1, mMetadata); } Resource desired = getResourceFromJsonFile("BaseRepositoryTest/testRankKeyword.IN.3.json"); List<Resource> rankedList = mBaseRepo.query("TVET", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Did not find desired resource first while searching for keyword.", rankedList.get(0).getAsResource(Record.RESOURCE_KEY).getId().equals(desired.getId())); mBaseRepo.deleteResource("", mMetadata); } @Test public void testSearchBySubjectClassification() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testSearchBySubjectClassification.DB.1.json"); mBaseRepo.importResources(Arrays.asList(db1), mMetadata); List<Resource> searchBySubject = mBaseRepo.query("Mytestsubject", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Did not find resource by subject.", searchBySubject.size() > 0); mBaseRepo.deleteResource("", mMetadata); } @Test public void testSearchByEducationClassification() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testSearchByEducationClassification.DB.1.json"); mBaseRepo.importResources(Arrays.asList(db1), mMetadata); List<Resource> searchBySubject = mBaseRepo.query("Mytestaudience", 0, 10, null, null, mDefaultQueryContext).getItems(); Assert.assertTrue("Did not find resource by audience.", searchBySubject.size() > 0); mBaseRepo.deleteResource("", mMetadata); } @Test public void testNoGroundlessHits() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testNoGroundlessHits.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); QueryContext queryContext = new QueryContext(null); queryContext.setElasticsearchFieldBoosts(new SearchConfig().getBoostsForElasticsearch()); List<Resource> noHit = mBaseRepo.query("Schokolade", 0, 10, null, null, queryContext).getItems(); Assert.assertTrue("Unintended hit for \"Schokolade\".", noHit.size() == 0); noHit = mBaseRepo.query("Cape Town", 0, 10, null, null, queryContext).getItems(); Assert.assertTrue("Unintended hit for \"Cape Town\".", noHit.size() == 0); noHit = mBaseRepo.query("Paris", 0, 10, null, null, queryContext).getItems(); Assert.assertTrue("Unintended hit for \"Paris\".", noHit.size() == 0); noHit = mBaseRepo.query("London", 0, 10, null, null, queryContext).getItems(); Assert.assertTrue("Unintended hit for \"London\".", noHit.size() == 0); List<Resource> aHit = mBaseRepo.query("Education", 0, 10, null, null, queryContext).getItems(); Assert.assertTrue("Missing hit for \"Education\".", aHit.size() > 0); mBaseRepo.deleteResource("", mMetadata); } @Test public void testCountrySynonyms() throws IOException, InterruptedException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testCountrySynonyms.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); QueryContext queryContext = new QueryContext(null); queryContext.setElasticsearchFieldBoosts(new SearchConfig().getBoostsForElasticsearch()); BufferedReader countrySynonyms = new BufferedReader(new FileReader("scripts/country_synonyms.txt")); String countryLine = countrySynonyms.readLine(); while (countryLine != null){ String[] split = countryLine.split(",", 2); List<String> countries = Arrays.asList(split[1].split(",")); for (String country : countries) { // check all variants of "Ghana" are found if (split[0].equals("gh")){ List<Resource> hit = mBaseRepo.query(country, 0, 10, null, null, queryContext).getItems(); Assert.assertTrue("Missing hit for " + country + " while searching for country synonyms.", hit.size() == 1); } // check no other country variants are found else{ List<Resource> noHit = mBaseRepo.query(country, 0, 10, null, null, queryContext).getItems(); Assert.assertTrue("Unexpected hit for " + country + " while searching for country synonyms.", noHit.size() == 0); } } countryLine = countrySynonyms.readLine(); } mBaseRepo.deleteResource("urn:uuid:167b8283-fff2-4b4e-b0a0-909083305804", mMetadata); } @Test public void testLocalityNameSearch() throws IOException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testCountrySynonyms.DB.1.json"); mBaseRepo.addResource(db1, mMetadata); QueryContext queryContext = new QueryContext(null); queryContext.setElasticsearchFieldBoosts(new SearchConfig().getBoostsForElasticsearch()); List<Resource> hit = mBaseRepo.query("Accra", 0, 10, null, null, queryContext).getItems(); Assert.assertEquals(1, hit.size()); } @Test public void testBoostByLinks() throws IOException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testBoostByLinks.DB.1.json"); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testBoostByLinks.DB.2.json"); mBaseRepo.importResources(Arrays.asList(new Resource[]{db1, db2}), mMetadata); QueryContext queryContext = new QueryContext(null); queryContext.setElasticsearchFieldBoosts(new SearchConfig().getBoostsForElasticsearch()); List<Resource> hits = mBaseRepo.query("OER", 0, 10, null, null, queryContext).getItems(); Assert.assertEquals("Did not get expected number of hits (2).", 2, hits.size()); List<String> names = getNameList(ResourceHelpers.unwrapRecords(hits)); Assert.assertEquals("Did not get linked hit first.", db2.getNestedFieldValue("name.@value", Locale.ENGLISH), names.get(0)); mBaseRepo.deleteResource("", mMetadata); } @Test public void testBoostByLinksNested() throws IOException { Resource db1 = getResourceFromJsonFile("BaseRepositoryTest/testBoostByLinksNested.DB.1.json"); Resource db2 = getResourceFromJsonFile("BaseRepositoryTest/testBoostByLinksNested.DB.2.json"); Resource db3 = getResourceFromJsonFile("BaseRepositoryTest/testBoostByLinksNested.DB.3.json"); mBaseRepo.importResources(Arrays.asList(new Resource[]{db1, db2, db3}), mMetadata); QueryContext queryContext = new QueryContext(null); queryContext.setElasticsearchFieldBoosts(new SearchConfig().getBoostsForElasticsearch()); List<Resource> hits = mBaseRepo.query("OER", 0, 10, null, null, queryContext).getItems(); Assert.assertEquals("Did not get expected number of hits (3).", 3, hits.size()); List<String> names = getNameList(ResourceHelpers.unwrapRecords(hits)); // The nested link of db3 does not count, so db2 must be first Assert.assertEquals("Did not get linked hit first.", db2.getNestedFieldValue("name.@value", Locale.ENGLISH), names.get(0)); mBaseRepo.deleteResource("", mMetadata); } private List<String> getNameList(List<Resource> aResourceList) { List<String> result = new ArrayList<>(); for (Resource r : aResourceList) { List<?> nameList = (List<?>) r.get("name"); Resource name = (Resource) nameList.get(0); result.add(name.getAsString("@value")); } return result; } }