comparison src/goodjava/lucene/logging/LogFile.java @ 1461:e5d48b85351c

start lucene.logging
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 28 Mar 2020 21:30:42 -0600
parents
children bfbf9c9c1586
comparison
equal deleted inserted replaced
1460:3ab0d043370f 1461:e5d48b85351c
1 package goodjava.lucene.logging;
2
3 import java.io.File;
4 import java.io.RandomAccessFile;
5 import java.io.IOException;
6 import java.util.List;
7 import java.util.ArrayList;
8 import java.util.Map;
9 import java.util.LinkedHashMap;
10 import org.apache.lucene.index.Term;
11 import org.apache.lucene.search.Query;
12 import org.apache.lucene.search.MatchAllDocsQuery;
13 import org.apache.lucene.search.TermQuery;
14 import org.apache.lucene.search.PrefixQuery;
15 import org.apache.lucene.search.WildcardQuery;
16 import org.apache.lucene.search.TermRangeQuery;
17 import org.apache.lucene.search.PhraseQuery;
18 import org.apache.lucene.search.NumericRangeQuery;
19 import org.apache.lucene.search.BooleanQuery;
20 import org.apache.lucene.search.BooleanClause;
21 import org.apache.lucene.util.BytesRef;
22
23
24 public final class LogFile extends RandomAccessFile {
25 private long end;
26
27 public LogFile(File file,String mode) throws IOException {
28 super(file,mode);
29 init();
30 }
31
32 public LogFile(String file,String mode) throws IOException {
33 super(file,mode);
34 init();
35 }
36
37 private void init() throws IOException {
38 if( length() == 0 ) {
39 end = 8;
40 writeLong(end);
41 } else {
42 seek(0L);
43 end = readLong();
44 gotoEnd();
45 }
46 }
47
48 public void gotoStart() throws IOException {
49 seek(8L);
50 }
51
52 public void gotoEnd() throws IOException {
53 seek(end);
54 }
55
56 public void commit() throws IOException {
57 end = getFilePointer();
58 seek(0L);
59 writeLong(end);
60 gotoEnd();
61 }
62
63 public boolean hasMore() throws IOException {
64 return getFilePointer() < end;
65 }
66
67 private static final int TYPE_NULL = 0;
68 private static final int TYPE_STRING = 1;
69 private static final int TYPE_INT = 2;
70 private static final int TYPE_LONG = 3;
71 private static final int TYPE_FLOAT = 4;
72 private static final int TYPE_DOUBLE = 5;
73 private static final int TYPE_BYTES = 6;
74 private static final int TYPE_LIST = 7;
75 private static final int TYPE_QUERY_MATCH_ALL_DOCS = 8;
76 private static final int TYPE_QUERY_TERM = 9;
77 private static final int TYPE_QUERY_PREFIX = 10;
78 private static final int TYPE_QUERY_WILDCARD = 11;
79 private static final int TYPE_QUERY_TERM_RANGE = 12;
80 private static final int TYPE_QUERY_PHRASE = 13;
81 private static final int TYPE_QUERY_NUMERIC_RANGE = 14;
82 private static final int TYPE_QUERY_BOOLEAN = 15;
83
84 public void writeObject(Object obj) throws IOException {
85 if( obj==null ) {
86 writeByte(TYPE_NULL);
87 return;
88 }
89 if( obj instanceof String ) {
90 writeByte(TYPE_STRING);
91 writeUTF((String)obj);
92 return;
93 }
94 if( obj instanceof Integer ) {
95 writeByte(TYPE_INT);
96 writeInt((Integer)obj);
97 return;
98 }
99 if( obj instanceof Long ) {
100 writeByte(TYPE_LONG);
101 writeLong((Long)obj);
102 return;
103 }
104 if( obj instanceof Float ) {
105 writeByte(TYPE_FLOAT);
106 writeFloat((Float)obj);
107 return;
108 }
109 if( obj instanceof Double ) {
110 writeByte(TYPE_DOUBLE);
111 writeDouble((Double)obj);
112 return;
113 }
114 if( obj instanceof byte[] ) {
115 writeByte(TYPE_BYTES);
116 writeByteArray((byte[])obj);
117 return;
118 }
119 if( obj instanceof List ) {
120 writeByte(TYPE_LIST);
121 writeList((List)obj);
122 return;
123 }
124 if( obj instanceof MatchAllDocsQuery ) {
125 writeByte(TYPE_QUERY_MATCH_ALL_DOCS);
126 return;
127 }
128 if( obj instanceof TermQuery ) {
129 writeByte(TYPE_QUERY_TERM);
130 TermQuery query = (TermQuery)obj;
131 writeTerm( query.getTerm() );
132 return;
133 }
134 if( obj instanceof PrefixQuery ) {
135 writeByte(TYPE_QUERY_PREFIX);
136 PrefixQuery query = (PrefixQuery)obj;
137 writeTerm( query.getPrefix() );
138 return;
139 }
140 if( obj instanceof WildcardQuery ) {
141 writeByte(TYPE_QUERY_TERM_RANGE);
142 WildcardQuery query = (WildcardQuery)obj;
143 writeTerm( query.getTerm() );
144 return;
145 }
146 if( obj instanceof TermRangeQuery ) {
147 writeByte(TYPE_QUERY_TERM_RANGE);
148 TermRangeQuery query = (TermRangeQuery)obj;
149 writeUTF( query.getField() );
150 writeBytesRef( query.getLowerTerm() );
151 writeBytesRef( query.getUpperTerm() );
152 writeBoolean( query.includesLower() );
153 writeBoolean( query.includesUpper() );
154 return;
155 }
156 if( obj instanceof PhraseQuery ) {
157 writeByte(TYPE_QUERY_PHRASE);
158 PhraseQuery query = (PhraseQuery)obj;
159 Term[] terms = query.getTerms();
160 int[] positions = query.getPositions();
161 if( terms.length != positions.length )
162 throw new RuntimeException();
163 writeInt( terms.length );
164 for( int i=0; i<terms.length; i++ ) {
165 writeTerm( terms[i] );
166 writeInt( positions[i] );
167 }
168 return;
169 }
170 if( obj instanceof NumericRangeQuery ) {
171 writeByte(TYPE_QUERY_NUMERIC_RANGE);
172 NumericRangeQuery query = (NumericRangeQuery)obj;
173 writeUTF( query.getField() );
174 writeObject( query.getMin() );
175 writeObject( query.getMax() );
176 writeBoolean( query.includesMin() );
177 writeBoolean( query.includesMax() );
178 return;
179 }
180 if( obj instanceof BooleanQuery ) {
181 writeByte(TYPE_QUERY_BOOLEAN);
182 BooleanQuery query = (BooleanQuery)obj;
183 BooleanClause[] a = query.getClauses();
184 writeInt(a.length);
185 for( BooleanClause bc : a ) {
186 writeQuery( bc.getQuery() );
187 writeUTF( bc.getOccur().name() );
188 }
189 return;
190 }
191 throw new IllegalArgumentException("invalid type for "+obj);
192 }
193
194 public Object readObject() throws IOException {
195 int type = readByte();
196 switch(type) {
197 case TYPE_NULL:
198 return null;
199 case TYPE_STRING:
200 return readUTF();
201 case TYPE_INT:
202 return readInt();
203 case TYPE_LONG:
204 return readLong();
205 case TYPE_FLOAT:
206 return readFloat();
207 case TYPE_DOUBLE:
208 return readDouble();
209 case TYPE_BYTES:
210 return readByteArray();
211 case TYPE_LIST:
212 return readList();
213 case TYPE_QUERY_MATCH_ALL_DOCS:
214 return new MatchAllDocsQuery();
215 case TYPE_QUERY_TERM:
216 return new TermQuery( readTerm() );
217 case TYPE_QUERY_PREFIX:
218 return new PrefixQuery( readTerm() );
219 case TYPE_QUERY_WILDCARD:
220 return new WildcardQuery( readTerm() );
221 case TYPE_QUERY_TERM_RANGE:
222 {
223 String field = readUTF();
224 BytesRef lowerTerm = readBytesRef();
225 BytesRef upperTerm = readBytesRef();
226 boolean includeLower = readBoolean();
227 boolean includeUpper = readBoolean();
228 return new TermRangeQuery(field,lowerTerm,upperTerm,includeLower,includeUpper);
229 }
230 case TYPE_QUERY_PHRASE:
231 {
232 PhraseQuery query = new PhraseQuery();
233 int n = readInt();
234 for( int i=0; i<n; i++ ) {
235 Term term = readTerm();
236 int position = readInt();
237 query.add(term,position);
238 }
239 return query;
240 }
241 case TYPE_QUERY_NUMERIC_RANGE:
242 {
243 String field = readUTF();
244 Number min = (Number)readObject();
245 Number max = (Number)readObject();
246 boolean minInclusive = readBoolean();
247 boolean maxInclusive = readBoolean();
248 Number n = min!=null ? min : max;
249 if( n instanceof Integer )
250 return NumericRangeQuery.newIntRange(field,(Integer)min,(Integer)max,minInclusive,maxInclusive);
251 if( n instanceof Long )
252 return NumericRangeQuery.newLongRange(field,(Long)min,(Long)max,minInclusive,maxInclusive);
253 if( n instanceof Float )
254 return NumericRangeQuery.newFloatRange(field,(Float)min,(Float)max,minInclusive,maxInclusive);
255 if( n instanceof Double )
256 return NumericRangeQuery.newDoubleRange(field,(Double)min,(Double)max,minInclusive,maxInclusive);
257 throw new RuntimeException("bad numeric type for "+n);
258 }
259 case TYPE_QUERY_BOOLEAN:
260 {
261 BooleanQuery query = new BooleanQuery();
262 int n = readInt();
263 for( int i=0; i<n; i++ ) {
264 Query subquery = readQuery();
265 BooleanClause.Occur occur = BooleanClause.Occur.valueOf( readUTF() );
266 query.add(subquery,occur);
267 }
268 return query;
269 }
270 default:
271 throw new RuntimeException("invalid type "+type);
272 }
273 }
274
275 public void writeByteArray(byte[] bytes) throws IOException {
276 writeInt(bytes.length);
277 write(bytes);
278 }
279
280 public byte[] readByteArray() throws IOException {
281 int len = readInt();
282 byte[] bytes = new byte[len];
283 readFully(bytes);
284 return bytes;
285 }
286
287 public void writeList(List list) throws IOException {
288 writeInt(list.size());
289 for( Object obj : list ) {
290 writeObject(obj);
291 }
292 }
293
294 public List readList() throws IOException {
295 final int size = readInt();
296 List list = new ArrayList(size);
297 for( int i=0; i<size; i++ ) {
298 list.add( readObject() );
299 }
300 return list;
301 }
302
303 public void writeMap(Map map) throws IOException {
304 writeInt(map.size());
305 for( Object obj : map.entrySet() ) {
306 Map.Entry entry = (Map.Entry)obj;
307 writeObject( entry.getKey() );
308 writeObject( entry.getValue() );
309 }
310 }
311
312 public Map readMap() throws IOException {
313 final int size = readInt();
314 Map map = new LinkedHashMap();
315 for( int i=0; i<size; i++ ) {
316 Object key = readObject();
317 Object value = readObject();
318 map.put(key,value);
319 }
320 return map;
321 }
322
323 public void writeQuery(Query query) throws IOException {
324 writeObject(query);
325 }
326
327 public Query readQuery() throws IOException {
328 return (Query)readObject();
329 }
330
331 public void writeBytesRef(BytesRef br) throws IOException {
332 writeInt(br.length);
333 write(br.bytes,0,br.length);
334 }
335
336 public BytesRef readBytesRef() throws IOException {
337 return new BytesRef( readByteArray() );
338 }
339
340 public void writeTerm(Term term) throws IOException {
341 writeUTF(term.field());
342 writeBytesRef( term.bytes() );
343 }
344
345 public Term readTerm() throws IOException {
346 String key = readUTF();
347 BytesRef value = readBytesRef();
348 return new Term(key,value);
349 }
350
351 }