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;
}
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;
}
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;
}
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;
}
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));
}
}
}
}
Aggregations