Search in sources :

Example 1 with ORDER

use of org.apache.solr.client.solrj.SolrQuery.ORDER in project BroadleafCommerce by BroadleafCommerce.

the class SolrHelperServiceImpl method getSortOrder.

protected ORDER getSortOrder(String[] sortFieldsSegments, String sortQuery) {
    ORDER order = ORDER.asc;
    if (sortFieldsSegments.length < 2) {
        StringBuilder msg = new StringBuilder().append("Solr sortquery received was " + StringUtil.sanitize(sortQuery) + ", but no sorting tokens could be extracted.");
        msg.append("\nDefaulting to ASCending");
        LOG.warn(msg.toString());
    } else if ("desc".equals(sortFieldsSegments[1])) {
        order = ORDER.desc;
    }
    return order;
}
Also used : ORDER(org.apache.solr.client.solrj.SolrQuery.ORDER)

Example 2 with ORDER

use of org.apache.solr.client.solrj.SolrQuery.ORDER in project nextprot-api by calipho-sib.

the class SolrServiceImpl method buildSolrQuery.

/**
 * Builds a SOLR Query according to the specified index configuration
 *
 * @param query
 * @param indexConfig
 * @return
 */
private SolrQuery buildSolrQuery(Query query, IndexConfiguration indexConfig) throws SearchQueryException {
    SolrQuery solrQuery = new SolrQuery();
    String queryString = indexConfig.buildQuery(query);
    String filter = query.getFilter();
    if (filter != null)
        queryString += " AND filters:" + filter;
    solrQuery.setQuery(queryString);
    solrQuery.setStart(query.getStart());
    solrQuery.setRows(query.getRows());
    solrQuery.setFields(indexConfig.getParameterQuery(IndexParameter.FL));
    solrQuery.set(IndexParameter.FL.name().toLowerCase(), indexConfig.getParameterQuery(IndexParameter.FL));
    solrQuery.set(IndexParameter.QF.name().toLowerCase(), indexConfig.getParameterQuery(IndexParameter.QF));
    solrQuery.set(IndexParameter.PF.name().toLowerCase(), indexConfig.getParameterQuery(IndexParameter.PF));
    solrQuery.set(IndexParameter.FN.name().toLowerCase(), indexConfig.getParameterQuery(IndexParameter.FN));
    solrQuery.set(IndexParameter.HI.name().toLowerCase(), indexConfig.getParameterQuery(IndexParameter.HI));
    Map<String, String> otherParameters = indexConfig.getOtherParameters();
    if (otherParameters != null)
        for (Entry<String, String> e : otherParameters.entrySet()) solrQuery.set(e.getKey(), e.getValue());
    String sortName = query.getSort();
    SortConfig sortConfig = null;
    if (sortName != null) {
        sortConfig = indexConfig.getSortConfig(sortName);
        if (sortConfig == null)
            throw new SearchQueryException("sort " + sortName + " does not exist");
    } else
        sortConfig = indexConfig.getDefaultSortConfiguration();
    if (query.getOrder() != null) {
        for (Pair<IndexField, ORDER> s : sortConfig.getSorting()) solrQuery.addSort(s.getFirst().getName(), query.getOrder());
    } else {
        for (Pair<IndexField, ORDER> s : sortConfig.getSorting()) solrQuery.addSort(s.getFirst().getName(), s.getSecond());
    }
    if (sortConfig.getBoost() != -1) {
        solrQuery.set("boost", "sum(1.0,product(div(log(informational_score),6.0),div(" + sortConfig.getBoost() + ",100.0)))");
    }
    return solrQuery;
}
Also used : ORDER(org.apache.solr.client.solrj.SolrQuery.ORDER) Entry(java.util.Map.Entry) SearchQueryException(org.nextprot.api.commons.exception.SearchQueryException) SolrQuery(org.apache.solr.client.solrj.SolrQuery)

Example 3 with ORDER

use of org.apache.solr.client.solrj.SolrQuery.ORDER in project opencast by opencast.

the class SolrRequester method getForAction.

/**
 * Converts the query object into a solr query and returns the results.
 *
 * @param q
 *          the query
 * @param action
 *          one of {@link org.opencastproject.search.api.SearchService#READ_PERMISSION},
 *          {@link org.opencastproject.search.api.SearchService#WRITE_PERMISSION}
 * @param applyPermissions
 *          whether to apply the permissions to the query. Set to false for administrative queries.
 * @return the search results
 */
private SolrQuery getForAction(SearchQuery q, String action, boolean applyPermissions) throws SolrServerException {
    StringBuilder sb = new StringBuilder();
    if (StringUtils.isNotBlank(q.getQuery()))
        sb.append(q.getQuery());
    String solrIdRequest = StringUtils.trimToNull(q.getId());
    if (solrIdRequest != null) {
        String cleanSolrIdRequest = SolrUtils.clean(solrIdRequest);
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append("(");
        sb.append(Schema.ID);
        sb.append(":");
        sb.append(cleanSolrIdRequest);
        if (q.isIncludeEpisodes() && q.isIncludeSeries()) {
            sb.append(" OR ");
            sb.append(Schema.DC_IS_PART_OF);
            sb.append(":");
            sb.append(cleanSolrIdRequest);
        }
        sb.append(")");
    }
    String solrSeriesIdRequest = StringUtils.trimToNull(q.getSeriesId());
    if (solrSeriesIdRequest != null) {
        String cleanSolrSeriesIdRequest = SolrUtils.clean(solrSeriesIdRequest);
        if (sb.length() > 0) {
            sb.append(" AND ");
        }
        sb.append("(");
        sb.append(Schema.DC_IS_PART_OF);
        sb.append(":");
        sb.append(cleanSolrSeriesIdRequest);
        sb.append(")");
    }
    String solrTextRequest = StringUtils.trimToNull(q.getText());
    if (solrTextRequest != null) {
        String cleanSolrTextRequest = SolrUtils.clean(q.getText());
        if (StringUtils.isNotEmpty(cleanSolrTextRequest)) {
            if (sb.length() > 0)
                sb.append(" AND ");
            sb.append("( *:");
            sb.append(boost(cleanSolrTextRequest));
            sb.append(" OR (");
            sb.append(Schema.ID);
            sb.append(":");
            sb.append(cleanSolrTextRequest);
            sb.append(") )");
        }
    }
    if (q.getElementTags() != null && q.getElementTags().length > 0) {
        if (sb.length() > 0)
            sb.append(" AND ");
        StringBuilder tagBuilder = new StringBuilder();
        for (int i = 0; i < q.getElementTags().length; i++) {
            String tag = SolrUtils.clean(q.getElementTags()[i]);
            if (StringUtils.isEmpty(tag))
                continue;
            if (tagBuilder.length() == 0) {
                tagBuilder.append("(");
            } else {
                tagBuilder.append(" OR ");
            }
            tagBuilder.append(Schema.OC_ELEMENTTAGS);
            tagBuilder.append(":");
            tagBuilder.append(tag);
        }
        if (tagBuilder.length() > 0) {
            tagBuilder.append(") ");
            sb.append(tagBuilder);
        }
    }
    if (q.getElementFlavors() != null && q.getElementFlavors().length > 0) {
        if (sb.length() > 0)
            sb.append(" AND ");
        StringBuilder flavorBuilder = new StringBuilder();
        for (int i = 0; i < q.getElementFlavors().length; i++) {
            String flavor = SolrUtils.clean(q.getElementFlavors()[i].toString());
            if (StringUtils.isEmpty(flavor))
                continue;
            if (flavorBuilder.length() == 0) {
                flavorBuilder.append("(");
            } else {
                flavorBuilder.append(" OR ");
            }
            flavorBuilder.append(Schema.OC_ELEMENTFLAVORS);
            flavorBuilder.append(":");
            flavorBuilder.append(flavor);
        }
        if (flavorBuilder.length() > 0) {
            flavorBuilder.append(") ");
            sb.append(flavorBuilder);
        }
    }
    if (q.getDeletedDate() != null) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append(Schema.OC_DELETED + ":" + SolrUtils.serializeDateRange(option(q.getDeletedDate()), Option.<Date>none()));
    }
    if (sb.length() == 0)
        sb.append("*:*");
    if (applyPermissions) {
        sb.append(" AND ").append(Schema.OC_ORGANIZATION).append(":").append(SolrUtils.clean(securityService.getOrganization().getId()));
        User user = securityService.getUser();
        Set<Role> roles = user.getRoles();
        boolean userHasAnonymousRole = false;
        if (roles.size() > 0) {
            sb.append(" AND (");
            StringBuilder roleList = new StringBuilder();
            for (Role role : roles) {
                if (roleList.length() > 0)
                    roleList.append(" OR ");
                roleList.append(Schema.OC_ACL_PREFIX).append(action).append(":").append(SolrUtils.clean(role.getName()));
                if (role.getName().equalsIgnoreCase(securityService.getOrganization().getAnonymousRole())) {
                    userHasAnonymousRole = true;
                }
            }
            if (!userHasAnonymousRole) {
                if (roleList.length() > 0)
                    roleList.append(" OR ");
                roleList.append(Schema.OC_ACL_PREFIX).append(action).append(":").append(SolrUtils.clean(securityService.getOrganization().getAnonymousRole()));
            }
            sb.append(roleList.toString());
            sb.append(")");
        }
    }
    if (!q.isIncludeEpisodes()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append("-" + Schema.OC_MEDIATYPE + ":" + SearchResultItemType.AudioVisual);
    }
    if (!q.isIncludeSeries()) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append("-" + Schema.OC_MEDIATYPE + ":" + SearchResultItemType.Series);
    }
    if (q.getDeletedDate() == null) {
        if (sb.length() > 0)
            sb.append(" AND ");
        sb.append("-" + Schema.OC_DELETED + ":[* TO *]");
    }
    SolrQuery query = new SolrQuery(sb.toString());
    if (q.getLimit() > 0) {
        query.setRows(q.getLimit());
    } else {
        query.setRows(Integer.MAX_VALUE);
    }
    if (q.getOffset() > 0)
        query.setStart(q.getOffset());
    if (q.getSort() != null) {
        ORDER order = q.isSortAscending() ? ORDER.asc : ORDER.desc;
        query.addSortField(getSortField(q.getSort()), order);
    }
    if (!SearchQuery.Sort.DATE_CREATED.equals(q.getSort())) {
        query.addSortField(getSortField(SearchQuery.Sort.DATE_CREATED), ORDER.desc);
    }
    query.setFields("* score");
    return query;
}
Also used : Role(org.opencastproject.security.api.Role) ORDER(org.apache.solr.client.solrj.SolrQuery.ORDER) User(org.opencastproject.security.api.User) SolrQuery(org.apache.solr.client.solrj.SolrQuery)

Example 4 with ORDER

use of org.apache.solr.client.solrj.SolrQuery.ORDER in project opencast by opencast.

the class WorkflowServiceSolrIndex method getWorkflowInstances.

/**
 * {@inheritDoc}
 *
 * @see org.opencastproject.workflow.impl.WorkflowServiceIndex#getWorkflowInstances(org.opencastproject.workflow.api.WorkflowQuery,
 *      String, boolean)
 */
@Override
public WorkflowSet getWorkflowInstances(WorkflowQuery query, String action, boolean applyPermissions) throws WorkflowDatabaseException {
    // default to 20 items if not specified
    int count = query.getCount() > 0 ? (int) query.getCount() : 20;
    int startIndex = query.getStartPage() > 0 ? (int) query.getStartPage() * count : (int) query.getStartIndex();
    SolrQuery solrQuery = new SolrQuery();
    solrQuery.setRows(count);
    solrQuery.setStart(startIndex);
    String solrQueryString = createQuery(query, action, applyPermissions);
    solrQuery.setQuery(solrQueryString);
    if (query.getSort() != null) {
        ORDER order = query.isSortAscending() ? ORDER.asc : ORDER.desc;
        solrQuery.addSortField(getSortField(query.getSort()) + "_sort", order);
    }
    if (!Sort.DATE_CREATED.equals(query.getSort())) {
        solrQuery.addSortField(getSortField(Sort.DATE_CREATED) + "_sort", ORDER.desc);
    }
    long totalHits;
    long time = System.currentTimeMillis();
    WorkflowSetImpl set = null;
    try {
        QueryResponse response = solrServer.query(solrQuery);
        SolrDocumentList items = response.getResults();
        long searchTime = System.currentTimeMillis() - time;
        totalHits = items.getNumFound();
        set = new WorkflowSetImpl();
        set.setPageSize(count);
        set.setTotalCount(totalHits);
        set.setStartPage(query.getStartPage());
        set.setSearchTime(searchTime);
        // Iterate through the results
        for (SolrDocument doc : items) {
            String xml = (String) doc.get(XML_KEY);
            try {
                set.addItem(WorkflowParser.parseWorkflowInstance(xml));
            } catch (Exception e) {
                throw new IllegalStateException("can not parse workflow xml", e);
            }
        }
    } catch (Exception e) {
        throw new WorkflowDatabaseException(e);
    }
    long totalTime = System.currentTimeMillis() - time;
    logger.debug("Workflow query took {} ms", totalTime);
    return set;
}
Also used : ORDER(org.apache.solr.client.solrj.SolrQuery.ORDER) WorkflowDatabaseException(org.opencastproject.workflow.api.WorkflowDatabaseException) SolrDocument(org.apache.solr.common.SolrDocument) QueryResponse(org.apache.solr.client.solrj.response.QueryResponse) WorkflowSetImpl(org.opencastproject.workflow.api.WorkflowSetImpl) SolrDocumentList(org.apache.solr.common.SolrDocumentList) SolrQuery(org.apache.solr.client.solrj.SolrQuery) ServiceException(org.osgi.framework.ServiceException) SolrServerException(org.apache.solr.client.solrj.SolrServerException) ServiceRegistryException(org.opencastproject.serviceregistry.api.ServiceRegistryException) WorkflowException(org.opencastproject.workflow.api.WorkflowException) WorkflowParsingException(org.opencastproject.workflow.api.WorkflowParsingException) NotFoundException(org.opencastproject.util.NotFoundException) MalformedURLException(java.net.MalformedURLException) WorkflowDatabaseException(org.opencastproject.workflow.api.WorkflowDatabaseException) IOException(java.io.IOException)

Example 5 with ORDER

use of org.apache.solr.client.solrj.SolrQuery.ORDER in project BroadleafCommerce by BroadleafCommerce.

the class SolrHelperServiceImpl method attachSortClause.

@Override
public void attachSortClause(SolrQuery query, SearchCriteria searchCriteria, String defaultSort) {
    String sortQuery = searchCriteria.getSortQuery();
    if (StringUtils.isBlank(sortQuery)) {
        sortQuery = defaultSort;
    }
    if (StringUtils.isNotBlank(sortQuery)) {
        String[] sortFields = sortQuery.split(",");
        List<String> sortableFieldTypes = getSortableFieldTypes();
        for (String sortField : sortFields) {
            String[] sortFieldsSegments = sortField.split(" ");
            String requestedSortFieldName = sortFieldsSegments[0];
            ORDER order = getSortOrder(sortFieldsSegments, sortQuery);
            ExtensionResultStatusType result = searchExtensionManager.getProxy().attachSortField(query, requestedSortFieldName, order);
            if (!ExtensionResultStatusType.NOT_HANDLED.equals(result)) {
                // if an index field was not found, or the extension handler handled attaching the sort field, move to the next field
                continue;
            }
            List<IndexFieldType> fieldTypes = indexFieldDao.getIndexFieldTypesByAbbreviation(requestedSortFieldName);
            // Used to determine if, by looping through the index field types managed in the database, we actually
            // attach the sort field that is being requested. If we do, then we shouldn't manually add the requested
            // sort field ourselves but if not, we should
            boolean requestedSortFieldAdded = false;
            // and some not  give a preference to NOT tokenized fields, and remove tokenized.
            // In case you have tokenized only just add them all
            List<SortClause> sortClauses = new ArrayList<>();
            boolean foundNotTokenizedField = false;
            // this sorts by them all
            for (IndexFieldType fieldType : fieldTypes) {
                String field = getPropertyNameForIndexField(fieldType.getIndexField(), fieldType.getFieldType());
                // be checked
                if (fieldType.getIndexField().getField().getAbbreviation().equals(requestedSortFieldName)) {
                    requestedSortFieldAdded = true;
                }
                SortClause sortClause = new SortClause(field, order);
                if (sortableFieldTypes.contains(fieldType.getFieldType().getType())) {
                    if (!sortClauses.isEmpty() && !foundNotTokenizedField) {
                        sortClauses.clear();
                    }
                    sortClauses.add(sortClause);
                    foundNotTokenizedField = true;
                } else if (!foundNotTokenizedField) {
                    sortClauses.add(sortClause);
                }
            }
            if (!foundNotTokenizedField) {
                LOG.warn(String.format("Sorting on a tokenized field, this could have adverse effects on the ordering of results. " + "Add a field type for this field from the following list to ensure proper result ordering: [%s]", StringUtils.join(sortableFieldTypes, ", ")));
            }
            if (!sortClauses.isEmpty()) {
                for (SortClause sortClause : sortClauses) {
                    query.addSort(sortClause);
                }
            }
            // field anyway since we're trusting that the field was actually added to the index by some programmatic means
            if (!requestedSortFieldAdded) {
                query.addSort(new SortClause(requestedSortFieldName, order));
            }
        }
    }
}
Also used : ORDER(org.apache.solr.client.solrj.SolrQuery.ORDER) IndexFieldType(org.broadleafcommerce.core.search.domain.IndexFieldType) SortClause(org.apache.solr.client.solrj.SolrQuery.SortClause) ArrayList(java.util.ArrayList) ExtensionResultStatusType(org.broadleafcommerce.common.extension.ExtensionResultStatusType)

Aggregations

ORDER (org.apache.solr.client.solrj.SolrQuery.ORDER)6 SolrQuery (org.apache.solr.client.solrj.SolrQuery)3 IOException (java.io.IOException)1 MalformedURLException (java.net.MalformedURLException)1 ArrayList (java.util.ArrayList)1 Entry (java.util.Map.Entry)1 SortField (org.apache.ranger.common.SortField)1 SortClause (org.apache.solr.client.solrj.SolrQuery.SortClause)1 SolrServerException (org.apache.solr.client.solrj.SolrServerException)1 QueryResponse (org.apache.solr.client.solrj.response.QueryResponse)1 SolrDocument (org.apache.solr.common.SolrDocument)1 SolrDocumentList (org.apache.solr.common.SolrDocumentList)1 ExtensionResultStatusType (org.broadleafcommerce.common.extension.ExtensionResultStatusType)1 IndexFieldType (org.broadleafcommerce.core.search.domain.IndexFieldType)1 SearchQueryException (org.nextprot.api.commons.exception.SearchQueryException)1 Role (org.opencastproject.security.api.Role)1 User (org.opencastproject.security.api.User)1 ServiceRegistryException (org.opencastproject.serviceregistry.api.ServiceRegistryException)1 NotFoundException (org.opencastproject.util.NotFoundException)1 WorkflowDatabaseException (org.opencastproject.workflow.api.WorkflowDatabaseException)1