//-----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation.
//
//-----------------------------------------------------------------------
namespace Microsoft.Isam.Esent.Interop
{
using System;
using System.Diagnostics;
using System.Globalization;
///
/// Describes one segment of an index.
///
[Serializable]
public class IndexSegment : IEquatable
{
///
/// The name of the column.
///
private readonly string columnName;
///
/// The type of the column.
///
private readonly JET_coltyp coltyp;
///
/// True if the column is sorted in ascending order.
///
private readonly bool isAscending;
///
/// True if the column is an ASCII column.
///
private readonly bool isASCII;
///
/// Initializes a new instance of the IndexSegment class.
///
/// The name of the indexed column.
/// The type of the column.
/// True if the column is ascending.
/// True if the column is over an ASCII column.
internal IndexSegment(
string name,
JET_coltyp coltyp,
bool isAscending,
bool isASCII)
{
this.columnName = name;
this.coltyp = coltyp;
this.isAscending = isAscending;
this.isASCII = isASCII;
}
///
/// Gets name of the column being indexed.
///
public string ColumnName
{
[DebuggerStepThrough]
get { return this.columnName; }
}
///
/// Gets the type of the column being indexed.
///
public JET_coltyp Coltyp
{
[DebuggerStepThrough]
get { return this.coltyp; }
}
///
/// Gets a value indicating whether the index segment is ascending.
///
public bool IsAscending
{
[DebuggerStepThrough]
get { return this.isAscending; }
}
///
/// Gets a value indicating whether the index segment is over an ASCII text
/// column. This value is only meaningful for text column segments.
///
public bool IsASCII
{
[DebuggerStepThrough]
get { return this.isASCII; }
}
///
/// Returns a value indicating whether this instance is equal
/// to another instance.
///
/// An object to compare with this instance.
/// True if the two instances are equal.
public override bool Equals(object obj)
{
if (obj == null || this.GetType() != obj.GetType())
{
return false;
}
return this.Equals((IndexSegment)obj);
}
///
/// Generate a string representation of the instance.
///
/// The structure as a string.
public override string ToString()
{
return string.Format(
CultureInfo.InvariantCulture, "{0}{1}({2})", this.isAscending ? "+" : "-", this.columnName, this.coltyp);
}
///
/// Returns the hash code for this instance.
///
/// The hash code for this instance.
public override int GetHashCode()
{
return this.columnName.GetHashCode()
^ (int)this.coltyp * 31
^ (this.isAscending ? 0x10000 : 0x20000)
^ (this.isASCII ? 0x40000 : 0x80000);
}
///
/// Returns a value indicating whether this instance is equal
/// to another instance.
///
/// An instance to compare with this instance.
/// True if the two instances are equal.
public bool Equals(IndexSegment other)
{
if (null == other)
{
return false;
}
return this.columnName.Equals(other.columnName, StringComparison.OrdinalIgnoreCase)
&& this.coltyp == other.coltyp
&& this.isAscending == other.isAscending
&& this.isASCII == other.isASCII;
}
}
}