// SONETEMPLATEPAGE METHODS
//
+ /**
+ * {@inheritDoc}
+ */
@Override
protected void processTemplate(Request request, TemplateContext templateContext) throws RedirectException {
super.processTemplate(request, templateContext);
List<Phrase> phrases = parseSearchPhrases(query);
Set<Sone> sones = webInterface.getCore().getSones();
- Set<Hit<Sone>> soneHits = getHits(sones, phrases, SoneStringGenerator.GENERATOR);
+ Set<Hit<Sone>> soneHits = getHits(sones, phrases, SoneStringGenerator.COMPLETE_GENERATOR);
Set<Post> posts = new HashSet<Post>();
for (Sone sone : sones) {
* Parses the given query into search phrases. The query is split on
* whitespace while allowing to group words using single or double quotes.
* Isolated phrases starting with a “+” are
- * {@link Phrase.Optionality#REQUIRED}, phrases with a
- * “-” are {@link Phrase.Optionality#FORBIDDEN}.
+ * {@link Phrase.Optionality#REQUIRED}, phrases with a “-” are
+ * {@link Phrase.Optionality#FORBIDDEN}.
*
* @param query
* The query to parse
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);
*/
private static class SoneStringGenerator implements StringGenerator<Sone> {
- /** 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}
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();
}
/**
* Generates a {@link String} from a {@link Post}, concatenating the text of
* the post, the text of all {@link Reply}s, and the name of all
- * {@link Sone}s that have
- * replied.
+ * {@link Sone}s that have replied.
*
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
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()));
+ postString.append(' ').append(SoneStringGenerator.NAME_GENERATOR.generateString(reply.getSone()));
postString.append(' ').append(reply.getText());
}
return postString.toString();
*/
public static class HitConverter<T> implements Converter<Hit<T>, T> {
+ /**
+ * {@inheritDoc}
+ */
@Override
public T convert(Hit<T> input) {
return input.getObject();