blob: 7abfdccf9fad9d563e64ec20a32a6067e7d26301 [file] [log] [blame]
using Lucene.Net.Diagnostics;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
namespace Lucene.Net.Codecs.SimpleText
{
/*
* 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.
*/
using BytesRef = Util.BytesRef;
using Directory = Store.Directory;
using DocValuesType = Index.DocValuesType;
using FieldInfo = Index.FieldInfo;
using FieldInfos = Index.FieldInfos;
using IndexFileNames = Index.IndexFileNames;
using IndexOptions = Lucene.Net.Index.IndexOptions;
using IOContext = Store.IOContext;
using IOUtils = Util.IOUtils;
/// <summary>
/// Writes plain text field infos files.
/// <para>
/// <b><font color="red">FOR RECREATIONAL USE ONLY</font></b>
/// </para>
/// @lucene.experimental
/// </summary>
public class SimpleTextFieldInfosWriter : FieldInfosWriter
{
/// <summary>
/// Extension of field infos. </summary>
internal const string FIELD_INFOS_EXTENSION = "inf";
internal static readonly BytesRef NUMFIELDS = new BytesRef("number of fields ");
internal static readonly BytesRef NAME = new BytesRef(" name ");
internal static readonly BytesRef NUMBER = new BytesRef(" number ");
internal static readonly BytesRef ISINDEXED = new BytesRef(" indexed ");
internal static readonly BytesRef STORETV = new BytesRef(" term vectors ");
internal static readonly BytesRef STORETVPOS = new BytesRef(" term vector positions ");
internal static readonly BytesRef STORETVOFF = new BytesRef(" term vector offsets ");
internal static readonly BytesRef PAYLOADS = new BytesRef(" payloads ");
internal static readonly BytesRef NORMS = new BytesRef(" norms ");
internal static readonly BytesRef NORMS_TYPE = new BytesRef(" norms type ");
internal static readonly BytesRef DOCVALUES = new BytesRef(" doc values ");
internal static readonly BytesRef DOCVALUES_GEN = new BytesRef(" doc values gen ");
internal static readonly BytesRef INDEXOPTIONS = new BytesRef(" index options ");
internal static readonly BytesRef NUM_ATTS = new BytesRef(" attributes ");
internal static readonly BytesRef ATT_KEY = new BytesRef(" key ");
internal static readonly BytesRef ATT_VALUE = new BytesRef(" value ");
public override void Write(Directory directory, string segmentName, string segmentSuffix, FieldInfos infos,
IOContext context)
{
var fileName = IndexFileNames.SegmentFileName(segmentName, segmentSuffix, FIELD_INFOS_EXTENSION);
var output = directory.CreateOutput(fileName, context);
var scratch = new BytesRef();
var success = false;
try
{
SimpleTextUtil.Write(output, NUMFIELDS);
SimpleTextUtil.Write(output, infos.Count.ToString(CultureInfo.InvariantCulture), scratch);
SimpleTextUtil.WriteNewline(output);
foreach (FieldInfo fi in infos)
{
SimpleTextUtil.Write(output, NAME);
SimpleTextUtil.Write(output, fi.Name, scratch);
SimpleTextUtil.WriteNewline(output);
SimpleTextUtil.Write(output, NUMBER);
SimpleTextUtil.Write(output, fi.Number.ToString(CultureInfo.InvariantCulture), scratch);
SimpleTextUtil.WriteNewline(output);
SimpleTextUtil.Write(output, ISINDEXED);
SimpleTextUtil.Write(output, CultureInfo.InvariantCulture.TextInfo.ToLower(fi.IsIndexed.ToString()), scratch);
SimpleTextUtil.WriteNewline(output);
if (fi.IsIndexed)
{
if (Debugging.AssertsEnabled) Debugging.Assert(fi.IndexOptions.CompareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0 || !fi.HasPayloads);
SimpleTextUtil.Write(output, INDEXOPTIONS);
SimpleTextUtil.Write(output,
fi.IndexOptions != IndexOptions.NONE ? fi.IndexOptions.ToString() : string.Empty,
scratch);
SimpleTextUtil.WriteNewline(output);
}
SimpleTextUtil.Write(output, STORETV);
SimpleTextUtil.Write(output, CultureInfo.InvariantCulture.TextInfo.ToLower(fi.HasVectors.ToString()), scratch);
SimpleTextUtil.WriteNewline(output);
SimpleTextUtil.Write(output, PAYLOADS);
SimpleTextUtil.Write(output, CultureInfo.InvariantCulture.TextInfo.ToLower(fi.HasPayloads.ToString()), scratch);
SimpleTextUtil.WriteNewline(output);
SimpleTextUtil.Write(output, NORMS);
SimpleTextUtil.Write(output, CultureInfo.InvariantCulture.TextInfo.ToLower((!fi.OmitsNorms).ToString()), scratch);
SimpleTextUtil.WriteNewline(output);
SimpleTextUtil.Write(output, NORMS_TYPE);
SimpleTextUtil.Write(output, GetDocValuesType(fi.NormType), scratch);
SimpleTextUtil.WriteNewline(output);
SimpleTextUtil.Write(output, DOCVALUES);
SimpleTextUtil.Write(output, GetDocValuesType(fi.DocValuesType), scratch);
SimpleTextUtil.WriteNewline(output);
SimpleTextUtil.Write(output, DOCVALUES_GEN);
SimpleTextUtil.Write(output, fi.DocValuesGen.ToString(CultureInfo.InvariantCulture), scratch);
SimpleTextUtil.WriteNewline(output);
IDictionary<string, string> atts = fi.Attributes;
int numAtts = atts == null ? 0 : atts.Count;
SimpleTextUtil.Write(output, NUM_ATTS);
SimpleTextUtil.Write(output, numAtts.ToString(CultureInfo.InvariantCulture), scratch);
SimpleTextUtil.WriteNewline(output);
if (numAtts <= 0 || atts == null) continue;
foreach (var entry in atts)
{
SimpleTextUtil.Write(output, ATT_KEY);
SimpleTextUtil.Write(output, entry.Key, scratch);
SimpleTextUtil.WriteNewline(output);
SimpleTextUtil.Write(output, ATT_VALUE);
SimpleTextUtil.Write(output, entry.Value, scratch);
SimpleTextUtil.WriteNewline(output);
}
}
SimpleTextUtil.WriteChecksum(output, scratch);
success = true;
}
finally
{
if (success)
{
output.Dispose();
}
else
{
IOUtils.DisposeWhileHandlingException(output);
}
}
}
private static string GetDocValuesType(DocValuesType type)
{
// LUCENENET specific - need to write false for NONE
return type != DocValuesType.NONE ? type.ToString() : "false";
}
}
}