Example usage for org.apache.solr.client.solrj SolrQuery setStart

List of usage examples for org.apache.solr.client.solrj SolrQuery setStart

Introduction

In this page you can find the example usage for org.apache.solr.client.solrj SolrQuery setStart.

Prototype

public SolrQuery setStart(Integer start) 

Source Link

Usage

From source file:org.mousephenotype.cda.solr.SolrUtils.java

License:Apache License

/**
 * Fetch a map of image terms indexed by ma id
 *
 * @param imagesCore a valid solr connection
 * @return a map, indexed by child ma id, of all parent terms with
 * associations//from  w w w . ja v a 2s. c  o  m
 * @throws SolrServerException, IOException
 */
public static Map<String, List<SangerImageDTO>> populateSangerImagesMap(SolrClient imagesCore)
        throws SolrServerException, IOException {
    Map<String, List<SangerImageDTO>> map = new HashMap();

    int pos = 0;
    long total = Integer.MAX_VALUE;
    SolrQuery query = new SolrQuery(SangerImageDTO.MA_ID + ":*");
    query.setRows(BATCH_SIZE);
    while (pos < total) {
        query.setStart(pos);
        QueryResponse response = null;
        response = imagesCore.query(query);

        total = response.getResults().getNumFound();
        List<SangerImageDTO> imageList = response.getBeans(SangerImageDTO.class);

        for (SangerImageDTO image : imageList) {
            for (String termId : image.getMaId()) {
                if (!map.containsKey(termId)) {
                    map.put(termId, new ArrayList<SangerImageDTO>());
                }
                String imageId = image.getId();
                List<SangerImageDTO> sangerImageList = map.get(termId);

                boolean imageFound = false;
                for (SangerImageDTO dto : sangerImageList) {
                    if (dto.getId().equalsIgnoreCase(imageId)) {
                        imageFound = true;
                        break;
                    }
                }
                // Don't add duplicate images.
                if (!imageFound) {
                    map.get(termId).add(image);
                }
            }
        }
        pos += BATCH_SIZE;
    }

    return map;
}

From source file:org.mousephenotype.cda.solr.SolrUtils.java

License:Apache License

/**
 * Fetch a map of image terms indexed by ma id
 *
 * @param imagesCore a valid solr connection
 * @return a map, indexed by child ma id, of all parent terms with
 * associations/*  w  w w .  j  a v a2  s .co m*/
 * @throws SolrServerException, IOException
 */
public static Map<String, List<SangerImageDTO>> populateSangerImagesByMgiAccession(SolrClient imagesCore)
        throws SolrServerException, IOException {
    Map<String, List<SangerImageDTO>> map = new HashMap();

    int pos = 0;
    long total = Integer.MAX_VALUE;
    SolrQuery query = new SolrQuery("mgi_accession_id:*");
    query.setRows(BATCH_SIZE);
    while (pos < total) {
        query.setStart(pos);
        QueryResponse response = null;
        response = imagesCore.query(query);
        total = response.getResults().getNumFound();
        List<SangerImageDTO> imageList = response.getBeans(SangerImageDTO.class);
        for (SangerImageDTO image : imageList) {

            if (!map.containsKey(image.getAccession())) {
                map.put(image.getAccession(), new ArrayList<SangerImageDTO>());
            }
            String imageId = image.getId();
            List<SangerImageDTO> sangerImageList = map.get(image.getAccession());

            boolean imageFound = false;
            for (SangerImageDTO dto : sangerImageList) {
                if (dto.getId().equalsIgnoreCase(imageId)) {
                    imageFound = true;
                    break;
                }
            }
            // Don't add duplicate images.
            if (!imageFound) {
                map.get(image.getAccession()).add(image);
            }

        }
        pos += BATCH_SIZE;
    }

    return map;
}

From source file:org.mousephenotype.cda.solr.SolrUtils.java

License:Apache License

/**
 * Fetch a map of mgi accessions to alleles
 *
 * @param alleleCore a valid solr connection
 * @return a map, indexed by MGI Accession id, of all alleles
 *
 * @throws SolrServerException, IOException
 *//*from w w w  .jav a  2s .  c  o m*/
public static Map<String, List<AlleleDTO>> populateAllelesMap(SolrClient alleleCore)
        throws SolrServerException, IOException {

    Map<String, List<AlleleDTO>> alleles = new HashMap<>();

    int pos = 0;
    long total = Integer.MAX_VALUE;
    SolrQuery query = new SolrQuery("*:*");
    query.setRows(BATCH_SIZE);
    while (pos < total) {
        query.setStart(pos);
        QueryResponse response = null;
        response = alleleCore.query(query);
        total = response.getResults().getNumFound();
        List<AlleleDTO> alleleList = response.getBeans(AlleleDTO.class);
        for (AlleleDTO allele : alleleList) {
            String key = allele.getMgiAccessionId();
            if (!alleles.containsKey(key)) {
                alleles.put(key, new ArrayList<>());
            }
            alleles.get(key).add(allele);
        }
        pos += BATCH_SIZE;
    }
    logger.debug("  Loaded {} alleles", alleles.size());

    return alleles;
}

From source file:org.mousephenotype.cda.solr.SolrUtils.java

License:Apache License

/**
 * Fetch a map of mp terms associated to hp terms, indexed by mp id.
 *
 * @param phenodigm_core a valid solr connection
 * @return a map, indexed by mp id, of all hp terms
 *
 * @throws SolrServerException, IOException
 *//*from   w  w w .  j a v  a2s .  c o m*/
public static Map<String, List<Map<String, String>>> populateMpToHpTermsMap(SolrClient phenodigm_core)
        throws SolrServerException, IOException {

    // url="q=mp_id:&quot;${nodeIds.term_id}&quot;&amp;rows=999&amp;fq=type:mp_hp&amp;fl=hp_id,hp_term"
    // processor="XPathEntityProcessor" >
    //
    // <field column="hp_id" xpath="/response/result/doc/str[@name='hp_id']"
    // />
    // <field column="hp_term"
    // xpath="/response/result/doc/str[@name='hp_term']" />
    Map<String, List<Map<String, String>>> mpToHp = new HashMap<>();

    int pos = 0;
    long total = Integer.MAX_VALUE;
    SolrQuery query = new SolrQuery("mp_id:*");
    query.addFilterQuery("type:mp_hp");// &amp;fl=hp_id,hp_term);
    query.add("fl=hp_id,hp_term");
    query.setRows(BATCH_SIZE);
    while (pos < total) {
        query.setStart(pos);
        QueryResponse response = null;
        response = phenodigm_core.query(query);
        total = response.getResults().getNumFound();
        SolrDocumentList solrDocs = response.getResults();
        for (SolrDocument doc : solrDocs) {
            if (doc.containsKey("hp_id")) {
                String hp = (String) doc.get("hp_id");
                if (doc.containsKey("mp_id")) {

                    String mp = (String) doc.get("mp_id");
                    List<Map<String, String>> mapList = new ArrayList<>();
                    Map<String, String> entryMap = new HashMap<>();
                    if (mpToHp.containsKey(mp)) {
                        mapList = mpToHp.get(mp);
                    }
                    entryMap.put("hp_id", hp);
                    if (doc.containsKey("hp_term")) {
                        String hpTerm = (String) doc.get("hp_term");
                        entryMap.put("hp_term", hpTerm);
                    }
                    mapList.add(entryMap);
                    mpToHp.put(mp, mapList);
                }
            }

        }
        pos += BATCH_SIZE;
    }

    return mpToHp;
}

From source file:org.mousephenotype.cda.solr.SolrUtils.java

License:Apache License

/**
 * Get a map of MpDTOs by key mgiAccesion
 *
 * @param mpSolrServer/*from ww  w  .ja v a 2s .  c o m*/
 * @return the map
 * @throws SolrServerException, IOException
 */
public static Map<String, List<MpDTO>> populateMgiAccessionToMp(SolrClient mpSolrServer)
        throws SolrServerException, IOException {

    Map<String, List<MpDTO>> mps = new HashMap<>();
    int pos = 0;
    long total = Integer.MAX_VALUE;
    SolrQuery query = new SolrQuery("mgi_accession_id:*");
    //query.add("fl=mp_id,mp_term,mp_definition,mp_term_synonym,ontology_subset,hp_id,hp_term,top_level_mp_id,top_level_mp_term,top_level_mp_term_synonym,intermediate_mp_id,intermediate_mp_term,intermediate_mp_term_synonym,child_mp_id,child_mp_term,child_mp_term_synonym,inferred_ma_id,inferred_ma_term,inferred_ma_term_synonym,inferred_selected_top_level_ma_id,inferred_selected_top_level_ma_term,inferred_selected_top_level_ma_term_synonym,inferred_child_ma_id,inferred_child_ma_term,inferred_child_ma_term_synonym");
    query.setRows(BATCH_SIZE);
    while (pos < total) {
        query.setStart(pos);
        QueryResponse response = null;
        response = mpSolrServer.query(query);
        total = response.getResults().getNumFound();
        List<MpDTO> mpBeans = response.getBeans(MpDTO.class);

        for (MpDTO mp : mpBeans) {
            if (mp.getMgiAccessionId() != null && !mp.getMgiAccessionId().equals("")) {
                for (String geneAccession : mp.getMgiAccessionId()) {

                    if (mps.containsKey(geneAccession)) {
                        mps.get(geneAccession).add(mp);
                    } else {
                        List<MpDTO> mpListPerGene = new ArrayList<>();
                        mpListPerGene.add(mp);
                        mps.put(geneAccession, mpListPerGene);
                    }
                }
            }
        }
        pos += BATCH_SIZE;
    }
    return mps;
}

From source file:org.obm.service.calendar.ContactService.java

License:Open Source License

public Set<Integer> searchContactIds(AccessToken token, String query, Collection<AddressBook> addrBooks,
        Integer limit, Integer offset) throws LocatorClientException {
    Set<Integer> contactIds = new HashSet<Integer>();

    if (addrBooks.size() > 0) {
        SolrHelper solrHelper = solrHelperFactory.createClient(token);
        CommonsHttpSolrServer solrServer = solrHelper.getSolrContact();
        StringBuilder sb = new StringBuilder();
        sb.append("-is:archive ");
        sb.append("+addressbookId:(");
        int idx = 0;
        for (AddressBook book : addrBooks) {
            if (idx > 0) {
                sb.append(" OR ");
            }/* w  ww .j  av  a  2s. c o  m*/
            sb.append(book.getUid());
            idx++;
        }
        sb.append(")");
        if (query != null && !"".equals(query)) {
            sb.append(" +(displayname:(");
            sb.append(query.toLowerCase());
            sb.append("*) OR firstname:(");
            sb.append(query.toLowerCase());
            sb.append("*) OR lastname:(");
            sb.append(query.toLowerCase());
            sb.append("*) OR email:(");
            sb.append(query.toLowerCase());
            sb.append("*))");
        }
        SolrQuery params = new SolrQuery();
        params.setQuery(sb.toString());
        params.setIncludeScore(true);
        params.setRows(limit);
        params.setStart(offset);

        try {
            QueryResponse resp = solrServer.query(params);

            SolrDocumentList results = resp.getResults();
            if (logger.isDebugEnabled()) {
                logger.debug(
                        "SOLR query time for " + results.size() + " results: " + resp.getElapsedTime() + "ms.");
            }

            for (int i = 0; i < limit && i < results.size(); i++) {
                SolrDocument doc = results.get(i);
                Map<String, Object> payload = doc.getFieldValueMap();
                contactIds.add((Integer) payload.get("id"));
            }
        } catch (SolrServerException e) {
            logger.error("Error querying server for '" + sb.toString() + " url: "
                    + ClientUtils.toQueryString(params, false), e);
        }
    }

    return contactIds;
}

From source file:org.ofbiz.solr.SolrProductSearch.java

License:Apache License

/**
 * Runs a query on the Solr Search Engine and returns the results.
 * <p>//from w ww . j  a v  a  2s. co  m
 * This function only returns an object of type QueryResponse, so it is probably not a good idea to call it directly from within the
 * groovy files (As a decent example on how to use it, however, use keywordSearch instead).
 */
public static Map<String, Object> runSolrQuery(DispatchContext dctx, Map<String, Object> context) {
    // get Connection
    HttpSolrServer server = null;
    Map<String, Object> result;

    Integer viewIndex = (Integer) context.get("viewIndex");
    Integer viewSize = (Integer) context.get("viewSize");
    if (viewIndex < 1) {
        viewIndex = 1;
    }
    try {
        server = new HttpSolrServer(SolrUtil.solrUrl);
        // create Query Object
        SolrQuery solrQuery = new SolrQuery();
        solrQuery.setQuery((String) context.get("query"));
        // solrQuery.setQueryType("dismax");
        boolean faceted = (Boolean) context.get("facet");
        if (faceted) {
            solrQuery.setFacet(faceted);
            //solrQuery.addFacetField("manu");
            solrQuery.addFacetField("features");
            solrQuery.addFacetField("cat");
            solrQuery.setFacetMinCount(1);
            solrQuery.setFacetLimit(8);

            solrQuery.addFacetQuery("listPrice:[0 TO 50]");
            solrQuery.addFacetQuery("listPrice:[50 TO 100]");
            solrQuery.addFacetQuery("listPrice:[100 TO 250]");
            solrQuery.addFacetQuery("listPrice:[250 TO 500]");
            solrQuery.addFacetQuery("listPrice:[500 TO 1000]");
            solrQuery.addFacetQuery("listPrice:[1000 TO 2500]");
            solrQuery.addFacetQuery("listPrice:[2500 TO 5000]");
            solrQuery.addFacetQuery("listPrice:[5000 TO 10000]");
            solrQuery.addFacetQuery("listPrice:[10000 TO 50000]");
            solrQuery.addFacetQuery("listPrice:[50000 TO *]");
        }

        boolean spellCheck = (Boolean) context.get("spellcheck");
        if (spellCheck) {
            solrQuery.setParam("spellcheck", spellCheck);
        }

        boolean highLight = (Boolean) context.get("highlight");
        if (highLight) {
            solrQuery.setHighlight(highLight);
            solrQuery.setHighlightSimplePre("<span class=\"highlight\">");
            solrQuery.addHighlightField("description");
            solrQuery.setHighlightSimplePost("</span>");
            solrQuery.setHighlightSnippets(2);
        }

        // Set additional Parameter
        // SolrQuery.ORDER order = SolrQuery.ORDER.desc;

        if (viewIndex != null && viewIndex > 0) {
            solrQuery.setStart((viewIndex - 1) * viewSize);
        }
        if (viewSize != null && viewSize > 0) {
            solrQuery.setRows(viewSize);
        }

        // if ((List) context.get("queryFilter") != null && ((ArrayList<SolrDocument>) context.get("queryFilter")).size() > 0) {
        // List filter = (List) context.get("queryFilter");
        // String[] tn = new String[filter.size()];
        // Iterator it = filter.iterator();
        // for (int i = 0; i < filter.size(); i++) {
        // tn[i] = (String) filter.get(i);
        // }
        // solrQuery.setFilterQueries(tn);
        // }
        String queryFilter = (String) context.get("queryFilter");
        if (UtilValidate.isNotEmpty(queryFilter))
            solrQuery.setFilterQueries(queryFilter.split(" "));
        if ((String) context.get("returnFields") != null) {
            solrQuery.setFields((String) context.get("returnFields"));
        }

        // if((Boolean)context.get("sortByReverse"))order.reverse();
        if ((String) context.get("sortBy") != null && ((String) context.get("sortBy")).length() > 0) {
            SolrQuery.ORDER order;
            if (!((Boolean) context.get("sortByReverse")))
                order = SolrQuery.ORDER.asc;
            else
                order = SolrQuery.ORDER.desc;
            solrQuery.setSort(((String) context.get("sortBy")).replaceFirst("-", ""), order);
        }

        if ((String) context.get("facetQuery") != null) {
            solrQuery.addFacetQuery((String) context.get("facetQuery"));
        }

        QueryResponse rsp = server.query(solrQuery);
        result = ServiceUtil.returnSuccess();
        result.put("queryResult", rsp);
    } catch (Exception e) {
        Debug.logError(e, e.getMessage(), module);
        result = ServiceUtil.returnError(e.toString());
    }
    return result;
}

From source file:org.ofbiz.solr.SolrUtil.java

License:Apache License

public static Map<String, Object> categoriesAvailable(String catalogId, String categoryId, String productId,
        String facetPrefix, boolean displayproducts, int viewIndex, int viewSize) {
    // create the data model
    Map<String, Object> result = FastMap.newInstance();
    HttpSolrServer server = null;//from   w w  w. j a v  a  2  s. c  o m
    QueryResponse returnMap = new QueryResponse();
    try {
        // do the basic query
        server = new HttpSolrServer(solrUrl);
        // create Query Object
        String query = "inStock[1 TO *]";
        if (categoryId != null)
            query += " +cat:" + categoryId;
        else if (productId != null)
            query += " +productId:" + productId;
        SolrQuery solrQuery = new SolrQuery();
        solrQuery.setQuery(query);

        if (catalogId != null)
            solrQuery.setFilterQueries("catalog:" + catalogId);
        if (displayproducts) {
            if (viewSize > -1) {
                solrQuery.setRows(viewSize);
            } else
                solrQuery.setRows(50000);
            if (viewIndex > -1) {
                solrQuery.setStart(viewIndex);
            }
        } else {
            solrQuery.setFields("cat");
            solrQuery.setRows(0);
        }

        if (UtilValidate.isNotEmpty(facetPrefix)) {
            solrQuery.setFacetPrefix(facetPrefix);
        }

        solrQuery.setFacetMinCount(0);
        solrQuery.setFacet(true);
        solrQuery.addFacetField("cat");
        solrQuery.setFacetLimit(-1);
        Debug.logVerbose("solr: solrQuery: " + solrQuery, module);
        returnMap = server.query(solrQuery, METHOD.POST);
        result.put("rows", returnMap);
        result.put("numFound", returnMap.getResults().getNumFound());
    } catch (Exception e) {
        Debug.logError(e.getMessage(), module);
    }
    return result;
}

From source file:org.opencastproject.archive.opencast.solr.SolrRequester.java

License:Educational Community License

/** Converts the query object into a solr query. */
// todo rewrite using solr DSL
private SolrQuery createQuery(OpencastQuery q) throws SolrServerException {
    final StringBuilder sb = new StringBuilder();
    append(sb, Schema.DC_ID, q.getMediaPackageId());

    // full text query with boost
    for (String solrTextRequest : q.getFullText()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append("(").append(createBoostedFullTextQuery(solrTextRequest)).append(")");
    }/* w ww .  ja v a  2 s.  co  m*/

    appendFuzzy(sb, Schema.DC_CREATOR_SUM, q.getDcCreator());
    appendFuzzy(sb, Schema.DC_CONTRIBUTOR_SUM, q.getDcContributor());
    append(sb, Schema.DC_LANGUAGE, q.getDcLanguage());
    appendFuzzy(sb, Schema.DC_LICENSE_SUM, q.getDcLicense());
    appendFuzzy(sb, Schema.DC_TITLE_SUM, q.getDcTitle());
    appendFuzzy(sb, Schema.S_DC_TITLE_SUM, q.getSeriesTitle());
    append(sb, Schema.DC_IS_PART_OF, q.getSeriesId());
    append(sb, Schema.OC_ORGANIZATION, q.getOrganizationId());

    if (q.getDeletedAfter().isSome() || q.getDeletedBefore().isSome()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append(Schema.OC_DELETED).append(":true AND ").append(Schema.OC_TIMESTAMP).append(":")
                .append(SolrUtils.serializeDateRange(q.getDeletedAfter(), q.getDeletedBefore()));
    }
    if (!q.isIncludeDeleted()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append(Schema.OC_DELETED + ":false");
    }

    if (q.isOnlyLastVersion()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append(Schema.OC_LATEST_VERSION + ":true");
    }

    if (q.getArchivedAfter().isSome() || q.getArchivedBefore().isSome()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append(Schema.OC_TIMESTAMP).append(":")
                .append(SolrUtils.serializeDateRange(q.getArchivedAfter(), q.getArchivedBefore()));
    }

    if (sb.length() == 0)
        sb.append("*:*");

    final SolrQuery solr = new SolrQuery(sb.toString());
    // limit & offset
    solr.setRows(q.getLimit().getOrElse(Integer.MAX_VALUE));
    solr.setStart(q.getOffset().getOrElse(0));

    // ordering
    for (OpencastQuery.Order o : q.getOrder()) {
        final SolrQuery.ORDER order = q.isOrderAscending() ? SolrQuery.ORDER.asc : SolrQuery.ORDER.desc;
        solr.addSortField(getSortField(o), order);
    }

    solr.setFields("* score");
    return solr;
}

From source file:org.opencastproject.episode.impl.solr.SolrRequester.java

License:Educational Community License

/**
 * Converts the query object into a solr query and returns the results.
 * /*  w ww  . ja va2 s.c o m*/
 * @param q
 *          the query
 * @return the search results
 */
private SolrQuery createQuery(EpisodeQuery q) throws SolrServerException {
    final StringBuilder sb = new StringBuilder();
    for (String solrQueryRequest : q.getQuery())
        sb.append(solrQueryRequest);
    append(sb, Schema.DC_ID, q.getId());

    // full text query with boost
    for (String solrTextRequest : q.getText()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append("(").append(createBoostedFullTextQuery(solrTextRequest)).append(")");
    }

    appendFuzzy(sb, Schema.DC_CREATOR_SUM, q.getCreator());
    appendFuzzy(sb, Schema.DC_CONTRIBUTOR_SUM, q.getContributor());
    append(sb, Schema.DC_LANGUAGE, q.getLanguage());
    appendFuzzy(sb, Schema.DC_LICENSE_SUM, q.getLicense());
    appendFuzzy(sb, Schema.DC_TITLE_SUM, q.getTitle());
    appendFuzzy(sb, Schema.S_DC_TITLE_SUM, q.getSeriesTitle());
    append(sb, Schema.DC_IS_PART_OF, q.getSeriesId());
    append(sb, Schema.OC_ORGANIZATION, q.getOrganization());

    if (q.getElementTags().size() > 0) {
        if (sb.length() > 0)
            sb.append(" AND ");
        StringBuilder tagBuilder = new StringBuilder();
        for (String tag : mlist(q.getElementTags()).bind(Options.<String>asList().o(SolrUtils.clean))) {
            if (tagBuilder.length() == 0) {
                tagBuilder.append("(");
            } else {
                tagBuilder.append(" OR ");
            }
            tagBuilder.append(Schema.OC_ELEMENTTAGS);
            tagBuilder.append(":");
            tagBuilder.append(SolrUtils.clean(tag));
        }
        if (tagBuilder.length() > 0) {
            tagBuilder.append(") ");
            sb.append(tagBuilder);
        }
    }
    if (q.getElementFlavors().size() > 0) {
        if (sb.length() > 0)
            sb.append(" AND ");
        StringBuilder flavorBuilder = new StringBuilder();
        for (String flavor : mlist(q.getElementFlavors()).bind(Options.<String>asList().o(SolrUtils.clean)
                .o(Strings.<MediaPackageElementFlavor>asStringNull()))) {
            if (flavorBuilder.length() == 0) {
                flavorBuilder.append("(");
            } else {
                flavorBuilder.append(" OR ");
            }
            flavorBuilder.append(Schema.OC_ELEMENTFLAVORS);
            flavorBuilder.append(":");
            flavorBuilder.append(ClientUtils.escapeQueryChars(flavor));
        }
        if (flavorBuilder.length() > 0) {
            flavorBuilder.append(") ");
            sb.append(flavorBuilder);
        }
    }
    for (Date deleted : q.getDeletedDate()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append(Schema.OC_DELETED).append(":")
                .append(SolrUtils.serializeDateRange(option(deleted), Option.<Date>none()));
    }
    if (!q.getIncludeDeleted()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append("-" + Schema.OC_DELETED + ":[* TO *]");
    }

    if (q.getOnlyLastVersion()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append(Schema.OC_LATEST_VERSION + ":true");
    }

    // only episodes
    if (sb.length() > 0)
        sb.append(" AND ");
    sb.append(Schema.OC_MEDIATYPE + ":" + SearchResultItem.SearchResultItemType.AudioVisual);

    // only add date range if at least on criteria is set
    if (q.getAddedBefore().isSome() || q.getAddedAfter().isSome()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append(Schema.OC_TIMESTAMP + ":[" + q.getAddedAfter().map(SolrUtils.serializeDate).getOrElse("*")
                + " TO " + q.getAddedBefore().map(SolrUtils.serializeDate).getOrElse("*") + "]");
    }

    if (sb.length() == 0)
        sb.append("*:*");

    final SolrQuery solr = new SolrQuery(sb.toString());
    // limit & offset
    solr.setRows(q.getLimit());
    solr.setStart(q.getOffset());

    // sorting
    final SolrQuery.ORDER order = q.getSortAscending() ? SolrQuery.ORDER.asc : SolrQuery.ORDER.desc;
    solr.addSortField(getSortField(q.getSort()), order);

    solr.setFields("* score");

    return solr;
}