Mercurial Hosting > luan
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(); + } +}