use of org.broadleafcommerce.core.search.domain.IndexFieldType 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));
}
}
}
}
use of org.broadleafcommerce.core.search.domain.IndexFieldType in project BroadleafCommerce by BroadleafCommerce.
the class IndexFieldDaoImpl method getIndexFieldTypes.
@Override
public List<IndexFieldType> getIndexFieldTypes(FieldType facetFieldType) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<IndexFieldType> criteria = builder.createQuery(IndexFieldType.class);
Root<IndexFieldTypeImpl> root = criteria.from(IndexFieldTypeImpl.class);
criteria.select(root);
criteria.where(builder.equal(root.get("fieldType").as(String.class), facetFieldType.getType()));
TypedQuery<IndexFieldType> query = em.createQuery(criteria);
query.setHint(QueryHints.HINT_CACHEABLE, true);
query.setHint(QueryHints.HINT_CACHE_REGION, "query.Search");
return query.getResultList();
}
use of org.broadleafcommerce.core.search.domain.IndexFieldType in project BroadleafCommerce by BroadleafCommerce.
the class IndexFieldDaoImpl method getIndexFieldTypesByAbbreviationOrPropertyName.
@Override
public List<IndexFieldType> getIndexFieldTypesByAbbreviationOrPropertyName(String name) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<IndexFieldType> criteria = builder.createQuery(IndexFieldType.class);
Root<IndexFieldTypeImpl> root = criteria.from(IndexFieldTypeImpl.class);
criteria.select(root);
List<Predicate> restrictions = new ArrayList<>();
restrictions.add(builder.or(builder.equal(root.get("indexField").get("field").get("abbreviation").as(String.class), name), builder.equal(root.get("indexField").get("field").get("propertyName").as(String.class), name)));
restrictions.add(builder.or(builder.isNull(root.get("archiveStatus").get("archived")), builder.equal(root.get("archiveStatus").get("archived"), 'N')));
criteria.where(restrictions.toArray(new Predicate[restrictions.size()]));
TypedQuery<IndexFieldType> query = em.createQuery(criteria);
query.setHint(QueryHints.HINT_CACHEABLE, true);
query.setHint(QueryHints.HINT_CACHE_REGION, "query.Catalog");
return query.getResultList();
}
Aggregations