diff --git a/src/main/java/org/ayfaar/app/controllers/NewSuggestionsController.java b/src/main/java/org/ayfaar/app/controllers/NewSuggestionsController.java index 37c78370..55c41a43 100644 --- a/src/main/java/org/ayfaar/app/controllers/NewSuggestionsController.java +++ b/src/main/java/org/ayfaar/app/controllers/NewSuggestionsController.java @@ -1,5 +1,6 @@ package org.ayfaar.app.controllers; +import lombok.extern.slf4j.Slf4j; import one.util.streamex.StreamEx; import org.apache.commons.lang3.tuple.ImmutablePair; import org.ayfaar.app.dao.TermDao; @@ -12,6 +13,7 @@ import org.ayfaar.app.utils.ContentsService; import org.ayfaar.app.utils.TermService; import org.ayfaar.app.utils.UriGenerator; +import org.ayfaar.app.utils.contents.ContentsUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -28,6 +30,7 @@ import static java.util.regex.Pattern.CASE_INSENSITIVE; import static java.util.regex.Pattern.UNICODE_CASE; +@Slf4j @RestController @RequestMapping("api/suggestions") public class NewSuggestionsController { @@ -39,9 +42,11 @@ public class NewSuggestionsController { @Autowired VideoResourceService videoResourceService; @Autowired RecordService recordService; @Autowired ItemService itemService; + @Autowired ContentsUtils contentsUtils; private List escapeChars = Arrays.asList("(", ")", "[", "]", "{", "}"); private static final int MAX_SUGGESTIONS = 5; + private static final int MAX_WORDS_PARAGRAPH_AFTER_SEARCH = 4; public Map suggestions(String q) { return suggestions(q, false, false, false, false, false, false, false, false, false); @@ -74,7 +79,13 @@ public Map suggestions(@RequestParam String q, for (Suggestions item : items) { Queue queriesQueue = getQueue(q); for (Map.Entry suggestion : getSuggestions(queriesQueue, item)) { - allSuggestions.put(suggestion.getKey(), suggestion.getValue()); + String key = suggestion.getKey(); + String value = suggestion.getValue(); + if(key.contains("ии:пункты:")) { + String suggestionParagraph = contentsUtils.filterLengthWordsAfter(value, q, MAX_WORDS_PARAGRAPH_AFTER_SEARCH); + if(suggestionParagraph != "")allSuggestions.put(key, key.substring(10) + ":" + suggestionParagraph); + } + else allSuggestions.put(key, value); } } return allSuggestions; diff --git a/src/main/java/org/ayfaar/app/utils/contents/ContentsUtils.java b/src/main/java/org/ayfaar/app/utils/contents/ContentsUtils.java new file mode 100644 index 00000000..c6e72c78 --- /dev/null +++ b/src/main/java/org/ayfaar/app/utils/contents/ContentsUtils.java @@ -0,0 +1,58 @@ +package org.ayfaar.app.utils.contents; + +import org.springframework.stereotype.Component; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Component +public class ContentsUtils { + + public static String filterLengthWordsAfter(String paragraph, String search, int countWordsBeforeAndAfter){ + String wholeFind = ""; + String searchResult = null; + String str = paragraph; + String find = search; + + //check if not the full text + Pattern pattern = Pattern.compile("\\S*" + find + "\\S*",Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); + Matcher matcher = pattern.matcher(str); + while (matcher.find()) { + wholeFind = matcher.group(); + } + + //create minimal string + int countWords = countWordsBeforeAndAfter; + String[] sp = str.split(" +"); // "+" for multiple spaces + List strings = Arrays.asList(sp); + String[] findStringArr = {}; + if (wholeFind.equals("")) findStringArr = find.split(" "); + else findStringArr = wholeFind.split(" "); + + int lengthFindStringArr = findStringArr.length; + int lengthParagraph = sp.length; + String firstPosition = findStringArr[0]; + String lastPosition = findStringArr[lengthFindStringArr - 1]; + int iLast = strings.indexOf(lastPosition); + + for (int i = 0; i < lengthParagraph; i++) { + String addFirstDots = ""; + if (sp[i].equals(firstPosition) && sp[i + lengthFindStringArr-1].equals(lastPosition)) { + + String after = ""; + for (int j = 1; j <= countWords; j++) { + if(iLast+j < lengthParagraph) after += " " + sp[iLast+j]; + } + + after = after.replaceAll("[-+.^:,]$",""); + if(!after.equals(" ") && iLast + countWords < lengthParagraph) after += "..."; + if (!firstPosition.equals(sp[0])) addFirstDots = "..."; + searchResult = addFirstDots + wholeFind + after; + } + } + + return searchResult == null ? "" : searchResult; + } +} + diff --git a/src/test/java/org/ayfaar/app/utils/contents/ContentsUtilsTest.java b/src/test/java/org/ayfaar/app/utils/contents/ContentsUtilsTest.java new file mode 100644 index 00000000..7e69f993 --- /dev/null +++ b/src/test/java/org/ayfaar/app/utils/contents/ContentsUtilsTest.java @@ -0,0 +1,88 @@ +package org.ayfaar.app.utils.contents; + + +import org.ayfaar.app.IntegrationTest; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static junit.framework.Assert.assertNull; +import static org.junit.Assert.assertEquals; + +public class ContentsUtilsTest extends IntegrationTest{ + + @Autowired + ContentsUtils contentsUtils; + + @Test //Test full text + public void filterLengthWordsAfterTest(){ + + //ГЛАВА 1 параграф 13.12.1.3 + String paragraph = "Опыт Формо-системы распространяется и закладывается в \"Память-Мира-о-Былом\", " + + "его основой является Фокусная Динамика УУ-ВВУ. Ничто никуда не девается, не перемещается. " + + "Умерших личностей нет – есть лишь определенный сценарий-Программа. "; + + String find = "Опыт Формо-системы распространяется и закладывается в \"Память-Мира-о-Былом\", " + + "его основой является Фокусная Динамика УУ-ВВУ. Ничто никуда не девается, не перемещается. " + + "Умерших личностей нет – есть лишь определенный сценарий-Программа. "; + String s = contentsUtils.filterLengthWordsAfter(paragraph, find, 3); + + assertEquals("Опыт Формо-системы распространяется и закладывается в \"Память-Мира-о-Былом\", " + + "его основой является Фокусная Динамика УУ-ВВУ. Ничто никуда не девается, не перемещается. " + + "Умерших личностей нет – есть лишь определенный сценарий-Программа. ", s); + } + + @Test //текст из середины, результат должен быть впереди с "..." и сзади плюс три слова и "..." + public void filterLengthWordsAfterTest1(){ + + + String paragraph = "Опыт Формо-системы распространяется и закладывается в \"Память-Мира-о-Былом\", " + + "его основой является Фокусная Динамика УУ-ВВУ. Ничто никуда не девается, не перемещается. " + + "Умерших личностей нет – есть лишь определенный сценарий-Программа. "; + + String find = "его основой является Фокусная Динамика УУ-ВВУ. Ничто никуда не девается, не перемещается."; + String s = contentsUtils.filterLengthWordsAfter(paragraph, find, 3); + + assertEquals("...его основой является Фокусная Динамика УУ-ВВУ. Ничто никуда не девается, не перемещается. " + + "Умерших личностей нет...", s); + } + + @Test //текст с конца строки, троеточие подставляется только впереди строки + public void filterLengthWordsAfterTest2(){ + + + String paragraph = "Опыт Формо-системы распространяется и закладывается в \"Память-Мира-о-Былом\", " + + "его основой является Фокусная Динамика УУ-ВВУ. Ничто никуда не девается, не перемещается. " + + "Умерших личностей нет – есть лишь определенный сценарий-Программа."; + + String find = "Умерших личностей нет – есть лишь определенный сценарий-Программа."; + String s = contentsUtils.filterLengthWordsAfter(paragraph, find, 3); + + assertEquals("...Умерших личностей нет – есть лишь определенный сценарий-Программа.", s); + } + + @Test //текст с начала строки, в результат дописывается еще три слова плюс троеточие подставляется только вконце строки + public void filterLengthWordsAfterTest3(){ + + String paragraph = "Опыт Формо-системы распространяется и закладывается в \"Память-Мира-о-Былом\", " + + "его основой является Фокусная Динамика УУ-ВВУ. Ничто никуда не девается, не перемещается. " + + "Умерших личностей нет – есть лишь определенный сценарий-Программа."; + + String find = "Опыт Формо-системы распространяется и закладывается в \"Память-Мира-о-Былом\","; + String s = contentsUtils.filterLengthWordsAfter(paragraph, find, 3); + + assertEquals("Опыт Формо-системы распространяется и закладывается в \"Память-Мира-о-Былом\", его основой является...", s); + } + + @Test //поиск не существующего текста, должен выдавать пустую строку + public void filterLengthWordsAfterTest4(){ + + String paragraph = "Опыт Формо-системы распространяется и закладывается в \"Память-Мира-о-Былом\", " + + "его основой является Фокусная Динамика УУ-ВВУ. Ничто никуда не девается, не перемещается. " + + "Умерших личностей нет – есть лишь определенный сценарий-Программа."; + + String find = "sdlkdfsfsdfdsdfjs"; + String s = contentsUtils.filterLengthWordsAfter(paragraph, find, 3); + + assertEquals("", s); + } +}