Package org.eurekastreams.server.persistence.mappers.db

Source Code of org.eurekastreams.server.persistence.mappers.db.GetIdsFromPointersDbMapper

/*
* Copyright (c) 2010-2011 Lockheed Martin Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.eurekastreams.server.persistence.mappers.db;

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

import org.eurekastreams.server.persistence.mappers.BaseArgDomainMapper;
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
* Mapper to get a map of entity ids by a pointer.
*
* @param <PointerType>
*            the type of pointer to lookup the id from
*/
public class GetIdsFromPointersDbMapper<PointerType> extends BaseArgDomainMapper<List<PointerType>, List<Long>>
{
    /**
     * Name of the pointer field.
     */
    private final String pointerFieldName;

    /**
     * Entity class to select from.
     */
    private final Class< ? > entityClass;

    /**
     * Constructor.
     *
     * @param inPointerFieldName
     *            the name of the pointer field
     * @param inEntityClass
     *            the class to select from
     */
    public GetIdsFromPointersDbMapper(final String inPointerFieldName, final Class< ? > inEntityClass)
    {
        pointerFieldName = inPointerFieldName;
        entityClass = inEntityClass;
    }

    /**
     * Get the entity ids from their pointer values.
     *
     * @param inPointerValues
     *            the values of the pointers to look up ids for
     * @return a Map of pointer values to Long entity ids
     */
    @Override
    public List<Long> execute(final List<PointerType> inPointerValues)
    {
        if (inPointerValues == null || inPointerValues.isEmpty())
        {
            return new ArrayList<Long>();
        }

        Criteria criteria = getHibernateSession().createCriteria(entityClass);
        ProjectionList fields = Projections.projectionList();
        fields.add(Projections.property(pointerFieldName).as("key"));
        fields.add(Projections.property("id").as("itemId"));
        criteria.setProjection(fields);

        // Creates the necessary "OR" clauses to get all uncached item pointers
        Criterion restriction = null;
        for (PointerType pointer : inPointerValues)
        {
            if (restriction == null)
            {
                restriction = Restrictions.eq(pointerFieldName, pointer);
            }
            else
            {
                restriction = Restrictions.or(Restrictions.eq(pointerFieldName, pointer), restriction);
            }
        }
        criteria.add(restriction);

        // Build the list of results
        // Insure a 1-to-1 correspondence to the input pointers (same order and nulls for missing values)
        // Note: results is a list of Object arrays. Each array contains the fields for the given row in the same order
        // as they were added to the ProjectionList above.
        List<Object[]> dbResults = criteria.list();
        Map<PointerType, Long> dbIndex = new HashMap<PointerType, Long>();
        for (Object[] row : dbResults)
        {
            dbIndex.put((PointerType) row[0], (Long) row[1]);
        }
        List<Long> results = new ArrayList<Long>(inPointerValues.size());
        for (PointerType key : inPointerValues)
        {
            // Note: this automatically handles nulls for unknown elements
            results.add(dbIndex.get(key));
        }
        return results;
    }
}
TOP

Related Classes of org.eurekastreams.server.persistence.mappers.db.GetIdsFromPointersDbMapper

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.