/* * * 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 System; using System.Collections.Generic; using Lucene.Net.Index; using Lucene.Net.Util; namespace Lucene.Net.Spatial.Util { /// /// Wraps Lucene 3 TermEnum to make it look like a Lucene 4 TermsEnum /// SOLR-2155 /// @author dsmiley /// public class TermsEnumCompatibility { private readonly IndexReader reader; private readonly String fieldName; private TermEnum termEnum; private bool initialState = true; public TermsEnumCompatibility(IndexReader reader, String fieldName) { this.reader = reader; this.fieldName = string.Intern(fieldName); this.termEnum = reader.Terms(new Term(this.fieldName)); } public TermEnum GetTermEnum() { return termEnum; } public Term Term() { Term t = termEnum.Term(); return t != null && t.Field == fieldName ? t : null; } public Term Next() { //in Lucene 3, a call to reader.terms(term) is already pre-positioned, you don't call next first if (initialState) { initialState = false; return Term(); } else { return termEnum.Next() ? Term() : null; } } public void Close() { termEnum.Close(); } public enum SeekStatus { END, FOUND, NOT_FOUND } public SeekStatus Seek(String value) { termEnum = reader.Terms(new Term(this.fieldName, value)); Term t = Term(); if (t == null) return SeekStatus.END; return (t.Text.Equals(value)) ? SeekStatus.FOUND : SeekStatus.NOT_FOUND; } /// /// Seeks to the specified term, if it exists, or to the /// next (ceiling) term. Returns SeekStatus to /// indicate whether exact term was found, a different /// term was found, or EOF was hit. The target term may /// be before or after the current term. If this returns /// SeekStatus.END, the enum is unpositioned. /// /// /// public SeekStatus SeekCeil(String value) { return Seek(value); } /// /// Returns the number of documents that have at least one /// term for this field, or -1 if this measure isn't /// stored by the codec. Note that, just like other term /// measures, this measure does not take deleted documents /// into account. /// /// public int GetDocCount() { return -1; // TODO find a way to efficiently determine this } public void Docs(OpenBitSet bits) { var termDocs = reader.TermDocs(new Term(fieldName, Term().Text)); while (termDocs.Next()) { bits.FastSet(termDocs.Doc); } } } }