blob: 64febfc714b50a32a3e74cc8ac8a20f3305ee577 [file] [log] [blame]
using Lucene.Net.Analysis.TokenAttributes;
using Lucene.Net.Util;
using System;
using System.Globalization;
namespace Lucene.Net.Analysis.Sinks
{
/*
* 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>
/// Attempts to parse the <see cref="CharTermAttribute.ToString()"/> as a Date using either the
/// <see cref="DateTime.TryParse(string, IFormatProvider, DateTimeStyles, out DateTime)"/> or
/// <see cref="DateTime.TryParseExact(string, string[], IFormatProvider, DateTimeStyles, out DateTime)"/> methods.
/// If a format is passed, <see cref="DateTime.TryParseExact(string, string[], IFormatProvider, DateTimeStyles, out DateTime)"/>
/// will be used, and the format must strictly match one of the specified formats as specified in the MSDN documentation.
/// If the value is a Date, it will add it to the sink.
/// </summary>
public class DateRecognizerSinkFilter : TeeSinkTokenFilter.SinkFilter
{
protected DateTimeStyles m_style;
protected ICharTermAttribute m_termAtt;
protected IFormatProvider m_culture;
protected string[] m_formats;
/// <summary>
/// Creates a new instance of <see cref="DateRecognizerSinkFilter"/> using the current culture and <see cref="DateTimeStyles.None"/>.
/// Loosely matches standard DateTime formats using <see cref="DateTime.TryParse(string, IFormatProvider, DateTimeStyles, out DateTime)"/>.
/// </summary>
public DateRecognizerSinkFilter()
: this((string[])null, DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None)
{ }
/// <summary>
/// Creates a new instance of <see cref="DateRecognizerSinkFilter"/> using the supplied culture and <see cref="DateTimeStyles.None"/>.
/// Loosely matches standard DateTime formats using <see cref="DateTime.TryParse(string, IFormatProvider, DateTimeStyles, out DateTime)"/>.
/// </summary>
/// <param name="culture">An object that supplies culture-specific format information</param>
public DateRecognizerSinkFilter(IFormatProvider culture)
: this((string[])null, culture, DateTimeStyles.None)
{ }
/// <summary>
/// Creates a new instance of <see cref="DateRecognizerSinkFilter"/> using the current culture and <see cref="DateTimeStyles.None"/>.
/// Strictly matches the supplied DateTime formats using <see cref="DateTime.TryParseExact(string, string, IFormatProvider, DateTimeStyles, out DateTime)"/>.
/// </summary>
/// <param name="format">The allowable format of the <see cref="CharTermAttribute.ToString()"/>.
/// If supplied, it must match the format of the date exactly to get a match.</param>
public DateRecognizerSinkFilter(string format)
: this(new string[] { format }, DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None)
{ }
/// <summary>
/// Creates a new instance of <see cref="DateRecognizerSinkFilter"/> using the current culture and <see cref="DateTimeStyles.None"/>.
/// Strictly matches the supplied DateTime formats using <see cref="DateTime.TryParseExact(string, string[], IFormatProvider, DateTimeStyles, out DateTime)"/>.
/// </summary>
/// <param name="formats">An array of allowable formats of the <see cref="CharTermAttribute.ToString()"/>.
/// If supplied, one of them must match the format of the date exactly to get a match.</param>
public DateRecognizerSinkFilter(string[] formats)
: this(formats, DateTimeFormatInfo.CurrentInfo, DateTimeStyles.None)
{ }
/// <summary>
/// Creates a new instance of <see cref="DateRecognizerSinkFilter"/> using the supplied culture and <see cref="DateTimeStyles"/>.
/// Loosely matches standard DateTime formats using <see cref="DateTime.TryParse(string, IFormatProvider, DateTimeStyles, out DateTime)"/>.
/// </summary>
/// <param name="culture">An object that supplies culture-specific format information</param>
/// <param name="style">A bitwise combination of enumeration values that indicates the permitted format of s.
/// A typical value to specify is <see cref="DateTimeStyles.None"/></param>
public DateRecognizerSinkFilter(IFormatProvider culture, DateTimeStyles style)
: this((string[])null, culture, style)
{ }
/// <summary>
/// Creates a new instance of <see cref="DateRecognizerSinkFilter"/> using the supplied format, culture and <see cref="DateTimeStyles.None"/>.
/// Strictly matches the supplied DateTime formats using <see cref="DateTime.TryParseExact(string, string, IFormatProvider, DateTimeStyles, out DateTime)"/>.
/// </summary>
/// <param name="format">The allowable format of the <see cref="CharTermAttribute.ToString()"/>.
/// If supplied, it must match the format of the date exactly to get a match.</param>
/// <param name="culture">An object that supplies culture-specific format information</param>
public DateRecognizerSinkFilter(string format, IFormatProvider culture)
: this(new string[] { format }, culture, DateTimeStyles.None)
{ }
/// <summary>
/// Creates a new instance of <see cref="DateRecognizerSinkFilter"/> using the supplied formats, culture and <see cref="DateTimeStyles.None"/>.
/// Strictly matches the supplied DateTime formats using <see cref="DateTime.TryParseExact(string, string[], IFormatProvider, DateTimeStyles, out DateTime)"/>.
/// </summary>
/// <param name="formats">An array of allowable formats of the <see cref="CharTermAttribute.ToString()"/>.
/// If supplied, one of them must match the format of the date exactly to get a match.</param>
/// <param name="culture">An object that supplies culture-specific format information</param>
public DateRecognizerSinkFilter(string[] formats, IFormatProvider culture)
: this(formats, culture, DateTimeStyles.None)
{ }
/// <summary>
/// Creates a new instance of <see cref="DateRecognizerSinkFilter"/> using the supplied format, culture and <see cref="DateTimeStyles"/>.
/// Strictly matches the supplied DateTime formats using <see cref="DateTime.TryParseExact(string, string, IFormatProvider, DateTimeStyles, out DateTime)"/>.
/// </summary>
/// <param name="format">The allowable format of the <see cref="CharTermAttribute.ToString()"/>.
/// If supplied, it must match the format of the date exactly to get a match.</param>
/// <param name="culture">An object that supplies culture-specific format information</param>
/// <param name="style">A bitwise combination of enumeration values that indicates the permitted format of s.
/// A typical value to specify is <see cref="DateTimeStyles.None"/></param>
public DateRecognizerSinkFilter(string format, IFormatProvider culture, DateTimeStyles style)
: this(new string[] { format }, culture, style)
{ }
/// <summary>
/// Creates a new instance of <see cref="DateRecognizerSinkFilter"/> using the supplied formats, culture and <see cref="DateTimeStyles"/>.
/// Strictly matches the supplied DateTime formats using <see cref="DateTime.TryParseExact(string, string[], IFormatProvider, DateTimeStyles, out DateTime)"/>.
/// </summary>
/// <param name="formats">An array of allowable formats of the <see cref="CharTermAttribute.ToString()"/>.
/// If supplied, one of them must match the format of the date exactly to get a match.</param>
/// <param name="culture">An object that supplies culture-specific format information</param>
/// <param name="style">A bitwise combination of enumeration values that indicates the permitted format of s.
/// A typical value to specify is <see cref="DateTimeStyles.None"/></param>
public DateRecognizerSinkFilter(string[] formats, IFormatProvider culture, DateTimeStyles style)
{
this.m_culture = culture;
this.m_style = style;
this.m_formats = formats;
}
public override bool Accept(AttributeSource source)
{
if (m_termAtt == null)
{
m_termAtt = source.AddAttribute<ICharTermAttribute>();
}
DateTime date; //We don't care about the date, just that we can parse it as a date
if (m_formats == null)
{
return DateTime.TryParse(m_termAtt.ToString(), m_culture, m_style, out date);
}
else
{
return DateTime.TryParseExact(m_termAtt.ToString(), m_formats, m_culture, m_style, out date);
}
}
}
}