| using Lucene.Net.Codecs.Lucene45; |
| using Lucene.Net.Diagnostics; |
| using Lucene.Net.Index; |
| using Lucene.Net.Util; |
| using System; |
| using System.Collections.Generic; |
| |
| namespace Lucene.Net.Codecs.Asserting |
| { |
| /* |
| * 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> |
| /// Just like <see cref="Lucene45DocValuesFormat"/> but with additional asserts. |
| /// </summary> |
| [DocValuesFormatName("Asserting")] |
| public class AssertingDocValuesFormat : DocValuesFormat |
| { |
| private readonly DocValuesFormat @in = new Lucene45DocValuesFormat(); |
| |
| public AssertingDocValuesFormat() |
| : base() |
| { |
| } |
| |
| public override DocValuesConsumer FieldsConsumer(SegmentWriteState state) |
| { |
| DocValuesConsumer consumer = @in.FieldsConsumer(state); |
| if (Debugging.AssertsEnabled) Debugging.Assert(consumer != null); |
| return new AssertingDocValuesConsumer(consumer, state.SegmentInfo.DocCount); |
| } |
| |
| public override DocValuesProducer FieldsProducer(SegmentReadState state) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(state.FieldInfos.HasDocValues); |
| DocValuesProducer producer = @in.FieldsProducer(state); |
| if (Debugging.AssertsEnabled) Debugging.Assert(producer != null); |
| return new AssertingDocValuesProducer(producer, state.SegmentInfo.DocCount); |
| } |
| |
| internal class AssertingDocValuesConsumer : DocValuesConsumer |
| { |
| private readonly DocValuesConsumer @in; |
| private readonly int maxDoc; |
| |
| internal AssertingDocValuesConsumer(DocValuesConsumer @in, int maxDoc) |
| { |
| this.@in = @in; |
| this.maxDoc = maxDoc; |
| } |
| |
| public override void AddNumericField(FieldInfo field, IEnumerable<long?> values) |
| { |
| int count = 0; |
| foreach (var v in values) |
| { |
| count++; |
| } |
| if (Debugging.AssertsEnabled) Debugging.Assert(count == maxDoc); |
| CheckIterator(values.GetEnumerator(), maxDoc, true); |
| @in.AddNumericField(field, values); |
| } |
| |
| public override void AddBinaryField(FieldInfo field, IEnumerable<BytesRef> values) |
| { |
| int count = 0; |
| foreach (BytesRef b in values) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(b == null || b.IsValid()); |
| count++; |
| } |
| if (Debugging.AssertsEnabled) Debugging.Assert(count == maxDoc); |
| CheckIterator(values.GetEnumerator(), maxDoc, true); |
| @in.AddBinaryField(field, values); |
| } |
| |
| public override void AddSortedField(FieldInfo field, IEnumerable<BytesRef> values, IEnumerable<long?> docToOrd) |
| { |
| int valueCount = 0; |
| BytesRef lastValue = null; |
| foreach (BytesRef b in values) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(b != null); |
| if (Debugging.AssertsEnabled) Debugging.Assert(b.IsValid()); |
| if (valueCount > 0) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(b.CompareTo(lastValue) > 0); |
| } |
| lastValue = BytesRef.DeepCopyOf(b); |
| valueCount++; |
| } |
| if (Debugging.AssertsEnabled) Debugging.Assert(valueCount <= maxDoc); |
| |
| FixedBitSet seenOrds = new FixedBitSet(valueCount); |
| |
| int count = 0; |
| foreach (long? v in docToOrd) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(v != null); |
| int ord = (int)v.Value; |
| if (Debugging.AssertsEnabled) Debugging.Assert(ord >= -1 && ord < valueCount); |
| if (ord >= 0) |
| { |
| seenOrds.Set(ord); |
| } |
| count++; |
| } |
| |
| if (Debugging.AssertsEnabled) Debugging.Assert(count == maxDoc); |
| if (Debugging.AssertsEnabled) Debugging.Assert(seenOrds.Cardinality() == valueCount); |
| CheckIterator(values.GetEnumerator(), valueCount, false); |
| CheckIterator(docToOrd.GetEnumerator(), maxDoc, false); |
| @in.AddSortedField(field, values, docToOrd); |
| } |
| |
| public override void AddSortedSetField(FieldInfo field, IEnumerable<BytesRef> values, IEnumerable<long?> docToOrdCount, IEnumerable<long?> ords) |
| { |
| long valueCount = 0; |
| BytesRef lastValue = null; |
| foreach (BytesRef b in values) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(b != null); |
| if (Debugging.AssertsEnabled) Debugging.Assert(b.IsValid()); |
| if (valueCount > 0) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(b.CompareTo(lastValue) > 0); |
| } |
| lastValue = BytesRef.DeepCopyOf(b); |
| valueCount++; |
| } |
| |
| int docCount = 0; |
| long ordCount = 0; |
| Int64BitSet seenOrds = new Int64BitSet(valueCount); |
| using IEnumerator<long?> ordIterator = ords.GetEnumerator(); |
| foreach (long? v in docToOrdCount) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(v != null); |
| int count = (int)v.Value; |
| if (Debugging.AssertsEnabled) Debugging.Assert(count >= 0); |
| docCount++; |
| ordCount += count; |
| |
| long lastOrd = -1; |
| for (int i = 0; i < count; i++) |
| { |
| ordIterator.MoveNext(); |
| long? o = ordIterator.Current; |
| if (Debugging.AssertsEnabled) Debugging.Assert(o != null); |
| long ord = o.Value; |
| if (Debugging.AssertsEnabled) Debugging.Assert(ord >= 0 && ord < valueCount); |
| if (Debugging.AssertsEnabled) Debugging.Assert(ord > lastOrd, "ord={0},lastOrd={1}", ord, lastOrd); |
| seenOrds.Set(ord); |
| lastOrd = ord; |
| } |
| } |
| if (Debugging.AssertsEnabled) Debugging.Assert(ordIterator.MoveNext() == false); |
| |
| if (Debugging.AssertsEnabled) Debugging.Assert(docCount == maxDoc); |
| if (Debugging.AssertsEnabled) Debugging.Assert(seenOrds.Cardinality() == valueCount); |
| CheckIterator(values.GetEnumerator(), valueCount, false); |
| CheckIterator(docToOrdCount.GetEnumerator(), maxDoc, false); |
| CheckIterator(ords.GetEnumerator(), ordCount, false); |
| @in.AddSortedSetField(field, values, docToOrdCount, ords); |
| } |
| |
| protected override void Dispose(bool disposing) |
| { |
| if (disposing) |
| @in.Dispose(); |
| } |
| } |
| |
| internal class AssertingNormsConsumer : DocValuesConsumer |
| { |
| private readonly DocValuesConsumer @in; |
| private readonly int maxDoc; |
| |
| internal AssertingNormsConsumer(DocValuesConsumer @in, int maxDoc) |
| { |
| this.@in = @in; |
| this.maxDoc = maxDoc; |
| } |
| |
| public override void AddNumericField(FieldInfo field, IEnumerable<long?> values) |
| { |
| int count = 0; |
| foreach (long? v in values) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(v != null); |
| count++; |
| } |
| if (Debugging.AssertsEnabled) Debugging.Assert(count == maxDoc); |
| CheckIterator(values.GetEnumerator(), maxDoc, false); |
| @in.AddNumericField(field, values); |
| } |
| |
| protected override void Dispose(bool disposing) |
| { |
| if (disposing) |
| @in.Dispose(); |
| } |
| |
| public override void AddBinaryField(FieldInfo field, IEnumerable<BytesRef> values) |
| { |
| throw new InvalidOperationException(); |
| } |
| |
| public override void AddSortedField(FieldInfo field, IEnumerable<BytesRef> values, IEnumerable<long?> docToOrd) |
| { |
| throw new InvalidOperationException(); |
| } |
| |
| public override void AddSortedSetField(FieldInfo field, IEnumerable<BytesRef> values, IEnumerable<long?> docToOrdCount, IEnumerable<long?> ords) |
| { |
| throw new InvalidOperationException(); |
| } |
| } |
| |
| private static void CheckIterator<T>(IEnumerator<T> iterator, long expectedSize, bool allowNull) |
| { |
| try |
| { |
| for (long i = 0; i < expectedSize; i++) |
| { |
| bool hasNext = iterator.MoveNext(); |
| if (Debugging.AssertsEnabled) Debugging.Assert(hasNext); |
| T v = iterator.Current; |
| if (Debugging.AssertsEnabled) Debugging.Assert(allowNull || v != null); |
| |
| // LUCENE.NET specific. removed call to Reset(). |
| //try |
| //{ |
| // iterator.Reset(); |
| // throw new InvalidOperationException("broken iterator (supports remove): " + iterator); |
| //} |
| //catch (NotSupportedException) |
| //{ |
| // // ok |
| //} |
| } |
| if (Debugging.AssertsEnabled) Debugging.Assert(!iterator.MoveNext()); |
| /*try |
| { |
| //iterator.next(); |
| throw new InvalidOperationException("broken iterator (allows next() when hasNext==false) " + iterator); |
| } |
| catch (Exception) |
| { |
| // ok |
| }*/ |
| } |
| finally |
| { |
| iterator.Dispose(); |
| } |
| } |
| |
| internal class AssertingDocValuesProducer : DocValuesProducer |
| { |
| private readonly DocValuesProducer @in; |
| private readonly int maxDoc; |
| |
| internal AssertingDocValuesProducer(DocValuesProducer @in, int maxDoc) |
| { |
| this.@in = @in; |
| this.maxDoc = maxDoc; |
| } |
| |
| public override NumericDocValues GetNumeric(FieldInfo field) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(field.DocValuesType == DocValuesType.NUMERIC || field.NormType == DocValuesType.NUMERIC); |
| NumericDocValues values = @in.GetNumeric(field); |
| if (Debugging.AssertsEnabled) Debugging.Assert(values != null); |
| return new AssertingNumericDocValues(values, maxDoc); |
| } |
| |
| public override BinaryDocValues GetBinary(FieldInfo field) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(field.DocValuesType == DocValuesType.BINARY); |
| BinaryDocValues values = @in.GetBinary(field); |
| if (Debugging.AssertsEnabled) Debugging.Assert(values != null); |
| return new AssertingBinaryDocValues(values, maxDoc); |
| } |
| |
| public override SortedDocValues GetSorted(FieldInfo field) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(field.DocValuesType == DocValuesType.SORTED); |
| SortedDocValues values = @in.GetSorted(field); |
| if (Debugging.AssertsEnabled) Debugging.Assert(values != null); |
| return new AssertingSortedDocValues(values, maxDoc); |
| } |
| |
| public override SortedSetDocValues GetSortedSet(FieldInfo field) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(field.DocValuesType == DocValuesType.SORTED_SET); |
| SortedSetDocValues values = @in.GetSortedSet(field); |
| if (Debugging.AssertsEnabled) Debugging.Assert(values != null); |
| return new AssertingSortedSetDocValues(values, maxDoc); |
| } |
| |
| public override IBits GetDocsWithField(FieldInfo field) |
| { |
| if (Debugging.AssertsEnabled) Debugging.Assert(field.DocValuesType != DocValuesType.NONE); |
| IBits bits = @in.GetDocsWithField(field); |
| if (Debugging.AssertsEnabled) Debugging.Assert(bits != null); |
| if (Debugging.AssertsEnabled) Debugging.Assert(bits.Length == maxDoc); |
| return new AssertingBits(bits); |
| } |
| |
| protected override void Dispose(bool disposing) |
| { |
| if (disposing) |
| @in.Dispose(); |
| } |
| |
| public override long RamBytesUsed() |
| { |
| return @in.RamBytesUsed(); |
| } |
| |
| public override void CheckIntegrity() |
| { |
| @in.CheckIntegrity(); |
| } |
| } |
| } |
| } |