blob: 237301dd2c4230cea30cf745b699a87f57862385 [file] [log] [blame]
using Lucene.Net.Util.Automaton;
using System;
using System.Text;
namespace Lucene.Net.Search
{
/*
* 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 Automaton = Lucene.Net.Util.Automaton.Automaton;
using IAutomatonProvider = Lucene.Net.Util.Automaton.IAutomatonProvider;
using RegExp = Lucene.Net.Util.Automaton.RegExp;
using Term = Lucene.Net.Index.Term;
using ToStringUtils = Lucene.Net.Util.ToStringUtils;
/// <summary>
/// A fast regular expression query based on the
/// <see cref="Lucene.Net.Util.Automaton"/> package.
/// <list type="bullet">
/// <item><description>Comparisons are <a
/// href="http://tusker.org/regex/regex_benchmark.html">fast</a></description></item>
/// <item><description>The term dictionary is enumerated in an intelligent way, to avoid
/// comparisons. See <see cref="AutomatonQuery"/> for more details.</description></item>
/// </list>
/// <para>
/// The supported syntax is documented in the <see cref="RegExp"/> class.
/// Note this might be different than other regular expression implementations.
/// For some alternatives with different syntax, look under the sandbox.
/// </para>
/// <para>
/// Note this query can be slow, as it needs to iterate over many terms. In order
/// to prevent extremely slow <see cref="RegexpQuery"/>s, a <see cref="RegExp"/> term should not start with
/// the expression <c>.*</c>
/// </para>
/// @lucene.experimental
/// </summary>
/// <seealso cref="RegExp"/>
public class RegexpQuery : AutomatonQuery
{
/// <summary>
/// A provider that provides no named automata
/// </summary>
private static readonly IAutomatonProvider defaultProvider = new AutomatonProviderAnonymousInnerClassHelper();
private class AutomatonProviderAnonymousInnerClassHelper : IAutomatonProvider
{
public Automaton GetAutomaton(string name)
{
return null;
}
}
/// <summary>
/// Constructs a query for terms matching <paramref name="term"/>.
/// <para>
/// By default, all regular expression features are enabled.
/// </para>
/// </summary>
/// <param name="term"> Regular expression. </param>
public RegexpQuery(Term term)
: this(term, RegExpSyntax.ALL)
{
}
/// <summary>
/// Constructs a query for terms matching <paramref name="term"/>.
/// </summary>
/// <param name="term"> Regular expression. </param>
/// <param name="flags"> Optional <see cref="RegExp"/> features from <see cref="RegExpSyntax"/> </param>
public RegexpQuery(Term term, RegExpSyntax flags)
: this(term, flags, defaultProvider)
{
}
/// <summary>
/// Constructs a query for terms matching <paramref name="term"/>.
/// </summary>
/// <param name="term"> Regular expression. </param>
/// <param name="flags"> Optional <see cref="RegExp"/> features from <see cref="RegExpSyntax"/> </param>
/// <param name="provider"> Custom <see cref="IAutomatonProvider"/> for named automata </param>
public RegexpQuery(Term term, RegExpSyntax flags, IAutomatonProvider provider)
: base(term, (new RegExp(term.Text(), flags)).ToAutomaton(provider))
{
}
/// <summary>
/// Prints a user-readable version of this query. </summary>
public override string ToString(string field)
{
StringBuilder buffer = new StringBuilder();
if (!m_term.Field.Equals(field, StringComparison.Ordinal))
{
buffer.Append(m_term.Field);
buffer.Append(":");
}
buffer.Append('/');
buffer.Append(m_term.Text());
buffer.Append('/');
buffer.Append(ToStringUtils.Boost(Boost));
return buffer.ToString();
}
}
}