Package com.psddev.cms.db

Source Code of com.psddev.cms.db.ToolSearch

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;

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());
    }
}
TOP

Related Classes of com.psddev.cms.db.ToolSearch

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.