diff options
Diffstat (limited to 'firmal/src/main/java/bjc/firmal/gptbrowser/SaveConversationTask.java')
| -rw-r--r-- | firmal/src/main/java/bjc/firmal/gptbrowser/SaveConversationTask.java | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/firmal/src/main/java/bjc/firmal/gptbrowser/SaveConversationTask.java b/firmal/src/main/java/bjc/firmal/gptbrowser/SaveConversationTask.java new file mode 100644 index 0000000..5aabe50 --- /dev/null +++ b/firmal/src/main/java/bjc/firmal/gptbrowser/SaveConversationTask.java @@ -0,0 +1,127 @@ +package bjc.firmal.gptbrowser; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Future; + +import javax.swing.SwingWorker; + +import bjc.firmal.gptbrowser.msginfo.RawMessageDB; +import bjc.functypes.ClosableThrowFunction; +import bjc.utils.misc.NamedPreparedStatement; +import bjc.utils.misc.NamedPreparedStatement.Args; + +/** + * Worker task to save a conversation to the DB + */ +final class SaveConversationTask extends SwingWorker<Void, Integer> { + private GPTConversationDB conversation; + private ClosableThrowFunction<List<NamedPreparedStatement.Args>, CompletableFuture<List<Integer>>, SQLException> insertConvFunc; + private ClosableThrowFunction<List<NamedPreparedStatement.Args>, CompletableFuture<List<Integer>>, SQLException> insertMessageFunc; + + private String note; + private CountDownLatch msgCounter; + + /** + * Create a DB save worker task + * @param conv The conversation to save + * @param convUpdate The DB function for conversation updates + * @param msgUpdate The DB function for message updates + * @param msgCounter The message counter + */ + public SaveConversationTask(GPTConversationDB conv, + ClosableThrowFunction<List<NamedPreparedStatement.Args>, CompletableFuture<List<Integer>>, SQLException> convUpdate, + ClosableThrowFunction<List<NamedPreparedStatement.Args>, CompletableFuture<List<Integer>>, SQLException> msgUpdate, + CountDownLatch msgCounter) { + this.conversation = conv; + this.insertConvFunc = convUpdate; + this.insertMessageFunc = msgUpdate; + this.msgCounter = msgCounter; + } + + @Override + protected Void doInBackground() throws Exception { + List<NamedPreparedStatement.Args> insertConvArgs = new ArrayList<>(1); + + NamedPreparedStatement.Args.Builder insertConvRecord = NamedPreparedStatement.Args.builder(); + insertConvRecord.setString("id", conversation.getID()); + insertConvRecord.setString("title", conversation.getTitle()); + insertConvArgs.add(insertConvRecord.build()); + + List<RawMessageDB> messages = conversation.getRawMessages(); + List<NamedPreparedStatement.Args> insertMessageArgs = new ArrayList<>(messages.size()); + + int totalNumMessages = messages.size(); + int currNumMessages = 0; + + for (RawMessageDB message : messages) { + NamedPreparedStatement.Args.Builder insertMessageRecord = NamedPreparedStatement.Args.builder(); + + if (isCancelled()) break; + + int currProgress = Math.min(100, (currNumMessages / totalNumMessages) * 100); + setProgress(currProgress); + + String parentID = message.getParentMessageID(); + if (conversation.hasSeenRawMessage(parentID)) { + String newNote = "Saving message " + currNumMessages + " of " + totalNumMessages; + firePropertyChange("note", note, newNote); + note = newNote; + + + insertMessageRecord.setString("selfid", message.getMessageID()); + insertMessageRecord.setString("convid", message.getConversationID()); + insertMessageRecord.setString("body", message.getMessageBody()); + // TODO figure out why we are getting constraint violations here. + // Do we really need to leave this null initially, then backfill it? + // Or do we need to be doing these as independent DB queries instead of batching them? + // That sounds rather inefficient, but so is doing a second pass to fill it later + // insertMessage.setString("parentid", message.getParentMessageID()); + insertMessageArgs.add(insertMessageRecord.build()); + } else { + // TODO: this message has a missing/incorrect parent link + } + } + + String newNote = "Starting save of " + GPTJSONBrowserFrame.BATCH_THRESHOLD + " messages/conversations to the DB"; + firePropertyChange("note", note, newNote); + note = newNote; + + // Save our changes for this conversation + Future<List<Integer>> insertConversationResults = insertConvFunc.apply(insertConvArgs); + + for (int i : insertConversationResults.get()) { + if (i != 0 && i != 1) { + // TODO: do something about an oddity + } + } + + Future<List<Integer>> insertMessageResults = insertMessageFunc.apply(insertMessageArgs); + for (int i : insertMessageResults.get()) { + if (i != 0 && i != 1) { + // TODO handle oddities + } + } + + newNote = "Saved " + GPTJSONBrowserFrame.BATCH_THRESHOLD + " messages/conversations to the DB"; + firePropertyChange("note", note, newNote); + + + return null; + } + + @Override + protected void done() { + msgCounter.countDown(); + } + + public String getNote() { + return note; + } + public void setNote(String note) { + this.note = note; + } +}
\ No newline at end of file |
