diff src/goodjava/lucene/logging/LoggingIndexWriter.java @ 1461:e5d48b85351c

start lucene.logging
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 28 Mar 2020 21:30:42 -0600
parents
children 5e3870618377
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/goodjava/lucene/logging/LoggingIndexWriter.java	Sat Mar 28 21:30:42 2020 -0600
@@ -0,0 +1,94 @@
+package goodjava.lucene.logging;
+
+import java.io.IOException;
+import java.util.Map;
+import org.apache.lucene.search.Query;
+import goodjava.lucene.api.GoodIndexWriter;
+
+
+public class LoggingIndexWriter implements GoodIndexWriter {
+	private static final int OP_DELETE_ALL = 1;
+	private static final int OP_DELETE_DOCUMENTS = 2;
+	private static final int OP_ADD_DOCUMENT = 3;
+	private static final int OP_UPDATE_DOCUMENT = 4;
+
+	public final GoodIndexWriter indexWriter;
+	private final LogFile logFile;
+
+	public LoggingIndexWriter(GoodIndexWriter indexWriter) throws IOException {
+		this.indexWriter = indexWriter;
+		logFile = new LogFile("lucene.log","rw");
+		logFile.gotoStart();  // for now
+	}
+
+	public void close() throws IOException {
+		indexWriter.close();
+		logFile.commit();
+	}
+
+	public void commit() throws IOException {
+		indexWriter.commit();
+		logFile.commit();
+	}
+
+	public void rollback() throws IOException {
+		indexWriter.rollback();
+		logFile.gotoEnd();
+	}
+
+	public void deleteAll() throws IOException {
+		indexWriter.deleteAll();
+		logFile.writeByte(OP_DELETE_ALL);
+	}
+
+	public void deleteDocuments(Query query) throws IOException {
+		indexWriter.deleteDocuments(query);
+		logFile.writeByte(OP_DELETE_DOCUMENTS);
+		logFile.writeQuery(query);
+	}
+
+	public void addDocument(Map<String,Object> storedFields) throws IOException {
+		indexWriter.addDocument(storedFields);
+		logFile.writeByte(OP_ADD_DOCUMENT);
+		logFile.writeMap(storedFields);
+	}
+
+	public void updateDocument(String keyFieldName,Map<String,Object> storedFields) throws IOException {
+		indexWriter.updateDocument(keyFieldName,storedFields);
+		logFile.writeByte(OP_UPDATE_DOCUMENT);
+		logFile.writeUTF(keyFieldName);
+		logFile.writeMap(storedFields);
+	}
+
+	public void reindexDocuments(String keyFieldName,Query query) throws IOException {
+		indexWriter.reindexDocuments(keyFieldName,query);
+	}
+
+	private void playOp() throws IOException {
+		int op = logFile.readByte();
+		switch(op) {
+		case OP_DELETE_ALL:
+			indexWriter.deleteAll();
+			return;
+		case OP_DELETE_DOCUMENTS:
+			indexWriter.deleteDocuments( logFile.readQuery() );
+			return;
+		case OP_ADD_DOCUMENT:
+			indexWriter.addDocument( logFile.readMap() );
+			return;
+		case OP_UPDATE_DOCUMENT:
+			indexWriter.updateDocument( logFile.readUTF(), logFile.readMap() );
+			return;
+		default:
+			throw new RuntimeException("invalid op "+op);
+		}
+	}
+
+	public void playLog() throws IOException {
+		logFile.gotoStart();
+		while( logFile.hasMore() ) {
+			playOp();
+		}
+		indexWriter.commit();
+	}
+}