/* * 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 edu.harvard.iq.dataverse.mydata; import com.google.common.collect.ContiguousSet; import com.google.common.collect.DiscreteDomain; import com.google.common.collect.Range; import edu.harvard.iq.dataverse.search.SearchFields; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; /** * Convenience methods for formatting long arrays of ids into solrQuery strings * @author rmp553 */ public class SolrQueryFormatter { public static int SOLR_ID_GROUP_SIZE = 1000; public void setSolrIdGroupSize(int groupSize){ SOLR_ID_GROUP_SIZE = groupSize; } /** * * @param sliceOfIds * @param paramName * @return */ private String formatIdsForSolrClause(List<Long> sliceOfIds, String paramName, String dvObjectType){ //='entityId'): if (paramName == null){ throw new NullPointerException("paramName cannot be null"); } if (sliceOfIds == null){ throw new NullPointerException("sliceOfIds cannot be null"); } if (sliceOfIds.isEmpty()){ throw new IllegalStateException("sliceOfIds must have at least 1 value"); } List<String> idList = new ArrayList<>(); for (Long id : sliceOfIds) { if (id != null){ idList.add("" + id); } } String orClause = StringUtils.join(idList, " "); String qPart = "(" + paramName + ":(" + orClause + "))"; if (dvObjectType != null){ qPart = "(" + paramName + ":(" + orClause + ") AND " + SearchFields.TYPE + ":(" + dvObjectType + "))"; //valStr; } return qPart; } /** * SOLR cannot parse over 1024 items in a boolean clause * Group IDs in batches of 1000 * @param idList * @param paramName * @return */ public String buildIdQuery(Set<Long> idListSet, String paramName, String dvObjectType){ if (paramName == null){ throw new NullPointerException("paramName cannot be null"); } if ((idListSet == null)||(idListSet.isEmpty())){ return null; } List<Long> idList = new ArrayList<>(idListSet); int numIds = idList.size(); List<String> queryClauseParts = new ArrayList<>(); int idCnt = 0; int numFullGroups = numIds / this.SOLR_ID_GROUP_SIZE; List<Long> sliceOfIds; // ------------------------------------------- // Ids in groups of SOLR_ID_GROUP_SIZE (1,000) // ------------------------------------------- for (int current_group_num=0; current_group_num < numFullGroups; current_group_num++){ // slice group of ids off // sliceOfIds = idList.subList(idCnt, this.SOLR_ID_GROUP_SIZE * (current_group_num+1)); // add them to the count idCnt += sliceOfIds.size(); // format ids into solr OR clause // queryClauseParts.add(this.formatIdsForSolrClause(sliceOfIds, paramName, dvObjectType)); } // ------------------------------------------- // Extra ids not evenly divisible by SOLR_ID_GROUP_SIZE // ------------------------------------------- int extraIdCount = numIds % this.SOLR_ID_GROUP_SIZE; if (extraIdCount > 0){ // slice group of ids off // sliceOfIds = idList.subList(idCnt, idCnt + extraIdCount); // format ids into solr OR clause // queryClauseParts.add(this.formatIdsForSolrClause(sliceOfIds, paramName, dvObjectType)); } return StringUtils.join(queryClauseParts, " OR "); } }