/**
* License Agreement for OpenSearchServer
*
* Copyright (C) 2015 Emmanuel Keller / Jaeksoft
*
* http://www.open-search-server.com
*
* This file is part of OpenSearchServer.
*
* OpenSearchServer is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenSearchServer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenSearchServer.
* If not, see <http://www.gnu.org/licenses/>.
**/
package com.jaeksoft.searchlib.facet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.jaeksoft.searchlib.webservice.query.search.SearchQueryAbstract.Facet.OrderByEnum;
import it.unimi.dsi.fastutil.Swapper;
import it.unimi.dsi.fastutil.ints.IntComparator;
public class FacetCounter implements Comparable<FacetCounter> {
public long count;
FacetCounter(Long value) {
this.count = value == null ? 0 : value;
}
FacetCounter(Integer value) {
this.count = value == null ? 0 : value;
}
FacetCounter(FacetCounter counter) {
this.count = counter == null ? 0 : counter.count;
}
@Override
public int compareTo(FacetCounter o) {
return Long.compare(count, o.count);
}
public long increment() {
return (++count);
}
public long add(Long value) {
if (value != null)
this.count += value;
return count;
}
public long add(FacetCounter counter) {
if (counter != null)
this.count += counter.count;
return count;
}
public long getCount() {
return count;
}
public static abstract class FacetSorter implements IntComparator, Swapper {
protected List<Map.Entry<String, FacetCounter>> facetList;
public FacetSorter(List<Map.Entry<String, FacetCounter>> facetList) {
this.facetList = facetList;
}
@Override
public void swap(int a, int b) {
Map.Entry<String, FacetCounter> entry = facetList.get(a);
facetList.set(a, facetList.set(b, entry));
}
public static FacetSorter getSorter(List<Entry<String, FacetCounter>> list, OrderByEnum orderBy) {
if (orderBy == null)
return null;
switch (orderBy) {
case no_sort:
return null;
case count_asc:
return new FacetCounterAsc(list);
case count_desc:
return new FacetCounterDesc(list);
case term_asc:
return new FacetTermAsc(list);
case term_desc:
return new FacetTermDesc(list);
}
return null;
}
}
public static class FacetCounterDesc extends FacetSorter {
public FacetCounterDesc(List<Map.Entry<String, FacetCounter>> facetList) {
super(facetList);
}
@Override
public int compare(Integer o1, Integer o2) {
return Long.compare(facetList.get(o2).getValue().count, facetList.get(o1).getValue().count);
}
@Override
public int compare(int k1, int k2) {
return Long.compare(facetList.get(k2).getValue().count, facetList.get(k1).getValue().count);
}
}
public static class FacetCounterAsc extends FacetSorter {
public FacetCounterAsc(List<Map.Entry<String, FacetCounter>> facetList) {
super(facetList);
}
@Override
public int compare(Integer o1, Integer o2) {
return Long.compare(facetList.get(o1).getValue().count, facetList.get(o2).getValue().count);
}
@Override
public int compare(int k1, int k2) {
return Long.compare(facetList.get(k1).getValue().count, facetList.get(k2).getValue().count);
}
}
public static class FacetTermDesc extends FacetSorter {
public FacetTermDesc(List<Map.Entry<String, FacetCounter>> facetList) {
super(facetList);
}
@Override
public int compare(Integer o1, Integer o2) {
return facetList.get(o2).getKey().compareTo(facetList.get(o1).getKey());
}
@Override
public int compare(int k1, int k2) {
return facetList.get(k2).getKey().compareTo(facetList.get(k1).getKey());
}
}
public static class FacetTermAsc extends FacetSorter {
public FacetTermAsc(List<Map.Entry<String, FacetCounter>> facetList) {
super(facetList);
}
@Override
public int compare(Integer o1, Integer o2) {
return facetList.get(o1).getKey().compareTo(facetList.get(o2).getKey());
}
@Override
public int compare(int k1, int k2) {
return facetList.get(k1).getKey().compareTo(facetList.get(k2).getKey());
}
}
}