/* * Copyright (c) 2008-2011 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.exceptions.ConnectionException; import com.netflix.astyanax.model.Column; import com.netflix.astyanax.query.RowQuery; import com.emc.storageos.db.client.constraint.ContainmentConstraint; import com.emc.storageos.db.client.impl.*; import com.emc.storageos.db.client.model.DataObject; /** * Abstract base for all containment queries */ public class ContainmentConstraintImpl extends ConstraintImpl<IndexColumnName> implements ContainmentConstraint { private static final Logger log = LoggerFactory.getLogger(ContainmentConstraintImpl.class); private URI _indexKey; private Class<? extends DataObject> _entryType; private final ColumnField _field; private Keyspace _keyspace; public ContainmentConstraintImpl(URI indexKey, Class<? extends DataObject> entryType, ColumnField field) { super(indexKey, entryType, field); indexSerializer = IndexColumnNameSerializer.get(); _indexKey = indexKey; _entryType = entryType; _field = field; } @Override public void setKeyspace(Keyspace keyspace) { _keyspace = keyspace; } @Override protected RowQuery<String, IndexColumnName> genQuery() { RowQuery<String, IndexColumnName> query = _keyspace .prepareQuery(_field.getIndexCF()) .getKey(_indexKey.toString()) .withColumnRange( CompositeColumnNameSerializer.get().buildRange() .greaterThanEquals(_entryType.getSimpleName()) .lessThanEquals(_entryType.getSimpleName()) .limit(pageCount)); return query; } @Override protected <T> void queryOnePage(final QueryResult<T> result) throws ConnectionException { RowQuery<String, IndexColumnName> query = _keyspace.prepareQuery(_field.getIndexCF()).getKey(_indexKey.toString()); if (startId != null && _field.getIndex() instanceof RelationDbIndex) { queryOnePageWithoutAutoPaginate(query, _entryType.getSimpleName(), result); return; } queryOnePageWithAutoPaginate(query, _entryType.getSimpleName(), result); } @Override protected URI getURI(Column<IndexColumnName> col) { URI ret; if (_field.getIndex() instanceof RelationDbIndex) { ret = URI.create(col.getName().getTwo()); } else if (_field.getIndex() instanceof AltIdDbIndex) { ret = URI.create(col.getName().getTwo()); } else { ret = URI.create(col.getName().getFour()); } return ret; } @Override protected <T> T createQueryHit(final QueryResult<T> result, Column<IndexColumnName> column) { if (_field.getIndex() instanceof RelationDbIndex) { return result.createQueryHit(getURI(column)); } else { return result.createQueryHit(getURI(column), column.getName().getThree(), column.getName().getTimeUUID()); } } @Override public Class<? extends DataObject> getDataObjectType() { return _field.getDataObjectType(); } @Override public boolean isValid() { return this._indexKey!=null && !this._indexKey.toString().isEmpty(); } }