com.liferay.portlet.asset.service.persistence.AssetEntryFinderImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portlet.asset.service.persistence.AssetEntryFinderImpl.java

Source

/**
 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.portlet.asset.service.persistence;

import com.liferay.portal.kernel.dao.orm.QueryPos;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.dao.orm.SQLQuery;
import com.liferay.portal.kernel.dao.orm.Session;
import com.liferay.portal.kernel.dao.orm.Type;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.CalendarUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.Layout;
import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;
import com.liferay.portal.util.PropsValues;
import com.liferay.portlet.asset.model.AssetEntry;
import com.liferay.portlet.asset.model.impl.AssetEntryImpl;
import com.liferay.util.dao.orm.CustomSQLUtil;

import java.sql.Timestamp;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * @author Brian Wing Shun Chan
 * @author Jorge Ferrer
 */
public class AssetEntryFinderImpl extends BasePersistenceImpl<AssetEntry> implements AssetEntryFinder {

    public static String FIND_BY_AND_CATEGORY_IDS = AssetEntryFinder.class.getName() + ".findByAndCategoryIds";

    public static String FIND_BY_AND_CATEGORY_IDS_TREE = AssetEntryFinder.class.getName()
            + ".findByAndCategoryIdsTree";

    public static String FIND_BY_AND_TAG_IDS = AssetEntryFinder.class.getName() + ".findByAndTagIds";

    public int countEntries(AssetEntryQuery entryQuery) throws SystemException {
        Session session = null;

        try {
            session = openSession();

            SQLQuery q = buildAssetQuerySQL(entryQuery, true, session);

            Iterator<Long> itr = q.iterate();

            if (itr.hasNext()) {
                Long count = itr.next();

                if (count != null) {
                    return count.intValue();
                }
            }

            return 0;
        } catch (Exception e) {
            throw new SystemException(e);
        } finally {
            closeSession(session);
        }
    }

    public List<AssetEntry> findEntries(AssetEntryQuery entryQuery) throws SystemException {

        Session session = null;

        try {
            session = openSession();

            SQLQuery q = buildAssetQuerySQL(entryQuery, false, session);

            return (List<AssetEntry>) QueryUtil.list(q, getDialect(), entryQuery.getStart(), entryQuery.getEnd());
        } catch (Exception e) {
            throw new SystemException(e);
        } finally {
            closeSession(session);
        }
    }

    protected void buildAllCategoriesSQL(String sqlId, long[] categoryIds, StringBundler sb) {

        sb.append(" AND AssetEntry.entryId IN (");

        for (int i = 0; i < categoryIds.length; i++) {
            sb.append(CustomSQLUtil.get(sqlId));

            if ((i + 1) < categoryIds.length) {
                sb.append(" AND AssetEntry.entryId IN (");
            }
        }

        for (int i = 0; i < categoryIds.length; i++) {
            if ((i + 1) < categoryIds.length) {
                sb.append(StringPool.CLOSE_PARENTHESIS);
            }
        }

        sb.append(StringPool.CLOSE_PARENTHESIS);
    }

    protected void buildAllTagsSQL(long[] tagIds, StringBundler sb) {
        sb.append(" AND AssetEntry.entryId IN (");

        for (int i = 0; i < tagIds.length; i++) {
            sb.append(CustomSQLUtil.get(FIND_BY_AND_TAG_IDS));

            if ((i + 1) < tagIds.length) {
                sb.append(" AND AssetEntry.entryId IN (");
            }
        }

        for (int i = 0; i < tagIds.length; i++) {
            if ((i + 1) < tagIds.length) {
                sb.append(StringPool.CLOSE_PARENTHESIS);
            }
        }

        sb.append(StringPool.CLOSE_PARENTHESIS);
    }

    protected SQLQuery buildAssetQuerySQL(AssetEntryQuery entryQuery, boolean count, Session session) {

        StringBundler sb = new StringBundler();

        if (count) {
            sb.append("SELECT COUNT(DISTINCT AssetEntry.entryId) AS COUNT_VALUE ");
        } else {
            sb.append("SELECT DISTINCT {AssetEntry.*} ");

            String orderByCol1 = entryQuery.getOrderByCol1();
            String orderByCol2 = entryQuery.getOrderByCol2();

            if (orderByCol1.equals("ratings") || orderByCol2.equals("ratings")) {

                sb.append(", RatingsEntry.score ");
            }
        }

        sb.append("FROM AssetEntry ");

        if (entryQuery.getAnyTagIds().length > 0) {
            sb.append("INNER JOIN ");
            sb.append("AssetEntries_AssetTags ON ");
            sb.append("(AssetEntries_AssetTags.entryId = ");
            sb.append("AssetEntry.entryId) ");
            sb.append("INNER JOIN ");
            sb.append("AssetTag ON ");
            sb.append("(AssetTag.tagId = AssetEntries_AssetTags.tagId) ");
        }

        if (entryQuery.getAnyCategoryIds().length > 0) {
            sb.append("INNER JOIN ");
            sb.append("AssetEntries_AssetCategories ON ");
            sb.append("(AssetEntries_AssetCategories.entryId = ");
            sb.append("AssetEntry.entryId) ");
            sb.append("INNER JOIN ");
            sb.append("AssetCategory ON ");
            sb.append("(AssetCategory.categoryId = ");
            sb.append("AssetEntries_AssetCategories.categoryId) ");
        }

        if (entryQuery.getLinkedAssetEntryId() > 0) {
            sb.append("INNER JOIN ");
            sb.append("AssetLink ON ");
            sb.append("(AssetEntry.entryId = AssetLink.entryId1) ");
            sb.append("OR (AssetEntry.entryId = AssetLink.entryId2)");
        }

        if (entryQuery.getOrderByCol1().equals("ratings") || entryQuery.getOrderByCol2().equals("ratings")) {

            sb.append(" LEFT JOIN ");
            sb.append("RatingsEntry ON ");
            sb.append("(RatingsEntry.classNameId = ");
            sb.append("AssetEntry.classNameId) AND ");
            sb.append("(RatingsEntry.classPK = AssetEntry.classPK)");
        }

        sb.append("WHERE ");

        int whereIndex = sb.index();

        if (entryQuery.getLinkedAssetEntryId() > 0) {
            sb.append(" AND ((AssetLink.entryId1 = ?) OR ");
            sb.append("(AssetLink.entryId2 = ?))");
            sb.append(" AND (AssetEntry.entryId != ?)");
        }

        if (entryQuery.isVisible() != null) {
            sb.append(" AND (visible = ?)");
        }

        if (entryQuery.isExcludeZeroViewCount()) {
            sb.append(" AND (AssetEntry.viewCount > 0)");
        }

        // Layout

        Layout layout = entryQuery.getLayout();

        if (layout != null) {
            sb.append(" AND (AssetEntry.layoutUuid = ?)");
        }

        // Category conditions

        if (entryQuery.getAllCategoryIds().length > 0) {
            if (PropsValues.ASSET_CATEGORIES_SEARCH_HIERARCHICAL) {
                buildAllCategoriesSQL(FIND_BY_AND_CATEGORY_IDS_TREE, entryQuery.getAllCategoryIds(), sb);
            } else {
                buildAllCategoriesSQL(FIND_BY_AND_CATEGORY_IDS, entryQuery.getAllCategoryIds(), sb);
            }
        }

        if (entryQuery.getAnyCategoryIds().length > 0) {
            if (PropsValues.ASSET_CATEGORIES_SEARCH_HIERARCHICAL) {
                sb.append(getCategoryIds(FIND_BY_AND_CATEGORY_IDS_TREE, entryQuery.getAnyCategoryIds()));
            } else {
                sb.append(getCategoryIds(FIND_BY_AND_CATEGORY_IDS, entryQuery.getAnyCategoryIds()));
            }
        }

        if (entryQuery.getNotAllCategoryIds().length > 0) {
            if (PropsValues.ASSET_CATEGORIES_SEARCH_HIERARCHICAL) {
                buildNotAnyCategoriesSQL(FIND_BY_AND_CATEGORY_IDS_TREE, entryQuery.getNotAllCategoryIds(), sb);
            } else {
                buildNotAnyCategoriesSQL(FIND_BY_AND_CATEGORY_IDS, entryQuery.getNotAllCategoryIds(), sb);
            }
        }

        if (entryQuery.getNotAnyCategoryIds().length > 0) {
            sb.append(" AND (");

            if (PropsValues.ASSET_CATEGORIES_SEARCH_HIERARCHICAL) {
                sb.append(getNotCategoryIds(FIND_BY_AND_CATEGORY_IDS_TREE, entryQuery.getNotAnyCategoryIds()));
            } else {
                sb.append(getNotCategoryIds(FIND_BY_AND_CATEGORY_IDS, entryQuery.getNotAnyCategoryIds()));
            }

            sb.append(") ");
        }

        // Asset entry subtypes

        if (entryQuery.getClassTypeIds().length > 0) {
            buildClassTypeIdsSQL(entryQuery.getClassTypeIds(), sb);
        }

        // Tag conditions

        if (entryQuery.getAllTagIds().length > 0) {
            buildAllTagsSQL(entryQuery.getAllTagIds(), sb);
        }

        if (entryQuery.getAnyTagIds().length > 0) {
            sb.append(" AND (");
            sb.append(getTagIds(entryQuery.getAnyTagIds(), StringPool.EQUAL));
            sb.append(") ");
        }

        if (entryQuery.getNotAllTagIds().length > 0) {
            buildNotAnyTagsSQL(entryQuery.getNotAllTagIds(), sb);
        }

        if (entryQuery.getNotAnyTagIds().length > 0) {
            sb.append(" AND (");
            sb.append(getNotTagIds(entryQuery.getNotAnyTagIds()));
            sb.append(") ");
        }

        // Other conditions

        sb.append(getDates(entryQuery.getPublishDate(), entryQuery.getExpirationDate()));
        sb.append(getGroupIds(entryQuery.getGroupIds()));
        sb.append(getClassNameIds(entryQuery.getClassNameIds()));

        if (!count) {
            sb.append(" ORDER BY ");

            if (entryQuery.getOrderByCol1().equals("ratings")) {
                sb.append("RatingsEntry.score");
            } else {
                sb.append("AssetEntry.");
                sb.append(entryQuery.getOrderByCol1());
            }

            sb.append(StringPool.SPACE);
            sb.append(entryQuery.getOrderByType1());

            if (Validator.isNotNull(entryQuery.getOrderByCol2())
                    && !entryQuery.getOrderByCol1().equals(entryQuery.getOrderByCol2())) {

                if (entryQuery.getOrderByCol2().equals("ratings")) {
                    sb.append(", RatingsEntry.score");
                } else {
                    sb.append(", AssetEntry.");
                    sb.append(entryQuery.getOrderByCol2());
                }

                sb.append(StringPool.SPACE);
                sb.append(entryQuery.getOrderByType2());
            }
        }

        if (sb.index() > whereIndex) {
            String where = sb.stringAt(whereIndex);

            if (where.startsWith(" AND")) {
                sb.setStringAt(where.substring(4), whereIndex);
            }
        }

        String sql = sb.toString();

        SQLQuery q = session.createSQLQuery(sql);

        if (count) {
            q.addScalar(COUNT_COLUMN_NAME, Type.LONG);
        } else {
            q.addEntity("AssetEntry", AssetEntryImpl.class);
        }

        QueryPos qPos = QueryPos.getInstance(q);

        if (entryQuery.getLinkedAssetEntryId() > 0) {
            qPos.add(entryQuery.getLinkedAssetEntryId());
            qPos.add(entryQuery.getLinkedAssetEntryId());
            qPos.add(entryQuery.getLinkedAssetEntryId());
        }

        if (entryQuery.isVisible() != null) {
            qPos.add(entryQuery.isVisible());
        }

        if (layout != null) {
            qPos.add(layout.getUuid());
        }

        if (PropsValues.ASSET_CATEGORIES_SEARCH_HIERARCHICAL) {
            qPos.add(entryQuery.getAllLeftAndRightCategoryIds());
            qPos.add(entryQuery.getAnyLeftAndRightCategoryIds());
            qPos.add(entryQuery.getNotAllLeftAndRightCategoryIds());
            qPos.add(entryQuery.getNotAnyLeftAndRightCategoryIds());
        } else {
            qPos.add(entryQuery.getAllCategoryIds());
            qPos.add(entryQuery.getAnyCategoryIds());
            qPos.add(entryQuery.getNotAllCategoryIds());
            qPos.add(entryQuery.getNotAnyCategoryIds());
        }

        qPos.add(entryQuery.getAllTagIds());
        qPos.add(entryQuery.getAnyTagIds());
        qPos.add(entryQuery.getNotAllTagIds());
        qPos.add(entryQuery.getNotAnyTagIds());

        setDates(qPos, entryQuery.getPublishDate(), entryQuery.getExpirationDate());

        qPos.add(entryQuery.getGroupIds());
        qPos.add(entryQuery.getClassNameIds());

        return q;
    }

    protected void buildClassTypeIdsSQL(long[] classTypeIds, StringBundler sb) {
        sb.append(" AND (");

        for (int i = 0; i < classTypeIds.length; i++) {
            sb.append(" AssetEntry.classTypeId = ");
            sb.append(classTypeIds[i]);

            if ((i + 1) < classTypeIds.length) {
                sb.append(" OR ");
            } else {
                sb.append(StringPool.CLOSE_PARENTHESIS);
            }
        }
    }

    protected void buildNotAnyCategoriesSQL(String sqlId, long[] categoryIds, StringBundler sb) {

        sb.append(" AND (");

        for (int i = 0; i < categoryIds.length; i++) {
            sb.append("AssetEntry.entryId NOT IN (");
            sb.append(CustomSQLUtil.get(sqlId));
            sb.append(StringPool.CLOSE_PARENTHESIS);

            if ((i + 1) < categoryIds.length) {
                sb.append(" OR ");
            }
        }

        sb.append(StringPool.CLOSE_PARENTHESIS);
    }

    protected void buildNotAnyTagsSQL(long[] tagIds, StringBundler sb) {
        sb.append(" AND (");

        for (int i = 0; i < tagIds.length; i++) {
            sb.append("AssetEntry.entryId NOT IN (");
            sb.append(CustomSQLUtil.get(FIND_BY_AND_TAG_IDS));
            sb.append(StringPool.CLOSE_PARENTHESIS);

            if ((i + 1) < tagIds.length) {
                sb.append(" OR ");
            }
        }

        sb.append(StringPool.CLOSE_PARENTHESIS);
    }

    protected String getCategoryIds(String sqlId, long[] categoryIds) {
        StringBundler sb = new StringBundler();

        sb.append(" AND (");

        for (int i = 0; i < categoryIds.length; i++) {
            sb.append("AssetEntry.entryId IN (");
            sb.append(CustomSQLUtil.get(sqlId));
            sb.append(StringPool.CLOSE_PARENTHESIS);

            if ((i + 1) < categoryIds.length) {
                sb.append(" OR ");
            }
        }

        sb.append(StringPool.CLOSE_PARENTHESIS);

        return sb.toString();
    }

    protected String getClassNameIds(long[] classNameIds) {
        if (classNameIds.length == 0) {
            return StringPool.BLANK;
        }

        StringBundler sb = new StringBundler(classNameIds.length + 2);

        sb.append(" AND (AssetEntry.classNameId = ?");

        for (int i = 1; i < classNameIds.length; i++) {
            sb.append(" OR AssetEntry.classNameId = ? ");
        }

        sb.append(") ");

        return sb.toString();
    }

    protected String getDates(Date publishDate, Date expirationDate) {
        StringBundler sb = new StringBundler(4);

        if (publishDate != null) {
            sb.append(" AND (AssetEntry.publishDate IS NULL OR ");
            sb.append("AssetEntry.publishDate < ?)");
        }

        if (expirationDate != null) {
            sb.append(" AND (AssetEntry.expirationDate IS NULL OR ");
            sb.append("AssetEntry.expirationDate > ?)");
        }

        return sb.toString();
    }

    protected String getGroupIds(long[] groupIds) {
        if (groupIds.length == 0) {
            return StringPool.BLANK;
        }

        StringBundler sb = new StringBundler(groupIds.length + 2);

        sb.append(" AND (AssetEntry.groupId = ? ");

        for (int i = 1; i < groupIds.length; i++) {
            sb.append(" OR AssetEntry.groupId = ? ");
        }

        sb.append(")");

        return sb.toString();
    }

    protected String getNotCategoryIds(String sqlId, long[] notCategoryIds) {
        if (notCategoryIds.length == 0) {
            return StringPool.BLANK;
        }

        StringBundler sb = new StringBundler(notCategoryIds.length * 4 - 1);

        for (int i = 0; i < notCategoryIds.length; i++) {
            sb.append("AssetEntry.entryId NOT IN (");
            sb.append(CustomSQLUtil.get(sqlId));
            sb.append(StringPool.CLOSE_PARENTHESIS);

            if ((i + 1) < notCategoryIds.length) {
                sb.append(" AND ");
            }
        }

        return sb.toString();
    }

    protected String getNotTagIds(long[] notTagIds) {
        if (notTagIds.length == 0) {
            return StringPool.BLANK;
        }

        StringBundler sb = new StringBundler(notTagIds.length * 4 - 1);

        for (int i = 0; i < notTagIds.length; i++) {
            sb.append("AssetEntry.entryId NOT IN (");
            sb.append(CustomSQLUtil.get(FIND_BY_AND_TAG_IDS));
            sb.append(StringPool.CLOSE_PARENTHESIS);

            if ((i + 1) < notTagIds.length) {
                sb.append(" AND ");
            }
        }

        return sb.toString();
    }

    protected String getTagIds(long[] tagIds, String operator) {
        StringBundler sb = new StringBundler(tagIds.length * 4 - 1);

        for (int i = 0; i < tagIds.length; i++) {
            sb.append("AssetTag.tagId ");
            sb.append(operator);
            sb.append(" ? ");

            if ((i + 1) != tagIds.length) {
                sb.append("OR ");
            }
        }

        return sb.toString();
    }

    protected void setDates(QueryPos qPos, Date publishDate, Date expirationDate) {

        if (publishDate != null) {
            Timestamp publishDate_TS = CalendarUtil.getTimestamp(publishDate);

            qPos.add(publishDate_TS);
        }

        if (expirationDate != null) {
            Timestamp expirationDate_TS = CalendarUtil.getTimestamp(expirationDate);

            qPos.add(expirationDate_TS);
        }
    }

}