/*******************************************************************************
* * Copyright 2012 Impetus Infotech.
* *
* * 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 com.impetus.client.twitter.dao;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.impetus.client.twitter.entities.ExternalLinkCassandra;
import com.impetus.client.twitter.entities.PreferenceCassandra;
import com.impetus.client.twitter.entities.TweetCassandra;
import com.impetus.client.twitter.entities.UserCassandra;
import com.impetus.kundera.KunderaException;
/**
* Data access object class for implementation of twitter.
*
* @author amresh.singh
*/
public class TwitterServiceCassandra extends SuperDaoCassandra implements TwitterCassandra
{
private static final Logger log = LoggerFactory.getLogger(TwitterServiceCassandra.class);
private EntityManager em;
private EntityManagerFactory emf;
public TwitterServiceCassandra(String persistenceUnitName)
{
if (emf == null)
{
try
{
emf = createEntityManagerFactory(persistenceUnitName);
}
catch (Exception e)
{
log.error(e.getMessage(),e);
throw new KunderaException(e);
}
}
}
@Override
public void createEntityManager()
{
if (em == null)
{
em = emf.createEntityManager();
}
}
@Override
public void closeEntityManager()
{
if (em != null)
{
em.close();
em = null;
}
}
@Override
public void close()
{
if (emf != null)
{
emf.close();
}
}
@Override
public void addUser(UserCassandra user)
{
em.persist(user);
}
@Override
public void addUser(String userId, String name, String password, String relationshipStatus, int age)
{
UserCassandra user = new UserCassandra(userId, name, password, relationshipStatus, age);
em.persist(user);
}
@Override
public void savePreference(String userId, PreferenceCassandra preference)
{
UserCassandra user = em.find(UserCassandra.class, userId);
user.setPreference(preference);
em.persist(user);
}
@Override
public void addExternalLink(String userId, String linkId, String linkType, String linkAddress)
{
UserCassandra user = em.find(UserCassandra.class, userId);
user.addExternalLink(new ExternalLinkCassandra(linkId, linkType, linkAddress));
em.persist(user);
}
@Override
public void addTweet(String userId, String tweetBody, String device)
{
UserCassandra user = em.find(UserCassandra.class, userId);
user.addTweet(new TweetCassandra(tweetBody, device));
em.persist(user);
}
@Override
public void startFollowing(String userId, String friendUserId)
{
UserCassandra user = em.find(UserCassandra.class, userId);
UserCassandra friend = em.find(UserCassandra.class, friendUserId);
user.addFriend(friend);
em.persist(user);
friend.addFollower(user);
em.persist(friend);
}
@Override
public void addFollower(String userId, String followerUserId)
{
UserCassandra user = em.find(UserCassandra.class, userId);
UserCassandra follower = em.find(UserCassandra.class, followerUserId);
user.addFollower(follower);
em.persist(user);
}
@Override
public UserCassandra findUserById(String userId)
{
em.clear();
UserCassandra user = em.find(UserCassandra.class, userId);
return user;
}
@Override
public void removeUser(UserCassandra user)
{
em.remove(user);
}
@Override
public void mergeUser(UserCassandra user)
{
em.merge(user);
}
@Override
public List<UserCassandra> getAllUsers()
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u");
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<TweetCassandra> getAllTweets(String userId)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.userId =:userId");
q.setParameter("userId", userId);
List<UserCassandra> users = q.getResultList();
if (users == null || users.isEmpty())
{
return null;
}
else
{
return users.get(0).getTweets();
}
}
@Override
public List<UserCassandra> getFollowers(String userId)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.userId =:userId");
q.setParameter("userId", userId);
List<UserCassandra> users = q.getResultList();
if (users == null || users.isEmpty())
{
return null;
}
return users.get(0).getFollowers();
}
@Override
public List<UserCassandra> findPersonalDetailByName(String name)
{
em.clear();
Query q = em
.createQuery("select u.personalDetail.name from UserCassandra u where u.personalDetail.name =:name");
q.setParameter("name", name);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<TweetCassandra> findTweetByBody(String tweetBody)
{
em.clear();
Query q = em.createQuery("select u.tweets.body from UserCassandra u where u.tweets.body like :body");
q.setParameter("body", tweetBody);
List<TweetCassandra> tweets = q.getResultList();
return tweets;
}
@Override
public List<TweetCassandra> findTweetByDevice(String deviceName)
{
em.clear();
Query q = em.createQuery("select u.tweets.device from UserCassandra u where u.tweets.device =:device");
q.setParameter("device", deviceName);
List<TweetCassandra> tweets = q.getResultList();
return tweets;
}
@Override
public List<UserCassandra> findByRelationshipAndDevice(String relationship, String device)
{
em.clear();
Query q = em
.createQuery("select u.tweets.device from UserCassandra u where u.tweets.device=:device and u.personalDetail.relationshipStatus=:relation");
q.setParameter("device", device);
q.setParameter("relation", relationship);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public UserCassandra findByUserIdAndTweetDevice(String userId, String device)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.tweets.device=:device and u.userId=:userId");
q.setParameter("device", device);
q.setParameter("userId", userId);
List<UserCassandra> users = q.getResultList();
if (users != null && !users.isEmpty())
{
return users.get(0);
}
return null;
}
/************* Queries on Professional Details for all data types *************/
@Override
public List<UserCassandra> findUserByProfessionId(long professionId)
{
em.clear();
Query q = em
.createQuery("select u from UserCassandra u where u.professionalDetail.professionId =:professionId");
q.setParameter("professionId", professionId);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByDepartment(String departmentName)
{
em.clear();
Query q = em
.createQuery("select u from UserCassandra u where u.professionalDetail.departmentName =:departmentName");
q.setParameter("departmentName", departmentName);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findExceptionalUsers()
{
em.clear();
Query q = em
.createQuery("select u from UserCassandra u where u.professionalDetail.isExceptional =:isExceptional");
q.setParameter("isExceptional", true);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByAge(int age)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.age =:age");
q.setParameter("age", age);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByGrade(char grade)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.grade =:grade");
q.setParameter("grade", grade);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByDigitalSignature(byte digitalSignature)
{
em.clear();
Query q = em
.createQuery("select u from UserCassandra u where u.professionalDetail.digitalSignature =:digitalSignature");
q.setParameter("digitalSignature", digitalSignature);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByRating(short rating)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.rating =:rating");
q.setParameter("rating", rating);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByCompliance(float compliance)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.compliance =:compliance");
q.setParameter("compliance", compliance);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByHeight(double height)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.height =:height");
q.setParameter("height", height);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByEnrolmentDate(Date enrolmentDate)
{
em.clear();
Query q = em
.createQuery("select u from UserCassandra u where u.professionalDetail.enrolmentDate =:enrolmentDate");
q.setParameter("enrolmentDate", enrolmentDate);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByEnrolmentTime(Date enrolmentTime)
{
em.clear();
Query q = em
.createQuery("select u from UserCassandra u where u.professionalDetail.enrolmentTime =:enrolmentTime");
q.setParameter("enrolmentTime", enrolmentTime);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByJoiningDateAndTime(Date joiningDateAndTime)
{
em.clear();
Query q = em
.createQuery("select u from UserCassandra u where u.professionalDetail.joiningDateAndTime =:joiningDateAndTime");
q.setParameter("joiningDateAndTime", joiningDateAndTime);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByYearsSpent(Integer yearsSpent)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.yearsSpent =:yearsSpent");
q.setParameter("yearsSpent", yearsSpent);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByUniqueId(Long uniqueId)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.uniqueId =:uniqueId");
q.setParameter("uniqueId", uniqueId);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByMonthlySalary(Double monthlySalary)
{
em.clear();
Query q = em
.createQuery("select u from UserCassandra u where u.professionalDetail.monthlySalary =:monthlySalary");
q.setParameter("monthlySalary", monthlySalary);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByBirthday(java.sql.Date birthday)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.birthday =:birthday");
q.setParameter("birthday", birthday);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByBirthtime(Time birthtime)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.birthtime =:birthtime");
q.setParameter("birthtime", birthtime);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByAnniversary(Timestamp anniversary)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.anniversary =:anniversary");
q.setParameter("anniversary", anniversary);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByJobAttempts(BigInteger jobAttempts)
{
em.clear();
Query q = em.createQuery("select u from UserCassandra u where u.professionalDetail.jobAttempts =:jobAttempts");
q.setParameter("jobAttempts", jobAttempts);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByAccumulatedWealth(BigDecimal accumulatedWealth)
{
em.clear();
Query q = em
.createQuery("select u from UserCassandra u where u.professionalDetail.accumulatedWealth =:accumulatedWealth");
q.setParameter("accumulatedWealth", accumulatedWealth);
List<UserCassandra> users = q.getResultList();
return users;
}
@Override
public List<UserCassandra> findUserByGraduationDay(Calendar graduationDay)
{
em.clear();
Query q = em
.createQuery("select u from UserCassandra u where u.professionalDetail.graduationDay =:graduationDay");
q.setParameter("graduationDay", graduationDay);
List<UserCassandra> users = q.getResultList();
return users;
}
}