sk.opendatanode.facet.FacetItem.java Source code

Java tutorial

Introduction

Here is the source code for sk.opendatanode.facet.FacetItem.java

Source

/* Copyright (C) 2012 Martin Virag <martin.virag@eea.sk>
 *
 * This file is part of Open Data Node.
 *
 * Open Data Node 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.
 *
 * Open Data Node 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 Open Data Node.  If not, see <http://www.gnu.org/licenses/>.
 */

package sk.opendatanode.facet;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;

public class FacetItem implements Serializable {

    private static final long serialVersionUID = 4454142213741287528L;
    private String name;
    private String query;
    private int count;

    /**
     * 
     * @param name  what users sees = link label
     * @param query query for solr facet
     * @param count facet count result
     */
    public FacetItem(String name, String query, int count) {
        super();
        this.name = name;
        this.query = query;
        this.count = count;
    }

    public String getName() {
        return name;
    }

    public String getQuery() {
        return query;
    }

    public String getQueryFieldName() {
        return getQueryFieldName(query);
    }

    public static String getQueryFieldName(String query) {
        if (query != null && !query.isEmpty()) {
            return query.split(":")[0].replace("-", "");
        }
        return null;
    }

    public int getCount() {
        return count;
    }

    /**
     * prida do parametrov linku svoj filter, ak uz tam je
     * to znamena pouzivatel chce odstranit filter tak ho
     * odoberieme
     * @param params
     */
    public void organizeParameters(PageParameters params) {
        boolean atLeastOneFilterAdded = params.getValues("fq").size() > 0;

        if (atLeastOneFilterAdded) {
            String thisFieldName = getQueryFieldName();
            boolean onlyOneFilter = params.getValues("fq").size() == 1;

            if (onlyOneFilter) { // v podstate sa vztahuje iba na field type
                StringValue fq = params.get("fq");
                boolean isFacetClickedTwice = fq.toString().equals(getQuery());
                boolean isFacetWithTheSameField = thisFieldName.equals(getQueryFieldName(fq.toString()));

                if (isFacetClickedTwice) {
                    params.remove("fq");
                } else if (isFacetWithTheSameField) { // iba jeden fq ineho facet-u -> pridame
                    params.set("fq", StringValue.valueOf(getQuery()));
                } else {
                    params.add("fq", StringValue.valueOf(getQuery()));
                }
            } else {
                //                params.put("fq", getModifiedFq((String[]) fq, thisFieldName));
                List<StringValue> values = new ArrayList<StringValue>(params.getValues("fq"));
                modifyFq(values, thisFieldName);
                params.remove("fq");
                for (StringValue val : values)
                    params.add("fq", val);
            }
        } else {
            params.add("fq", StringValue.valueOf(getQuery()));
        }
    }

    /**
     * If facet was clicked twice, returns fq without its filter. If
     * If user clicked facet with the same "category" before, replaces
     * that facet with his query
     * 
     * @param values
     * @param fieldNameToRemove
     * @return
     */
    private void modifyFq(List<StringValue> values, String fieldNameToRemove) {
        boolean isDefaultFacet = fieldNameToRemove.equals("type");
        boolean isFacetWithTheSameField = false;

        StringValue query = StringValue.valueOf(getQuery());

        if (values.contains(query)) { // facet clicked twice
            if (isDefaultFacet) {
                values.clear();
                return;
            } else {
                values.remove(query);
                return;
            }
        } else { // musim skontrolovat ci je tam facet s rovnakym fieldom
            for (int i = 0; i < values.size(); i++) {
                isFacetWithTheSameField = fieldNameToRemove.equals(getQueryFieldName(values.get(i).toString()));
                if (isDefaultFacet && isFacetWithTheSameField) {
                    values.clear();
                    values.add(StringValue.valueOf(getQuery()));
                    return;
                }

                if (isFacetWithTheSameField) {
                    values.set(i, StringValue.valueOf(getQuery()));
                    return;
                }
            }
        }

        // ak sa dostal sem znamena ze mame pridat novy filter,
        // stacil facet prvy krat z inej "kategorie"
        values.add(StringValue.valueOf(getQuery()));
    }
}