/* * 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.constraint.TimeSeriesConstraint; import com.emc.storageos.db.client.impl.*; import com.emc.storageos.db.client.model.DataObject; public class TimeSeriesConstraintImpl extends ConstraintImpl<TimeSeriesIndexColumnName> implements TimeSeriesConstraint { private static final Logger log = LoggerFactory.getLogger(TimeSeriesConstraintImpl.class); private final ColumnFamily<String, TimeSeriesIndexColumnName> indexCF; private final Class<? extends DataObject> entryType; private final String indexKey; private long startTimeMicros; private long endTimeMicros; private long lastMatchedTimeStamp = 0; private Keyspace _keyspace; public TimeSeriesConstraintImpl(String indexKey, ColumnField field, long startTimeInMS, long endTimeInMS) { super(field); indexSerializer = TimeSeriesColumnNameSerializer.get(); indexCF = field.getIndexCF(); this.indexKey = indexKey; 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, TimeSeriesIndexColumnName> genQuery() { return genQuery(genRangeBuilder().limit(pageCount)); } private RowQuery<String, TimeSeriesIndexColumnName> genQuery(CompositeRangeBuilder builder) { return _keyspace.prepareQuery(indexCF).getKey(indexKey).withColumnRange(builder); } private CompositeRangeBuilder genRangeBuilder() { return TimeSeriesColumnNameSerializer.get().buildRange() .withPrefix(entryType.getSimpleName()) .greaterThan(startTimeMicros) .lessThanEquals(endTimeMicros); } @Override public long count() throws ConnectionException { try { OperationResult<Integer> countResult = genQuery(genRangeBuilder()).getCount().execute(); return countResult.getResult(); }catch (ConnectionException e) { log.error("Failed to get count e=", e); throw e; } } @Override protected URI getURI(Column<TimeSeriesIndexColumnName> col) { return URI.create(col.getName().getThree()); } @Override protected <T> T createQueryHit(final QueryResult<T> result, Column<TimeSeriesIndexColumnName> column) { lastMatchedTimeStamp = column.getName().getTimeInMicros()/1000; return result.createQueryHit(getURI(column)); } @Override public Class<? extends DataObject> getDataObjectType() { return entryType; } @Override public boolean isValid() { return indexCF != null && entryType != null; } }