1461
|
1 package goodjava.lucene.logging;
|
|
2
|
|
3 import java.io.IOException;
|
|
4 import java.util.Map;
|
|
5 import org.apache.lucene.search.Query;
|
|
6 import goodjava.lucene.api.GoodIndexWriter;
|
|
7
|
|
8
|
|
9 public class LoggingIndexWriter implements GoodIndexWriter {
|
|
10 private static final int OP_DELETE_ALL = 1;
|
|
11 private static final int OP_DELETE_DOCUMENTS = 2;
|
|
12 private static final int OP_ADD_DOCUMENT = 3;
|
|
13 private static final int OP_UPDATE_DOCUMENT = 4;
|
|
14
|
|
15 public final GoodIndexWriter indexWriter;
|
|
16 private final LogFile logFile;
|
|
17
|
|
18 public LoggingIndexWriter(GoodIndexWriter indexWriter) throws IOException {
|
|
19 this.indexWriter = indexWriter;
|
|
20 logFile = new LogFile("lucene.log","rw");
|
|
21 logFile.gotoStart(); // for now
|
|
22 }
|
|
23
|
|
24 public void close() throws IOException {
|
|
25 indexWriter.close();
|
|
26 logFile.commit();
|
|
27 }
|
|
28
|
|
29 public void commit() throws IOException {
|
|
30 indexWriter.commit();
|
|
31 logFile.commit();
|
|
32 }
|
|
33
|
|
34 public void rollback() throws IOException {
|
|
35 indexWriter.rollback();
|
|
36 logFile.gotoEnd();
|
|
37 }
|
|
38
|
|
39 public void deleteAll() throws IOException {
|
|
40 indexWriter.deleteAll();
|
|
41 logFile.writeByte(OP_DELETE_ALL);
|
|
42 }
|
|
43
|
|
44 public void deleteDocuments(Query query) throws IOException {
|
|
45 indexWriter.deleteDocuments(query);
|
|
46 logFile.writeByte(OP_DELETE_DOCUMENTS);
|
|
47 logFile.writeQuery(query);
|
|
48 }
|
|
49
|
|
50 public void addDocument(Map<String,Object> storedFields) throws IOException {
|
|
51 indexWriter.addDocument(storedFields);
|
|
52 logFile.writeByte(OP_ADD_DOCUMENT);
|
|
53 logFile.writeMap(storedFields);
|
|
54 }
|
|
55
|
|
56 public void updateDocument(String keyFieldName,Map<String,Object> storedFields) throws IOException {
|
|
57 indexWriter.updateDocument(keyFieldName,storedFields);
|
|
58 logFile.writeByte(OP_UPDATE_DOCUMENT);
|
|
59 logFile.writeUTF(keyFieldName);
|
|
60 logFile.writeMap(storedFields);
|
|
61 }
|
|
62
|
|
63 public void reindexDocuments(String keyFieldName,Query query) throws IOException {
|
|
64 indexWriter.reindexDocuments(keyFieldName,query);
|
|
65 }
|
|
66
|
|
67 private void playOp() throws IOException {
|
|
68 int op = logFile.readByte();
|
|
69 switch(op) {
|
|
70 case OP_DELETE_ALL:
|
|
71 indexWriter.deleteAll();
|
|
72 return;
|
|
73 case OP_DELETE_DOCUMENTS:
|
|
74 indexWriter.deleteDocuments( logFile.readQuery() );
|
|
75 return;
|
|
76 case OP_ADD_DOCUMENT:
|
|
77 indexWriter.addDocument( logFile.readMap() );
|
|
78 return;
|
|
79 case OP_UPDATE_DOCUMENT:
|
|
80 indexWriter.updateDocument( logFile.readUTF(), logFile.readMap() );
|
|
81 return;
|
|
82 default:
|
|
83 throw new RuntimeException("invalid op "+op);
|
|
84 }
|
|
85 }
|
|
86
|
|
87 public void playLog() throws IOException {
|
|
88 logFile.gotoStart();
|
|
89 while( logFile.hasMore() ) {
|
|
90 playOp();
|
|
91 }
|
|
92 indexWriter.commit();
|
|
93 }
|
|
94 }
|