X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FSearchPage.java;h=1d1aa36fb000af61694efca75475a1f83acc4914;hb=e3395d9dd51f56240e4cb9509ccd403bf5f9e343;hp=5cdd5634569d722c2a89894d57443bb5618ce811;hpb=8d545b0722d995cad065af7a31e3d9fb33c59892;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/web/SearchPage.java b/src/main/java/net/pterodactylus/sone/web/SearchPage.java index 5cdd563..1d1aa36 100644 --- a/src/main/java/net/pterodactylus/sone/web/SearchPage.java +++ b/src/main/java/net/pterodactylus/sone/web/SearchPage.java @@ -79,14 +79,14 @@ public class SearchPage extends SoneTemplatePage { List phrases = parseSearchPhrases(query); Set sones = webInterface.getCore().getSones(); - Set> soneHits = getHits(sones, phrases, SoneStringGenerator.GENERATOR); + Set> soneHits = getHits(sones, phrases, SoneStringGenerator.COMPLETE_GENERATOR); Set posts = new HashSet(); for (Sone sone : sones) { posts.addAll(sone.getPosts()); } @SuppressWarnings("synthetic-access") - Set> postHits = getHits(posts, phrases, new PostStringGenerator()); + Set> postHits = getHits(Filters.filteredSet(posts, Post.FUTURE_POSTS_FILTER), phrases, new PostStringGenerator()); /* now filter. */ soneHits = Filters.filteredSet(soneHits, Hit.POSITIVE_FILTER); @@ -103,8 +103,8 @@ public class SearchPage extends SoneTemplatePage { List resultPosts = Converters.convertList(sortedPostHits, new HitConverter()); /* pagination. */ - Pagination sonePagination = new Pagination(resultSones, 10).setPage(Numbers.safeParseInteger(request.getHttpRequest().getParam("sonePage"), 0)); - Pagination postPagination = new Pagination(resultPosts, 10).setPage(Numbers.safeParseInteger(request.getHttpRequest().getParam("postPage"), 0)); + Pagination sonePagination = new Pagination(resultSones, webInterface.getCore().getPreferences().getPostsPerPage()).setPage(Numbers.safeParseInteger(request.getHttpRequest().getParam("sonePage"), 0)); + Pagination postPagination = new Pagination(resultPosts, webInterface.getCore().getPreferences().getPostsPerPage()).setPage(Numbers.safeParseInteger(request.getHttpRequest().getParam("postPage"), 0)); templateContext.set("sonePagination", sonePagination); templateContext.set("soneHits", sonePagination.getItems()); @@ -191,21 +191,31 @@ public class SearchPage extends SoneTemplatePage { int forbiddenHits = 0; int requiredPhrases = 0; for (Phrase phrase : phrases) { + String phraseString = phrase.getPhrase().toLowerCase(); if (phrase.getOptionality() == Phrase.Optionality.REQUIRED) { ++requiredPhrases; } - boolean matches = expression.toLowerCase().contains(phrase.getPhrase().toLowerCase()); - if (!matches) { + int matches = 0; + int index = 0; + while (index < expression.length()) { + int position = expression.toLowerCase().indexOf(phraseString, index); + if (position == -1) { + break; + } + index = position + phraseString.length(); + ++matches; + } + if (matches == 0) { continue; } if (phrase.getOptionality() == Phrase.Optionality.REQUIRED) { - ++requiredHits; + requiredHits += matches; } if (phrase.getOptionality() == Phrase.Optionality.OPTIONAL) { - ++optionalHits; + optionalHits += matches; } if (phrase.getOptionality() == Phrase.Optionality.FORBIDDEN) { - ++forbiddenHits; + forbiddenHits += matches; } } return requiredHits * 3 + optionalHits + (requiredHits - requiredPhrases) * 5 - (forbiddenHits * 2); @@ -239,8 +249,28 @@ public class SearchPage extends SoneTemplatePage { */ private static class SoneStringGenerator implements StringGenerator { - /** A static instance of the Sone string generator. */ - public static final SoneStringGenerator GENERATOR = new SoneStringGenerator(); + /** A static instance of a complete Sone string generator. */ + public static final SoneStringGenerator COMPLETE_GENERATOR = new SoneStringGenerator(true); + + /** + * A static instance of a Sone string generator that will only use the + * name of the Sone. + */ + public static final SoneStringGenerator NAME_GENERATOR = new SoneStringGenerator(false); + + /** Whether to generate a string from all data of a Sone. */ + private final boolean complete; + + /** + * Creates a new Sone string generator. + * + * @param complete + * {@code true} to use the profile’s fields, {@code false} to + * not to use the profile‘s fields + */ + private SoneStringGenerator(boolean complete) { + this.complete = complete; + } /** * {@inheritDoc} @@ -259,8 +289,10 @@ public class SearchPage extends SoneTemplatePage { if (soneProfile.getLastName() != null) { soneString.append(' ').append(soneProfile.getLastName()); } - for (Field field : soneProfile.getFields()) { - soneString.append(' ').append(field.getValue()); + if (complete) { + for (Field field : soneProfile.getFields()) { + soneString.append(' ').append(field.getValue()); + } } return soneString.toString(); } @@ -284,10 +316,10 @@ public class SearchPage extends SoneTemplatePage { StringBuilder postString = new StringBuilder(); postString.append(post.getText()); if (post.getRecipient() != null) { - postString.append(' ').append(SoneStringGenerator.GENERATOR.generateString(post.getRecipient())); + postString.append(' ').append(SoneStringGenerator.NAME_GENERATOR.generateString(post.getRecipient())); } - for (Reply reply : webInterface.getCore().getReplies(post)) { - postString.append(' ').append(SoneStringGenerator.GENERATOR.generateString(reply.getSone())); + for (Reply reply : Filters.filteredList(webInterface.getCore().getReplies(post), Reply.FUTURE_REPLIES_FILTER)) { + postString.append(' ').append(SoneStringGenerator.NAME_GENERATOR.generateString(reply.getSone())); postString.append(' ').append(reply.getText()); } return postString.toString();