se.nrm.dina.inventory.client.solr.SolrClient.java Source code

Java tutorial

Introduction

Here is the source code for se.nrm.dina.inventory.client.solr.SolrClient.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package se.nrm.dina.inventory.client.solr;

import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.stream.Collectors;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.util.NamedList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import se.nrm.dina.inventory.client.util.SMTPGroup;
import se.nrm.dina.inventory.client.util.Util;
import se.nrm.dina.inventory.client.vo.*;

/**
 *
 * @author idali
 */
@Stateless
public class SolrClient {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private final static String SOLR_LOCAL_URL = "http://localhost:8983/solr/";
    //    private final static String SOLR_REMOTE_URL = "http://dina-portal:8983/solr/";
    private final static String SOLR_REMOTE_URL = "http://dina-db:8983/solr/";

    private final String servername;
    private final static String LOCAL_HOST = "localhost";
    private final String BASE_URL;

    private final int COLLECTION_ID;

    private final List<String> groups;

    private SolrQuery solrQuery;
    private final SolrServer solrServer;

    public SolrClient() {

        servername = ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest())
                .getServerName();
        logger.info("server name : {}", servername);

        BASE_URL = (servername.contains(LOCAL_HOST) || servername.contains("idas")) ? SOLR_LOCAL_URL
                : SOLR_REMOTE_URL;

        logger.info("baseUrl : {}", BASE_URL);
        solrServer = new HttpSolrServer(BASE_URL);
        solrQuery = new SolrQuery();

        groups = new ArrayList<>();
        EnumSet.allOf(SMTPGroup.class).stream().forEach((groupEnum) -> {
            groups.add(groupEnum.name());
        });

        COLLECTION_ID = Util.getCollectionId();
    }

    public String getHighClassification(String taxon) {

        logger.info("getHighClassification : {}", taxon);
        StringBuilder sb = new StringBuilder();
        sb.append("+(ftx:");
        sb.append(taxon);
        sb.append(") +(cln:");
        sb.append(262144);
        sb.append(")");

        solrQuery = new SolrQuery();
        solrQuery.setQuery(sb.toString()).addField("ht").setRows(1);

        try {
            QueryResponse queryResponse = solrServer.query(solrQuery);
            SolrDocumentList documents = queryResponse.getResults();

            if (documents != null && !documents.isEmpty()) {
                SolrDocument document = documents.get(0);
                return (String) document.getFieldValue("ht");
            }
            return "";
        } catch (SolrServerException ex) {
            return "";
        }
    }

    private String buildStatisticGroupSearchQuery(String group) {
        StringBuilder sb = new StringBuilder();
        sb.append("+ftx:");
        sb.append(group);
        sb.append(" +cln:");
        sb.append(COLLECTION_ID);
        return sb.toString();
    }

    private ProgressData buildSearchResult(String group) {

        solrQuery = new SolrQuery();
        solrQuery.setQuery(buildStatisticGroupSearchQuery(group));
        solrQuery.setFacet(true).addFacetField("geo").addFacetField("sfn").setFacetMinCount(1).setFacetLimit(50000);

        //        Object[] array = new Object[10];
        try {
            QueryResponse queryResponse = solrServer.query(solrQuery);
            List<FacetField.Count> traps = queryResponse.getFacetField("geo").getValues(); // trap counter
            int totalVials = traps.stream().mapToInt(t -> (int) t.getCount()).sum();

            List<FacetField.Count> sfns = queryResponse.getFacetField("sfn").getValues();
            int events = sfns.size(); // event count (remove event, and id)
            events = events >= 2 ? events - 2 : events;

            solrQuery.addFilterQuery("sort:true");
            queryResponse = solrServer.query(solrQuery);
            List<FacetField.Count> sortedTrap = queryResponse.getFacetField("geo").getValues(); // trap counter

            int totalSortedVials = sortedTrap.stream().mapToInt(t -> (int) t.getCount()).sum();

            List<FacetField.Count> sortedSfn = queryResponse.getFacetField("sfn").getValues();
            int sortedEvent = sortedSfn.size(); // event count (remove event, and id)
            sortedEvent = sortedEvent >= 2 ? sortedEvent - 2 : sortedEvent;

            int totalUnsortedVials = totalVials - totalSortedVials;
            int unsortedEvent = events - sortedEvent;
            int unsortedTrap = traps.size() - sortedTrap.size();

            //            array[0] = group;
            //            array[1] = totalVials;
            //            array[2] = traps.size();
            //            array[3] = events;
            //            array[4] = totalUnsortedVials;
            //            array[5] = unsortedTrap;
            //            array[6] = unsortedEvent;
            //            array[7] = totalSortedVials;
            //            array[8] = sortedTrap.size();
            //            array[9] = sortedEvent;

            return new ProgressData(group, totalVials, traps.size(), events, totalUnsortedVials, unsortedTrap,
                    unsortedEvent, totalSortedVials, sortedTrap.size(), sortedEvent);

        } catch (SolrServerException ex) {
            logger.error(ex.getMessage());
        }
        return null;
    }

    public List<ProgressData> getStatisticGroupData() {

        logger.info("getStatisticGroupData");

        return groups.stream().map(this::buildSearchResult).collect(Collectors.toList());

        //        List<Object[]> list = new ArrayList<>(); 
        // 
        //        list.addAll(groups.stream()
        ////                .map(this::buildStatisticGroupSearchQuery)
        //                .map(this::buildSearchResult)
        //                .collect(Collectors.toList())) ;
        //            
        //        return list; 
    }

    public List<TaxonStatisticData> getStatisticDataForTaxa(String taxa) {

        logger.info("getStatistcDataForTaxa");

        StringBuilder sb = new StringBuilder();
        sb.append("+(ftx:");
        sb.append(taxa);
        sb.append(" ht:*");
        sb.append(taxa);
        sb.append("*) +cln:");
        sb.append(COLLECTION_ID);

        solrQuery = new SolrQuery();
        solrQuery.setQuery(sb.toString().trim()).addField("ftx");
        solrQuery.setFacet(true).addFacetField("geo").addFacetField("sfn").setFacetMinCount(1).setFacetLimit(50000);
        solrQuery.setParam("group", true);
        solrQuery.setParam("group.field", "ftx");
        solrQuery.addSort("ftx", SolrQuery.ORDER.asc);
        solrQuery.setRows(10000);

        List<TaxonStatisticData> list = new ArrayList<>();
        try {
            QueryResponse queryResponse = solrServer.query(solrQuery);
            FacetField geoField = queryResponse.getFacetField("geo");
            List<FacetField.Count> traps = geoField.getValues(); // trap counter

            FacetField ces = queryResponse.getFacetField("sfn");
            List<FacetField.Count> sfns = ces.getValues();
            int events = sfns.size(); // event count (remove event, and id)
            if (events >= 2) {
                events = events - 2;
            }

            NamedList respNL = queryResponse.getResponse();
            NamedList groupInfo = (NamedList) respNL.get("grouped");
            NamedList thisGroupInfo = (NamedList) groupInfo.get("ftx");

            Number totalUngrouped = (Number) thisGroupInfo.get("matches");
            int totalNumberOfUngroupedDocuments = totalUngrouped.intValue();
            TaxonStatisticData data = new TaxonStatisticData("ALL TAXA", taxa, totalNumberOfUngroupedDocuments,
                    traps.size(), events);

            List<Object> groupData = (List<Object>) thisGroupInfo.get("groups");
            list = groupData.stream().map(o -> (NamedList) o).map(o -> (SolrDocumentList) o.get("doclist"))
                    .map(this::buildTaxonStatisticDataBySolrDocuments).collect(Collectors.toList());

            list.sort((l1, l2) -> l1.getTaxonName().compareTo(l2.getTaxonName()));
            list.add(0, data);

        } catch (SolrServerException ex) {
            logger.error(ex.getMessage());
        }
        return list;
    }

    private TaxonStatisticData buildTaxonStatisticDataBySolrDocuments(SolrDocumentList documents) {

        SolrDocument document = documents.get(0);
        StringBuilder sb = new StringBuilder();
        String fullName = (String) document.getFieldValue("ftx");
        sb.append("+ftx:");
        sb.append(fullName.trim());
        sb.append(" +cln:");
        sb.append(COLLECTION_ID);
        Integer[] counts = addTrapAndEventCount(sb.toString().trim());

        return new TaxonStatisticData(fullName, fullName, (int) documents.getNumFound(), counts[0], counts[1]);

    }

    private Integer[] addTrapAndEventCount(String taxa) {
        solrQuery = new SolrQuery();
        solrQuery.setQuery(taxa);
        solrQuery.setFacet(true).addFacetField("geo").addFacetField("sfn").setFacetMinCount(1).setFacetLimit(50000);
        solrQuery.setStart(0);

        solrQuery.setRows(2000);

        Integer[] counts = new Integer[2];
        try {
            QueryResponse queryResponse = solrServer.query(solrQuery);
            FacetField geoField = queryResponse.getFacetField("geo");
            counts[0] = geoField.getValues().size();

            FacetField ces = queryResponse.getFacetField("sfn");
            counts[1] = ces.getValues().size() - 2;
        } catch (SolrServerException ex) {
            logger.error(ex.getMessage());
        }
        return counts;
    }
}