summaryrefslogtreecommitdiff
path: root/firmal/src/main/java/bjc/firmal/gptbrowser/SaveConversationTask.java
diff options
context:
space:
mode:
Diffstat (limited to 'firmal/src/main/java/bjc/firmal/gptbrowser/SaveConversationTask.java')
-rw-r--r--firmal/src/main/java/bjc/firmal/gptbrowser/SaveConversationTask.java127
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