blob: 707bd86cfd66d93d320c37d9207e303d6df24716 [file] [log] [blame]
using Lucene.Net.Diagnostics;
using Lucene.Net.Support;
using System;
using System.Collections.Generic;
namespace Lucene.Net.Search.Spans
{
/*
* 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 DocsAndPositionsEnum = Lucene.Net.Index.DocsAndPositionsEnum;
using Term = Lucene.Net.Index.Term;
/// <summary>
/// Expert:
/// Public for extension only
/// </summary>
public class TermSpans : Spans
{
protected readonly DocsAndPositionsEnum m_postings;
protected readonly Term m_term;
protected int m_doc;
protected int m_freq;
protected int m_count;
protected int m_position;
protected bool m_readPayload;
public TermSpans(DocsAndPositionsEnum postings, Term term)
{
this.m_postings = postings;
this.m_term = term;
m_doc = -1;
}
// only for EmptyTermSpans (below)
internal TermSpans()
{
m_term = null;
m_postings = null;
}
public override bool MoveNext()
{
if (m_count == m_freq)
{
if (m_postings is null)
{
return false;
}
m_doc = m_postings.NextDoc();
if (m_doc == DocIdSetIterator.NO_MORE_DOCS)
{
return false;
}
m_freq = m_postings.Freq;
m_count = 0;
}
m_position = m_postings.NextPosition();
m_count++;
m_readPayload = false;
return true;
}
public override bool SkipTo(int target)
{
if (Debugging.AssertsEnabled) Debugging.Assert(target > m_doc);
m_doc = m_postings.Advance(target);
if (m_doc == DocIdSetIterator.NO_MORE_DOCS)
{
return false;
}
m_freq = m_postings.Freq;
m_count = 0;
m_position = m_postings.NextPosition();
m_count++;
m_readPayload = false;
return true;
}
public override int Doc => m_doc;
public override int Start => m_position;
public override int End => m_position + 1;
public override long GetCost()
{
return m_postings.GetCost();
}
// TODO: Remove warning after API has been finalized
public override ICollection<byte[]> GetPayload()
{
var payload = m_postings.GetPayload();
m_readPayload = true;
byte[] bytes;
if (payload != null)
{
bytes = new byte[payload.Length];
Arrays.Copy(payload.Bytes, payload.Offset, bytes, 0, payload.Length);
}
else
{
bytes = null;
}
return new[] { bytes };
}
// TODO: Remove warning after API has been finalized
public override bool IsPayloadAvailable => m_readPayload == false && m_postings.GetPayload() != null;
public override string ToString()
{
return "spans(" + m_term.ToString() + ")@" + (m_doc == -1 ? "START" : (m_doc == int.MaxValue) ? "END" : m_doc + "-" + m_position);
}
public virtual DocsAndPositionsEnum Postings => m_postings;
private sealed class EmptyTermSpans : TermSpans
{
public override bool MoveNext()
{
return false;
}
public override bool SkipTo(int target)
{
return false;
}
public override int Doc => DocIdSetIterator.NO_MORE_DOCS;
public override int Start => -1;
public override int End => -1;
public override ICollection<byte[]> GetPayload()
{
return null;
}
public override bool IsPayloadAvailable => false;
public override long GetCost()
{
return 0;
}
}
public static readonly TermSpans EMPTY_TERM_SPANS = new EmptyTermSpans();
}
}