/* * Copyright (c) 2009-2010 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.strategies; import org.eurekastreams.commons.hibernate.ModelViewResultTransformer; import org.eurekastreams.server.domain.Person; import org.eurekastreams.server.search.factories.PersonModelViewFactory; import org.eurekastreams.server.search.modelview.PersonModelView; import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.Session; import org.hibernate.criterion.Projection; import org.hibernate.criterion.ProjectionList; import org.hibernate.criterion.Projections; /** * Strategy for building up a PersonModelView from the Person entity. */ public class PersonQueryStrategy { /** * Build the base Criteria object. * * @param hibernateSession * the hibernate session used to create the criteria. * @return the base criteria object. */ public Criteria getCriteria(final Session hibernateSession) { Criteria criteria = hibernateSession.createCriteria(Person.class); ProjectionList fields = Projections.projectionList(); criteria.setFetchMode("parentOrganization", FetchMode.JOIN); fields.add(getColumn("id")); fields.add(getColumn("dateAdded")); fields.add(getColumn("accountId")); fields.add(getColumn("openSocialId")); fields.add(getColumn("avatarId")); fields.add(getColumn("avatarCropX")); fields.add(getColumn("avatarCropY")); fields.add(getColumn("avatarCropSize")); fields.add(getColumn("lastName")); fields.add(getColumn("preferredName")); fields.add(getColumn("jobDescription")); fields.add(getColumn("title")); fields.add(getColumn("overview")); fields.add(getColumn("followersCount")); fields.add(getColumn("followingCount")); fields.add(getColumn("groupsCount")); fields.add(getColumn("optOutVideoIds")); fields.add(getColumn("updatesCount")); fields.add(getColumn("email")); fields.add(getColumn("commentable")); fields.add(getColumn("companyName")); fields.add(getColumn("streamPostable")); fields.add(getColumn("additionalProperties")); fields.add(getColumn("groupStreamHiddenLineIndex")); fields.add(getColumn("lastAcceptedTermsOfService")); fields.add(getColumn("accountLocked")); fields.add(getColumn("workPhone")); fields.add(getColumn("cellPhone")); fields.add(getColumn("fax")); fields.add(getColumn("biography")); fields.add(Projections.property("streamViewHiddenLineIndex").as("compositeStreamHiddenLineIndex")); fields.add(Projections.property("po.id").as("parentOrganizationId")); fields.add(Projections.property("po.name").as("parentOrganizationName")); fields.add(Projections.property("po.shortName").as("parentOrganizationShortName")); fields.add(Projections.property("stream.id").as("streamId")); criteria.setProjection(fields); criteria.createAlias("parentOrganization", "po"); criteria.createAlias("streamScope", "stream"); ModelViewResultTransformer<PersonModelView> resultTransformer = new ModelViewResultTransformer<PersonModelView>( new PersonModelViewFactory()); criteria.setResultTransformer(resultTransformer); return criteria; } /** * Build the PropertyProjection with alias. * * @param propertyName * the property name * @return the PropertyProjection with alias */ private Projection getColumn(final String propertyName) { return Projections.property(propertyName).as(propertyName); } }