Giter Site home page Giter Site logo

Custom Facet Sort about bobobrowse.net HOT 3 CLOSED

nightowl888 avatar nightowl888 commented on July 29, 2024
Custom Facet Sort

from bobobrowse.net.

Comments (3)

NightOwl888 avatar NightOwl888 commented on July 29, 2024

As mentioned in the wiki, all of the interfaces were renamed to start with "I" to follow the .NET conventions. So the equivalent of ComparatorFactory in Java is IComparatorFactory in .NET.

There is a unit test that demonstrates how to build a custom sort. Here is the relevant source.

[Test]
public void TestCustomFacetSort()
{
    BrowseRequest req = new BrowseRequest();
    FacetSpec numberSpec = new FacetSpec();
    numberSpec.CustomComparatorFactory = new TestCustomFacetSortComparatorFactory();

    numberSpec.OrderBy = FacetSpec.FacetSortSpec.OrderByCustom;
    numberSpec.MaxCount = 3;
    req.SetFacetSpec("number", numberSpec);

    var answer = new Dictionary<string, IEnumerable<BrowseFacet>>()
    {
        { "number", new BrowseFacet[] { new BrowseFacet("2130", 1), new BrowseFacet("1013", 1), new BrowseFacet("0913", 1) } }          
    };

    DoTest(req, 7, answer, null);

    numberSpec.OrderBy = FacetSpec.FacetSortSpec.OrderValueAsc;
    answer = new Dictionary<string, IEnumerable<BrowseFacet>>()
    {
        { "number", new BrowseFacet[] { new BrowseFacet("0005", 1), new BrowseFacet("0010", 1), new BrowseFacet("0011", 1) } }          
    };

    DoTest(req, 7, answer, null);
}

private class TestCustomFacetSortComparatorFactory : IComparatorFactory
{

    public IComparer<int> NewComparator(IFieldValueAccessor fieldValueAccessor, BigSegmentedArray counts)
    {
        return new TestCustomFacetSortIntComparator(fieldValueAccessor, counts);
    }

    public IComparer<BrowseFacet> NewComparator()
    {
        return new TestCustomFacetSortBrowseFacetComparator();
    }

    public class TestCustomFacetSortIntComparator : IComparer<int>
    {
        private readonly IFieldValueAccessor fieldValueAccessor;
        private readonly BigSegmentedArray counts;

        public TestCustomFacetSortIntComparator(IFieldValueAccessor fieldValueAccessor, BigSegmentedArray counts)
        {
            this.fieldValueAccessor = fieldValueAccessor;
            this.counts = counts;
        }

        public int Compare(int v1, int v2)
        {
            var size1 = (int)this.fieldValueAccessor.GetRawValue(v1);
            var size2 = (int)this.fieldValueAccessor.GetRawValue(v2);

            int val = size1 - size2;
            if (val == 0)
            {
                val = counts.Get(v1) - counts.Get(v2);
            }
            return val;
        }
    }

    public class TestCustomFacetSortBrowseFacetComparator : IComparer<BrowseFacet>
    {
        public int Compare(BrowseFacet o1, BrowseFacet o2)
        {
            int v1 = Convert.ToInt32(o1.Value);
            int v2 = Convert.ToInt32(o2.Value);
            int val = v2 - v1;
            if (val == 0)
            {
                val = o2.FacetValueHitCount - o1.FacetValueHitCount;
            }
            return val;
        }
    }
}

And the IComparatorFactory is now as follows (with documentation):

/// <summary>
/// Comparator for custom sorting a facet value.
/// author jwang
/// </summary>
public interface IComparatorFactory
{
    ///<summary>Providers a Comparator from field values and counts. This is called within a browse. </summary>
    ///<param name="fieldValueAccessor"> accessor for field values </param>
    ///<param name="counts"> hit counts </param>
    ///<returns> Comparator instance </returns>
    IComparer<int> NewComparator(IFieldValueAccessor fieldValueAccessor, BigSegmentedArray counts);

    ///<summary>Providers a Comparator. This is called when doing a merge across browses. </summary>
    ///<returns> Comparator instance </returns>
    IComparer<BrowseFacet> NewComparator();
}

from bobobrowse.net.

NightOwl888 avatar NightOwl888 commented on July 29, 2024

Note that the return type of the IComparatorFactory is the .NET IComparer<T> type, and works the same way as specified on MSDN.

from bobobrowse.net.

dtosato avatar dtosato commented on July 29, 2024

Okey, it works!

from bobobrowse.net.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.