de.hybris.platform.accountsummaryaddon.document.dao.impl.DefaultPagedB2BDocumentDao.java Source code

Java tutorial

Introduction

Here is the source code for de.hybris.platform.accountsummaryaddon.document.dao.impl.DefaultPagedB2BDocumentDao.java

Source

/*
 * [y] hybris Platform
 *
 * Copyright (c) 2000-2014 hybris AG
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of hybris
 * ("Confidential Information"). You shall not disclose such Confidential
 * Information and shall use it only in accordance with the terms of the
 * license agreement you entered into with hybris.
 *
 *  
 */
package de.hybris.platform.accountsummaryaddon.document.dao.impl;

import de.hybris.platform.b2b.model.B2BUnitModel;
import de.hybris.platform.commerceservices.search.dao.impl.DefaultPagedGenericDao;
import de.hybris.platform.commerceservices.search.pagedata.SearchPageData;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import de.hybris.platform.accountsummaryaddon.document.AccountSummaryDocumentQuery;
import de.hybris.platform.accountsummaryaddon.document.Range;
import de.hybris.platform.accountsummaryaddon.document.dao.PagedB2BDocumentDao;
import de.hybris.platform.accountsummaryaddon.model.B2BDocumentModel;
import de.hybris.platform.accountsummaryaddon.model.B2BDocumentTypeModel;

public class DefaultPagedB2BDocumentDao extends DefaultPagedGenericDao<B2BDocumentModel>
        implements PagedB2BDocumentDao {

    private static final String ORDER_BY_STATEMENT = " ORDER BY ";
    private static final String AND_STATEMENT = " AND ";
    private static final String WHERE_STATEMENT = " WHERE ";

    private static final String FIND_DOCUMENT = "SELECT {" + B2BDocumentModel._TYPECODE + ":" + B2BDocumentModel.PK
            + "}  FROM { " + B2BDocumentModel._TYPECODE + " as " + B2BDocumentModel._TYPECODE + " join "
            + B2BDocumentTypeModel._TYPECODE + " as " + B2BDocumentTypeModel._TYPECODE + " on {"
            + B2BDocumentModel._TYPECODE + ":" + B2BDocumentModel.DOCUMENTTYPE + "} = {"
            + B2BDocumentTypeModel._TYPECODE + ":" + B2BDocumentTypeModel.PK + "} join " + B2BUnitModel._TYPECODE
            + " as " + B2BUnitModel._TYPECODE + " on {" + B2BDocumentModel._TYPECODE + ":" + B2BDocumentModel.UNIT
            + "} = {" + B2BUnitModel._TYPECODE + ":" + B2BUnitModel.PK + "} }  ";

    public DefaultPagedB2BDocumentDao() {
        super(B2BDocumentModel._TYPECODE);
    }

    @Override
    public SearchPageData<B2BDocumentModel> findDocuments(final AccountSummaryDocumentQuery query) {
        final Map<String, Object> mapCriteria = createMapCriteria(query.getSearchCriteria());

        return getPagedFlexibleSearchService().search(createQuery(query, mapCriteria), mapCriteria,
                query.getPageableData());
    }

    protected Map<String, Object> createMapCriteria(final Map<String, Object> searchCriteria) {
        final Map<String, Object> mapCriteria = new HashMap<String, Object>();

        for (final String key : searchCriteria.keySet()) {
            if (searchCriteria.get(key) instanceof Range) {
                final Range range = (Range) searchCriteria.get(key);
                mapCriteria.put(key + "_min", range.getMinBoundary());
                mapCriteria.put(key + "_max", range.getMaxBoundary());
            } else {
                mapCriteria.put(key, searchCriteria.get(key));
            }
        }

        return mapCriteria;
    }

    protected String createQuery(final AccountSummaryDocumentQuery query, final Map<String, Object> mapCriteria) {
        final StringBuffer queryBuff = new StringBuffer();
        queryBuff.append(FIND_DOCUMENT);

        queryBuff.append(getWhereStatement(mapCriteria));

        queryBuff.append(getOrderStatement(query.getPageableData().getSort(), query.isAsc()));

        return queryBuff.toString();
    }

    protected String getWhereStatement(final Map<String, Object> criteria) {
        final StringBuffer whereStatement = new StringBuffer();
        whereStatement.append(documentTypeDisplayInAllListFilter(criteria));

        if (criteria != null && !criteria.isEmpty()) {
            if (StringUtils.isBlank(whereStatement.toString())) {
                whereStatement.append(WHERE_STATEMENT);
            } else {
                whereStatement.append(AND_STATEMENT);
            }

            final String[] criteriaNames = criteria.keySet().toArray(new String[0]);
            for (int i = 0; i < criteriaNames.length; i++) {
                if (StringUtils.endsWith(criteriaNames[i], "_min")) {
                    whereStatement.append(formatField(criteriaNames[i]) + " >= ?" + criteriaNames[i]);
                } else if (StringUtils.endsWith(criteriaNames[i], "_max")) {
                    whereStatement.append(formatField(criteriaNames[i]) + " <= ?" + criteriaNames[i]);
                } else if (StringUtils.equalsIgnoreCase(B2BDocumentModel.UNIT, criteriaNames[i])) {
                    whereStatement.append(formatField(criteriaNames[i]) + " = ?" + criteriaNames[i]);
                } else if (criteria.get(criteriaNames[i]) instanceof List<?>) {
                    whereStatement.append(formatField(criteriaNames[i]) + " IN (?" + criteriaNames[i] + ")");
                } else {
                    whereStatement.append(formatField(criteriaNames[i]) + " like ?" + criteriaNames[i]);
                }

                if (i + 1 < criteriaNames.length) {
                    whereStatement.append(AND_STATEMENT);
                }
            }
        }
        return whereStatement.toString();
    }

    protected String documentTypeDisplayInAllListFilter(final Map<String, Object> criteria) {
        final StringBuffer whereStatement = new StringBuffer();

        // If the document type of one document is set to displayInAllList=false, this document can show up in result list
        // only when search by document type or number
        //
        // for example: for document "statement" STA-001, it is set to displayInAllList=false the "statement" documents
        // show up in the result list only when user searches by document type = "statement" or document#="STA-001"
        if (criteria == null || criteria.isEmpty() || (!criteria.containsKey(B2BDocumentModel.DOCUMENTTYPE)
                && !criteria.containsKey(B2BDocumentModel.DOCUMENTNUMBER))) {
            whereStatement.append(WHERE_STATEMENT);
            whereStatement.append("{" + B2BDocumentTypeModel._TYPECODE + ":" + B2BDocumentTypeModel.DISPLAYINALLLIST
                    + " } = true ");
        }

        return whereStatement.toString();
    }

    protected String getOrderStatement(final String sortField, final boolean isAsc) {
        return ORDER_BY_STATEMENT + formatField(sortField) + (isAsc ? " ASC " : " DESC ");
    }

    protected String formatField(final String fieldName) {
        if (StringUtils.equalsIgnoreCase(B2BDocumentModel.DOCUMENTTYPE, fieldName)) {
            return " {" + B2BDocumentTypeModel._TYPECODE + ":" + B2BDocumentTypeModel.CODE + " } ";
        } else if (StringUtils.equalsIgnoreCase(B2BDocumentModel.UNIT, fieldName)) {
            return " {" + B2BUnitModel._TYPECODE + ":" + B2BUnitModel.UID + " } ";
        } else {
            return " {" + B2BDocumentModel._TYPECODE + ":" + getFiedName(fieldName) + "} ";
        }
    }

    protected String getFiedName(final String fieldName) {
        if (StringUtils.endsWith(fieldName, "_max") || StringUtils.endsWith(fieldName, "_min")) {
            return StringUtils.substringBefore(fieldName, "_");
        }
        return fieldName;
    }
}