ConversationService additions, fixed migration script
This commit is contained in:
parent
d9090eb70c
commit
3ab3d7a0ca
@ -22,18 +22,35 @@ import ch.dissem.bitmessage.ports.MessageRepository;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static java.util.regex.Pattern.CASE_INSENSITIVE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper service to work with conversations
|
* Service that helps with conversations.
|
||||||
*/
|
*/
|
||||||
public class ConversationService {
|
public class ConversationService {
|
||||||
private final MessageRepository messageRepository;
|
private final MessageRepository messageRepository;
|
||||||
|
|
||||||
|
private final Pattern SUBJECT_PREFIX = Pattern.compile("^(re|fwd?):", CASE_INSENSITIVE);
|
||||||
|
|
||||||
public ConversationService(MessageRepository messageRepository) {
|
public ConversationService(MessageRepository messageRepository) {
|
||||||
this.messageRepository = messageRepository;
|
this.messageRepository = messageRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the whole conversation from one single message. If the message isn't part
|
||||||
|
* of a conversation, a singleton list containing the given message is returned. Otherwise
|
||||||
|
* it's the same as {@link #getConversation(UUID)}
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* @return a list of messages that belong to the same conversation.
|
||||||
|
*/
|
||||||
public List<Plaintext> getConversation(Plaintext message) {
|
public List<Plaintext> getConversation(Plaintext message) {
|
||||||
|
if (message.getConversationId() == null) {
|
||||||
|
return Collections.singletonList(message);
|
||||||
|
}
|
||||||
return getConversation(message.getConversationId());
|
return getConversation(message.getConversationId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,6 +94,19 @@ public class ConversationService {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getSubject(List<Plaintext> conversation) {
|
||||||
|
if (conversation.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// TODO: this has room for improvement
|
||||||
|
String subject = conversation.get(0).getSubject();
|
||||||
|
Matcher matcher = SUBJECT_PREFIX.matcher(subject);
|
||||||
|
if (matcher.find()) {
|
||||||
|
return subject.substring(matcher.end()).trim();
|
||||||
|
}
|
||||||
|
return subject.trim();
|
||||||
|
}
|
||||||
|
|
||||||
private int lastParentPosition(Plaintext child, LinkedList<Plaintext> messages) {
|
private int lastParentPosition(Plaintext child, LinkedList<Plaintext> messages) {
|
||||||
Iterator<Plaintext> plaintextIterator = messages.descendingIterator();
|
Iterator<Plaintext> plaintextIterator = messages.descendingIterator();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
ALTER TABLE Message ADD COLUMN conversation UUID NOT NULL DEFAULT RANDOM_UUID();
|
ALTER TABLE Message ADD COLUMN conversation UUID;
|
||||||
|
|
||||||
CREATE TABLE Message_Parent (
|
CREATE TABLE Message_Parent (
|
||||||
parent BINARY(64) NOT NULL,
|
parent BINARY(64) NOT NULL,
|
||||||
child BINARY(64) NOT NULL,
|
child BINARY(64) NOT NULL,
|
||||||
pos INT NOT NULL,
|
pos INT NOT NULL,
|
||||||
conversation UUID,
|
conversation UUID NOT NULL,
|
||||||
|
|
||||||
PRIMARY KEY (parent, child),
|
PRIMARY KEY (parent, child),
|
||||||
FOREIGN KEY (child) REFERENCES Message (iv)
|
FOREIGN KEY (child) REFERENCES Message (iv)
|
||||||
|
Loading…
Reference in New Issue
Block a user