package com.psddev.cms.db; import com.psddev.dari.db.CompoundPredicate; import com.psddev.dari.db.DatabaseEnvironment; import com.psddev.dari.db.ObjectField; import com.psddev.dari.db.ObjectIndex; import com.psddev.dari.db.ObjectType; import com.psddev.dari.db.Predicate; import com.psddev.dari.db.PredicateParser; import com.psddev.dari.db.Query; import com.psddev.dari.db.Record; import com.psddev.dari.db.Sorter; import com.psddev.dari.db.State; import com.psddev.dari.util.ObjectUtils; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.ListIterator; import java.util.Set; /** * @deprecated Use {@link Query} instead. */ @Deprecated public class ToolSearch extends Record { public static final String FIELD_PREFIX = "q."; public static final String OPERATOR_PREFIX = "qo."; private ObjectType queryType; private String sortFieldName; private transient List<ObjectField> indexedFields; private transient List<ObjectField> sortableFields; private transient ObjectField sortField; public ObjectType getQueryType() { return queryType != null ? ObjectType.getInstance(queryType.getId()) : null; } public void setQueryType(ObjectType queryType) { this.queryType = queryType; this.indexedFields = null; this.sortableFields = null; } public String getSortFieldName() { return sortFieldName; } public void setSortFieldName(String sortFieldName) { this.sortFieldName = sortFieldName; this.sortField = null; } public List<ObjectField> getIndexedFields() { if (indexedFields == null) { ObjectType type = getQueryType(); Set<String> indexedFieldNames = new HashSet<String>(); List<ObjectField> newIndexedFields = new ArrayList<ObjectField>(); for (ObjectIndex index : type.getIndexes()) { List<String> fields = index.getFields(); if (fields != null) { indexedFieldNames.addAll(fields); } } for (ObjectField field : type.getFields()) { if (indexedFieldNames.contains(field.getInternalName())) { newIndexedFields.add(field); } } indexedFields = newIndexedFields; } return indexedFields; } public List<ObjectField> getSortableFields() { if (sortableFields == null) { List<ObjectField> newSortableFields = new ArrayList<ObjectField>(); DatabaseEnvironment environment = getQueryType().getState().getDatabase().getEnvironment(); newSortableFields.add(environment.getField("cms.content.publishDate")); newSortableFields.add(environment.getField("cms.content.updateDate")); for (ObjectField field : getIndexedFields()) { if (!field.isInternalCollectionType()) { newSortableFields.add(field); } } sortableFields = newSortableFields; } return sortableFields; } public ObjectField getSortField() { if (sortField == null) { ObjectType type = getQueryType(); ObjectField newSortField = null; for (ObjectField field : getSortableFields()) { if (field.getInternalName().equals(getSortFieldName())) { newSortField = field; break; } } if (newSortField == null) { LABEL_FIELD: for (String labelField : type.getLabelFields()) { for (ObjectField field : getSortableFields()) { if (field.getInternalName().equals(labelField)) { newSortField = field; break LABEL_FIELD; } } } } if (newSortField == null) { newSortField = type.getState().getDatabase().getEnvironment().getField("cms.content.publishDate"); } sortField = newSortField; } return sortField; } public Query<?> toQuery() { State state = getState(); Query<?> query = Query.fromType(getQueryType()); Predicate predicate = query.getPredicate(); for (ObjectField field : getIndexedFields()) { String name = field.getInternalName(); Object value = state.get(FIELD_PREFIX + name); if (!ObjectUtils.isBlank(value)) { String type = field.getInternalItemType(); String operator = (String) state.get(OPERATOR_PREFIX + name); if (operator == null) { operator = ObjectField.REFERENTIAL_TEXT_TYPE.equals(type) || ObjectField.TEXT_TYPE.equals(type) ? "matchesAll" : "equalsAny"; } predicate = CompoundPredicate.combine( PredicateParser.AND_OPERATOR, predicate, PredicateParser.Static.parse(name + " " + operator + " ?", value)); } } query.setPredicate(predicate); ObjectField sortField = getSortField(); if (ObjectField.DATE_TYPE.equals(sortField.getInternalItemType())) { query.sortDescending(sortField.getInternalName()); } else { query.sortAscending(sortField.getInternalName()); } return query; } public Query<?> toPreviousQuery(State state) { String sortFieldName = getSortFieldName(); Query<?> query = toQuery().and(sortFieldName + " <= ? and _id != ?", state.get(sortFieldName), state.getId()); for (ListIterator<Sorter> i = query.getSorters().listIterator(); i.hasNext();) { Sorter sorter = i.next(); if (Sorter.ASCENDING_OPERATOR.equals(sorter.getOperator())) { List<Object> options = sorter.getOptions(); if (options != null && options.size() > 0 && sortFieldName.equals(options.get(0))) { i.set(new Sorter(Sorter.DESCENDING_OPERATOR, options)); } } } return query; } public Query<?> toNextQuery(State state) { String sortFieldName = getSortFieldName(); return toQuery().and(sortFieldName + " >= ? and _id != ?", state.get(sortFieldName), state.getId()); } }