1 /////////////////////////////////////////////////////////////////////////////
2 // Copyright (c) 2009-2014 Alan Wright. All rights reserved.
3 // Distributable under the terms of either the Apache License (Version 2.0)
4 // or the GNU Lesser General Public License.
5 /////////////////////////////////////////////////////////////////////////////
6 
7 #ifndef FIELDSWRITER_H
8 #define FIELDSWRITER_H
9 
10 #include "LuceneObject.h"
11 
12 namespace Lucene {
13 
14 class FieldsWriter : public LuceneObject {
15 public:
16     FieldsWriter(const DirectoryPtr& d, const String& segment, const FieldInfosPtr& fn);
17     FieldsWriter(const IndexOutputPtr& fdx, const IndexOutputPtr& fdt, const FieldInfosPtr& fn);
18     virtual ~FieldsWriter();
19 
20     LUCENE_CLASS(FieldsWriter);
21 
22 protected:
23     FieldInfosPtr fieldInfos;
24     IndexOutputPtr fieldsStream;
25     IndexOutputPtr indexStream;
26     bool doClose;
27 
28 public:
29     static const uint8_t FIELD_IS_TOKENIZED;
30     static const uint8_t FIELD_IS_BINARY;
31     static const uint8_t FIELD_IS_COMPRESSED;
32 
33     static const int32_t FORMAT; // Original format
34     static const int32_t FORMAT_VERSION_UTF8_LENGTH_IN_BYTES; // Changed strings to UTF8
35     static const int32_t FORMAT_LUCENE_3_0_NO_COMPRESSED_FIELDS; // Lucene 3.0: Removal of compressed fields
36 
37     // NOTE: if you introduce a new format, make it 1 higher than the current one, and always change this
38     // if you switch to a new format!
39     static const int32_t FORMAT_CURRENT;
40 
41 public:
42     void setFieldsStream(const IndexOutputPtr& stream);
43 
44     /// Writes the contents of buffer into the fields stream and adds a new entry for this document into the index
45     /// stream.  This assumes the buffer was already written in the correct fields format.
46     void flushDocument(int32_t numStoredFields, const RAMOutputStreamPtr& buffer);
47 
48     void skipDocument();
49     void flush();
50     void close();
51     void writeField(const FieldInfoPtr& fi, const FieldablePtr& field);
52 
53     /// Bulk write a contiguous series of documents.  The lengths array is the length (in bytes) of each raw document.
54     /// The stream IndexInput is the fieldsStream from which we should bulk-copy all bytes.
55     void addRawDocuments(const IndexInputPtr& stream, Collection<int32_t> lengths, int32_t numDocs);
56 
57     void addDocument(const DocumentPtr& doc);
58 };
59 
60 }
61 
62 #endif
63