package com.saltedhashed.dao;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.springframework.dao.DataAccessException;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.DocumentCallbackHandler;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
import com.mongodb.DBObject;
import com.mongodb.MongoException;
import com.saltedhashed.model.Site;
import com.saltedhashed.model.User;
@Repository
public class SiteDao {
@Inject
private MongoTemplate mongo;
public void save(Site site) {
mongo.save(site);
User user = mongo.findById(site.getOwner(), User.class);
if (user.getSites().add(site.getBaseUrl())) {
mongo.save(user);
}
}
public Site find(String baseUrl) {
return mongo.findById(baseUrl, Site.class);
}
public List<Site> getSitesForUser(String email) {
User user = mongo.findById(email, User.class);
return mongo.find(Query.query(Criteria.where("baseUrl").in(user.getSites())), Site.class);
}
public void performBatched(int pageSize, PageableOperation<Site> operation) {
int page = 0;
while (true) {
Pageable pageable = new PageRequest(page, pageSize);
Query query = new Query().with(pageable);
final List<Site> data = new ArrayList<Site>();
mongo.executeQuery(query, "site", new DocumentCallbackHandler() {
@Override
public void processDocument(DBObject dbObject) throws MongoException, DataAccessException {
data.add(mongo.getConverter().read(Site.class, dbObject));
}
});
page++;
operation.setData(data);
operation.execute();
// final batch
if (data.size() < pageSize) {
break;
}
}
}
public void delete(Site site) {
mongo.remove(site);
}
}