From 47cb7232c70b919e3c656ae33ef13b6f17c817bf Mon Sep 17 00:00:00 2001 From: Robert Muir Date: Thu, 25 Sep 2014 15:58:07 +0000 Subject: [PATCH] LUCENE-5969: add AssertingLiveDocsFormat git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene5969@1627564 13f79535-47bb-0310-9956-ffa450edef68 --- .../codecs/asserting/AssertingCodec.java | 8 +- .../asserting/AssertingLiveDocsFormat.java | 124 ++++++++++++++++++ 2 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingLiveDocsFormat.java diff --git a/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingCodec.java b/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingCodec.java index 996dde4c209..5b0afaacff9 100644 --- a/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingCodec.java +++ b/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingCodec.java @@ -19,6 +19,7 @@ package org.apache.lucene.codecs.asserting; import org.apache.lucene.codecs.DocValuesFormat; import org.apache.lucene.codecs.FilterCodec; +import org.apache.lucene.codecs.LiveDocsFormat; import org.apache.lucene.codecs.NormsFormat; import org.apache.lucene.codecs.PostingsFormat; import org.apache.lucene.codecs.StoredFieldsFormat; @@ -49,7 +50,7 @@ public class AssertingCodec extends FilterCodec { private final TermVectorsFormat vectors = new AssertingTermVectorsFormat(); private final StoredFieldsFormat storedFields = new AssertingStoredFieldsFormat(); private final NormsFormat norms = new AssertingNormsFormat(); - + private final LiveDocsFormat liveDocs = new AssertingLiveDocsFormat(); private final PostingsFormat defaultFormat = new AssertingPostingsFormat(); private final DocValuesFormat defaultDVFormat = new AssertingDocValuesFormat(); @@ -82,6 +83,11 @@ public class AssertingCodec extends FilterCodec { return norms; } + @Override + public LiveDocsFormat liveDocsFormat() { + return liveDocs; + } + @Override public String toString() { return "Asserting(" + delegate + ")"; diff --git a/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingLiveDocsFormat.java b/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingLiveDocsFormat.java new file mode 100644 index 00000000000..615b5d48ea6 --- /dev/null +++ b/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingLiveDocsFormat.java @@ -0,0 +1,124 @@ +package org.apache.lucene.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. + */ + +import java.io.IOException; +import java.util.Collection; + +import org.apache.lucene.codecs.LiveDocsFormat; +import org.apache.lucene.index.SegmentCommitInfo; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.IOContext; +import org.apache.lucene.util.Bits; +import org.apache.lucene.util.MutableBits; +import org.apache.lucene.util.TestUtil; + +/** + * Just like the default live docs format but with additional asserts. + */ +public class AssertingLiveDocsFormat extends LiveDocsFormat { + private final LiveDocsFormat in = TestUtil.getDefaultCodec().liveDocsFormat(); + + @Override + public MutableBits newLiveDocs(int size) throws IOException { + assert size >= 0; + MutableBits raw = in.newLiveDocs(size); + assert raw != null; + return new AssertingMutableBits(raw); + } + + @Override + public MutableBits newLiveDocs(Bits existing) throws IOException { + assert existing instanceof AssertingBits; + Bits rawExisting = ((AssertingBits)existing).in; + MutableBits raw = in.newLiveDocs(rawExisting); + assert raw != null; + return new AssertingMutableBits(raw); + } + + @Override + public Bits readLiveDocs(Directory dir, SegmentCommitInfo info, IOContext context) throws IOException { + Bits raw = in.readLiveDocs(dir, info, context); + assert raw != null; + assert raw.length() == info.info.getDocCount(); + int deletedCount = 0; + for (int i = 0; i < raw.length(); i++) { + if (!raw.get(i)) { + deletedCount++; + } + } + assert deletedCount == info.getDelCount(); + return new AssertingBits(raw); + } + + @Override + public void writeLiveDocs(MutableBits bits, Directory dir, SegmentCommitInfo info, int newDelCount, IOContext context) throws IOException { + assert bits instanceof AssertingMutableBits; + MutableBits raw = (MutableBits) ((AssertingMutableBits)bits).in; + in.writeLiveDocs(raw, dir, info, newDelCount, context); + } + + @Override + public void files(SegmentCommitInfo info, Collection files) throws IOException { + in.files(info, files); + } + + @Override + public String toString() { + return "Asserting(" + in + ")"; + } + + static class AssertingBits implements Bits { + final Bits in; + + AssertingBits(Bits in) { + this.in = in; + assert in.length() >= 0; + } + + @Override + public boolean get(int index) { + assert index >= 0; + assert index < in.length(); + return in.get(index); + } + + @Override + public int length() { + return in.length(); + } + + @Override + public String toString() { + return "Asserting(" + in + ")"; + } + } + + static class AssertingMutableBits extends AssertingBits implements MutableBits { + AssertingMutableBits(MutableBits in) { + super(in); + } + + @Override + public void clear(int index) { + assert index >= 0; + assert index < in.length(); + ((MutableBits)in).clear(index); + } + } +}