/*
* Copyright (c) 2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.constraint.impl;
import java.net.URI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.netflix.astyanax.Keyspace;
import com.netflix.astyanax.connectionpool.OperationResult;
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
import com.netflix.astyanax.model.Column;
import com.netflix.astyanax.model.ColumnFamily;
import com.netflix.astyanax.query.RowQuery;
import com.netflix.astyanax.serializers.CompositeRangeBuilder;
import com.emc.storageos.db.client.impl.ColumnField;
import com.emc.storageos.db.client.impl.ClassNameTimeSeriesSerializer;
import com.emc.storageos.db.client.impl.ClassNameTimeSeriesIndexColumnName;
import com.emc.storageos.db.client.model.DataObject;
import com.emc.storageos.db.client.constraint.TimeSeriesConstraint;
public class ClassNameTimeSeriesConstraintImpl extends ConstraintImpl<ClassNameTimeSeriesIndexColumnName>
implements TimeSeriesConstraint {
private static final Logger log = LoggerFactory.getLogger(ClassNameTimeSeriesConstraintImpl.class);
private final ColumnFamily<String, ClassNameTimeSeriesIndexColumnName> _altIdCf;
private final String _altId;
private final Class<? extends DataObject> _entryType;
private long startTimeMicros;
private long endTimeMicros;
private long lastMatchedTimeStamp = 0;
private Keyspace _keyspace;
public ClassNameTimeSeriesConstraintImpl(ColumnField field, String altId, long startTimeInMS, long endTimeInMS) {
super(field, altId);
indexSerializer = ClassNameTimeSeriesSerializer.get();
_altIdCf = field.getIndexCF();
_altId = altId;
_entryType = field.getDataObjectType();
startTimeMicros = startTimeInMS*1000L;
endTimeMicros = endTimeInMS * 1000L;
}
@Override
public void setKeyspace(Keyspace keyspace) {
_keyspace = keyspace;
}
@Override
protected <T> void queryOnePage(final QueryResult<T> result) throws ConnectionException {
queryOnePageWithAutoPaginate(genQuery(),result);
}
public long getLastMatchedTimeStamp() {
return lastMatchedTimeStamp;
}
@Override
protected RowQuery<String, ClassNameTimeSeriesIndexColumnName> genQuery() {
return genQuery(genRangeBuilder().limit(pageCount));
}
private RowQuery<String, ClassNameTimeSeriesIndexColumnName> genQuery(CompositeRangeBuilder builder) {
return _keyspace.prepareQuery(_altIdCf).getKey(_altId).withColumnRange(builder);
}
private CompositeRangeBuilder genRangeBuilder() {
return ClassNameTimeSeriesSerializer.get().buildRange()
.withPrefix(_entryType.getSimpleName())
.greaterThan(startTimeMicros)
.lessThanEquals(endTimeMicros);
}
@Override
public long count() throws ConnectionException {
try {
OperationResult<Integer> countResult = genQuery(genRangeBuilder()).getCount().execute();
long count = countResult.getResult();
return count;
}catch (ConnectionException e) {
log.error("Failed to get count e=", e);
throw e;
}
}
@Override
protected URI getURI(Column<ClassNameTimeSeriesIndexColumnName> col) {
return URI.create(col.getName().getThree());
}
@Override
protected <T> T createQueryHit(final QueryResult<T> result, Column<ClassNameTimeSeriesIndexColumnName> column) {
lastMatchedTimeStamp = column.getName().getTimeInMicros()/1000;
return result.createQueryHit(getURI(column));
}
@Override
public Class<? extends DataObject> getDataObjectType() {
return _entryType;
}
@Override
public boolean isValid() {
return _altId != null && !_altId.isEmpty();
}
}