blob: e5eabcf4045d9f8e2a7e08ec5fef279c288bccee [file] [log] [blame]
using J2N.Text;
using System;
using System.Collections.Generic;
namespace Lucene.Net.Facet.Taxonomy
{
/*
* 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 DimConfig = Lucene.Net.Facet.FacetsConfig.DimConfig; // javadocs
/// <summary>
/// Base class for all taxonomy-based facets impls.
/// </summary>
public abstract class TaxonomyFacets : Facets
{
private static readonly IComparer<FacetResult> BY_VALUE_THEN_DIM = new ComparerAnonymousInnerClassHelper();
private class ComparerAnonymousInnerClassHelper : IComparer<FacetResult>
{
public ComparerAnonymousInnerClassHelper()
{
}
public virtual int Compare(FacetResult a, FacetResult b)
{
if (a.Value > b.Value)
{
return -1;
}
else if (b.Value > a.Value)
{
return 1;
}
else
{
return a.Dim.CompareToOrdinal(b.Dim);
}
}
}
/// <summary>
/// Index field name provided to the constructor.
/// </summary>
protected readonly string m_indexFieldName;
/// <summary>
/// <see cref="TaxonomyReader"/> provided to the constructor.
/// </summary>
protected readonly TaxonomyReader m_taxoReader;
/// <summary>
/// <see cref="FacetsConfig"/> provided to the constructor.
/// </summary>
protected readonly FacetsConfig m_config;
/// <summary>
/// Maps parent ordinal to its child, or -1 if the parent
/// is childless.
/// </summary>
protected readonly int[] m_children;
/// <summary>
/// Maps an ordinal to its sibling, or -1 if there is no
/// sibling.
/// </summary>
protected readonly int[] m_siblings;
/// <summary>
/// Sole constructor.
/// </summary>
protected internal TaxonomyFacets(string indexFieldName, TaxonomyReader taxoReader, FacetsConfig config)
{
this.m_indexFieldName = indexFieldName;
this.m_taxoReader = taxoReader;
this.m_config = config;
ParallelTaxonomyArrays pta = taxoReader.ParallelTaxonomyArrays;
m_children = pta.Children;
m_siblings = pta.Siblings;
}
/// <summary>
/// Throws <see cref="ArgumentException"/> if the
/// dimension is not recognized. Otherwise, returns the
/// <see cref="DimConfig"/> for this dimension.
/// </summary>
protected virtual DimConfig VerifyDim(string dim)
{
DimConfig dimConfig = m_config.GetDimConfig(dim);
if (!dimConfig.IndexFieldName.Equals(m_indexFieldName, StringComparison.Ordinal))
{
throw new System.ArgumentException("dimension \"" + dim + "\" was not indexed into field \"" + m_indexFieldName);
}
return dimConfig;
}
public override IList<FacetResult> GetAllDims(int topN)
{
int ord = m_children[TaxonomyReader.ROOT_ORDINAL];
List<FacetResult> results = new List<FacetResult>();
while (ord != TaxonomyReader.INVALID_ORDINAL)
{
string dim = m_taxoReader.GetPath(ord).Components[0];
DimConfig dimConfig = m_config.GetDimConfig(dim);
if (dimConfig.IndexFieldName.Equals(m_indexFieldName, StringComparison.Ordinal))
{
FacetResult result = GetTopChildren(topN, dim);
if (result != null)
{
results.Add(result);
}
}
ord = m_siblings[ord];
}
// Sort by highest value, tie break by dim:
results.Sort(BY_VALUE_THEN_DIM);
return results;
}
}
}