Java tutorial
/* * 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; } }