/*
* Copyright (c) 2008-2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.constraint.impl;
import com.emc.storageos.db.client.constraint.AggregatedConstraint;
import com.emc.storageos.db.client.impl.ColumnField;
import com.emc.storageos.db.client.impl.ColumnValue;
import com.emc.storageos.db.client.impl.CompositeColumnNameSerializer;
import com.emc.storageos.db.client.impl.IndexColumnName;
import com.emc.storageos.db.client.impl.IndexColumnNameSerializer;
import com.emc.storageos.db.client.model.DataObject;
import com.netflix.astyanax.Keyspace;
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 java.net.URI;
/**
* Constrained query to get list of decommissioned object URIs of a given type
*/
public class AggregatedConstraintImpl extends ConstraintImpl<IndexColumnName> implements AggregatedConstraint {
private Keyspace keyspace;
private final ColumnFamily<String, IndexColumnName> cf;
private final ColumnField field;
private final String fieldName;
private final String rowKey;
private final Class<? extends DataObject> entryType;
/*
* Constraint for listing all objects of a given type with index value
* if value is null, gives full list for the type - used by queryByType.
*/
public AggregatedConstraintImpl(Class<? extends DataObject> clazz, ColumnField groupByField, String groupByValue, ColumnField field) {
super(clazz, field, groupByField.getName(), groupByValue);
indexSerializer = IndexColumnNameSerializer.get();
cf = field.getIndexCF();
entryType = clazz;
this.field = field;
fieldName = field.getName();
rowKey = String.format("%s:%s", clazz.getSimpleName(), groupByValue);
}
public AggregatedConstraintImpl(Class<? extends DataObject> clazz, ColumnField field) {
super(clazz, field);
cf = field.getIndexCF();
entryType = clazz;
this.field = field;
fieldName = field.getName();
rowKey = clazz.getSimpleName();
}
@Override
public void setKeyspace(Keyspace keyspace) {
this.keyspace = keyspace;
}
@Override
protected <T> void queryOnePage(final QueryResult<T> result) throws ConnectionException {
queryOnePageWithAutoPaginate(genQuery(), fieldName, result);
}
@Override
protected URI getURI(Column<IndexColumnName> col) {
return URI.create(col.getName().getTwo());
}
@Override
protected <T> T createQueryHit(final QueryResult<T> result, Column<IndexColumnName> column) {
return result.createQueryHit(URI.create(column.getName().getTwo()),
ColumnValue.getPrimitiveColumnValue(column, field.getPropertyDescriptor()));
}
@Override
protected RowQuery<String, IndexColumnName> genQuery() {
return keyspace.prepareQuery(cf).getKey(rowKey)
.withColumnRange(
CompositeColumnNameSerializer.get().buildRange()
.greaterThanEquals(fieldName)
.lessThanEquals(fieldName)
.limit(pageCount)
);
}
@Override
public Class<? extends DataObject> getDataObjectType() {
return entryType;
}
@Override
public boolean isValid() {
return this.rowKey!=null && !this.rowKey.isEmpty();
}
}