package fr.ippon.tatami.repository.cassandra;
import fr.ippon.tatami.config.Constants;
import fr.ippon.tatami.config.GroupRoles;
import fr.ippon.tatami.repository.StatusReportRepository;
import me.prettyprint.cassandra.serializers.LongSerializer;
import me.prettyprint.cassandra.serializers.StringSerializer;
import me.prettyprint.cassandra.service.ColumnSliceIterator;
import me.prettyprint.cassandra.service.template.ColumnFamilyResult;
import me.prettyprint.cassandra.service.template.ColumnFamilyTemplate;
import me.prettyprint.cassandra.service.template.ColumnFamilyUpdater;
import me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate;
import me.prettyprint.hector.api.Keyspace;
import me.prettyprint.hector.api.beans.ColumnSlice;
import me.prettyprint.hector.api.beans.HColumn;
import me.prettyprint.hector.api.exceptions.HectorException;
import me.prettyprint.hector.api.factory.HFactory;
import me.prettyprint.hector.api.mutation.Mutator;
import me.prettyprint.hector.api.query.SliceQuery;
import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.util.*;
import static fr.ippon.tatami.config.ColumnFamilyKeys.GROUP_MEMBERS_CF;
import static fr.ippon.tatami.config.ColumnFamilyKeys.STATUS_REPORT_CF;
import static me.prettyprint.hector.api.factory.HFactory.createSliceQuery;
@Repository
public class CassandraStatusReportRepository implements StatusReportRepository {
private ColumnFamilyTemplate<String, String> reportedStatusTemplate;
@Inject
private Keyspace keyspaceOperator;
@PostConstruct
public void init() {
reportedStatusTemplate = new ThriftColumnFamilyTemplate<String, String>(keyspaceOperator,
STATUS_REPORT_CF,
StringSerializer.get(),
StringSerializer.get());
reportedStatusTemplate.setCount(Constants.CASSANDRA_MAX_COLUMNS);
}
@Override
public void reportStatus(String domain, String reportedStatusId, String reportingLogin) {
Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get());
mutator.insert(domain, STATUS_REPORT_CF, HFactory.createStringColumn(reportedStatusId, reportingLogin));
}
@Override
public void unreportStatus(String domain, String reportedStatusId) {
Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get());
mutator.delete(domain, STATUS_REPORT_CF, reportedStatusId, StringSerializer.get());
}
@Override
public List<String> findReportedStatuses(String domain) {
SliceQuery<String, String, String> query = HFactory.createSliceQuery(keyspaceOperator, StringSerializer.get(),
StringSerializer.get(), StringSerializer.get()).
setKey(domain).setColumnFamily(STATUS_REPORT_CF);
ColumnSliceIterator<String, String, String> iterator =
new ColumnSliceIterator<String, String, String>(query, null, "\uFFFF", false);
List<String> reportedStatuses = new ArrayList<String>();
while (iterator.hasNext()) {
reportedStatuses.add(iterator.next().getName());
}
return reportedStatuses;
}
public String findUserHavingReported(String domain, String statusId){
ColumnFamilyResult<String, String> res = reportedStatusTemplate.queryColumns(domain);
return res.getString(statusId);
}
@Override
public boolean hasBeenReportedByUser(String domain, String reportedStatusId, String login) {
return login.equals(reportedStatusTemplate.queryColumns(domain).getString(reportedStatusId));
}
}