blob: 704e5c8f23a4fd3e2234cc3db83c9274ed5b2460 [file] [log] [blame]
using Lucene.Net.Diagnostics;
using Lucene.Net.Index;
using Lucene.Net.Store;
using Lucene.Net.Util;
using System;
using System.Collections.Generic;
using AssertionError = Lucene.Net.Diagnostics.AssertionException;
namespace Lucene.Net.Codecs.Lucene3x
{
/*
* 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.
*/
/// <summary>
/// Writes and Merges Lucene 3.x norms format
/// <para/>
/// @lucene.experimental
/// </summary>
internal class PreFlexRWNormsConsumer : DocValuesConsumer
{
/// <summary>
/// norms header placeholder </summary>
private static readonly sbyte[] NORMS_HEADER = new sbyte[] { (sbyte)'N', (sbyte)'R', (sbyte)'M', -1 };
/// <summary>
/// Extension of norms file </summary>
private const string NORMS_EXTENSION = "nrm";
///// <summary>
///// Extension of separate norms file </summary>
//[Obsolete("Only for reading existing 3.x indexes")]
//private const string SEPARATE_NORMS_EXTENSION = "s"; // LUCENENET: IDE0051: Remove unused private member
#pragma warning disable CA2213 // Disposable fields should be disposed
private readonly IndexOutput @out;
#pragma warning restore CA2213 // Disposable fields should be disposed
private int lastFieldNumber = -1; // only for assert
public PreFlexRWNormsConsumer(Directory directory, string segment, IOContext context)
{
string normsFileName = IndexFileNames.SegmentFileName(segment, "", NORMS_EXTENSION);
bool success = false;
IndexOutput output = null;
try
{
output = directory.CreateOutput(normsFileName, context);
// output.WriteBytes(NORMS_HEADER, 0, NORMS_HEADER.Length);
foreach (var @sbyte in NORMS_HEADER)
{
output.WriteByte((byte)@sbyte);
}
@out = output;
success = true;
}
finally
{
if (!success)
{
IOUtils.DisposeWhileHandlingException(output);
}
}
}
public override void AddNumericField(FieldInfo field, IEnumerable<long?> values)
{
if (Debugging.AssertsEnabled) Debugging.Assert(field.Number > lastFieldNumber,"writing norms fields out of order {0} -> {1}", lastFieldNumber, field.Number);
foreach (var n in values)
{
if (((sbyte)n) < sbyte.MinValue || ((sbyte)n) > sbyte.MaxValue)
{
throw new NotSupportedException("3.x cannot index norms that won't fit in a byte, got: " + ((sbyte)n));
}
@out.WriteByte((byte)n);
}
lastFieldNumber = field.Number;
}
protected override void Dispose(bool disposing)
{
if (disposing)
IOUtils.Dispose(@out);
}
public override void AddBinaryField(FieldInfo field, IEnumerable<BytesRef> values)
{
throw new AssertionError();
}
public override void AddSortedField(FieldInfo field, IEnumerable<BytesRef> values, IEnumerable<long?> docToOrd)
{
throw new AssertionError();
}
public override void AddSortedSetField(FieldInfo field, IEnumerable<BytesRef> values, IEnumerable<long?> docToOrdCount, IEnumerable<long?> ords)
{
throw new AssertionError();
}
}
}