/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.blur.lucene.codec;
import static org.apache.blur.utils.BlurConstants.FAST;
import static org.apache.blur.utils.BlurConstants.FAST_DECOMPRESSION;
import static org.apache.blur.utils.BlurConstants.HIGH_COMPRESSION;
import java.io.IOException;
import org.apache.lucene.codecs.StoredFieldsFormat;
import org.apache.lucene.codecs.StoredFieldsReader;
import org.apache.lucene.codecs.StoredFieldsWriter;
import org.apache.lucene.codecs.compressing.CompressingStoredFieldsReader;
import org.apache.lucene.codecs.compressing.CompressingStoredFieldsWriter;
import org.apache.lucene.codecs.compressing.CompressionMode;
import org.apache.lucene.codecs.compressing.Compressor;
import org.apache.lucene.codecs.compressing.Decompressor;
import org.apache.lucene.index.FieldInfos;
import org.apache.lucene.index.SegmentInfo;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.IOContext;
public final class Blur022StoredFieldsFormat extends StoredFieldsFormat {
static final String STORED_FIELDS_FORMAT_CHUNK_SIZE = "StoredFieldsFormat.chunkSize";
static final String STORED_FIELDS_FORMAT_COMPRESSION_MODE = "StoredFieldsFormat.compressionMode";
private static final String FORMAT_NAME = "Blur022StoredFields";
private static final String SEGMENT_SUFFIX = "";
private final int _chunkSize;
private final CompressionMode _compressionMode;
public Blur022StoredFieldsFormat(int chunkSize, CompressionMode compressionMode) {
_chunkSize = chunkSize;
_compressionMode = compressionMode;
}
static class CachedCompressionMode extends CompressionMode {
final CompressionMode _compressionMode;
CachedCompressionMode(CompressionMode compressionMode) {
_compressionMode = compressionMode;
}
@Override
public Compressor newCompressor() {
return _compressionMode.newCompressor();
}
@Override
public Decompressor newDecompressor() {
return new CachedDecompressor(_compressionMode.newDecompressor());
}
@Override
public String toString() {
return _compressionMode.toString();
}
}
@Override
public StoredFieldsReader fieldsReader(Directory directory, SegmentInfo si, FieldInfos fn, IOContext context)
throws IOException {
CompressionMode compressionMode = new CachedCompressionMode(getCompressionMode(si));
return new CompressingStoredFieldsReader(directory, si, SEGMENT_SUFFIX, fn, context, FORMAT_NAME, compressionMode);
}
@Override
public StoredFieldsWriter fieldsWriter(Directory directory, SegmentInfo si, IOContext context) throws IOException {
return new CompressingStoredFieldsWriter(directory, si, SEGMENT_SUFFIX, context, FORMAT_NAME, _compressionMode,
_chunkSize);
}
private CompressionMode getCompressionMode(SegmentInfo si) {
String attribute = si.getAttribute(STORED_FIELDS_FORMAT_COMPRESSION_MODE);
if (HIGH_COMPRESSION.equals(attribute)) {
return CompressionMode.HIGH_COMPRESSION;
} else if (FAST.equals(attribute)) {
return CompressionMode.FAST;
} else if (FAST_DECOMPRESSION.equals(attribute)) {
return CompressionMode.FAST_DECOMPRESSION;
}
// This happen during nrt udpates.
return _compressionMode;
}
@Override
public String toString() {
return getClass().getSimpleName();
}
}