/* * Copyright (c) 2008-2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.client.constraint.impl; import java.net.URI; 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 com.emc.storageos.db.client.constraint.AlternateIdConstraint; import com.emc.storageos.db.client.impl.ColumnField; import com.emc.storageos.db.client.impl.CompositeColumnNameSerializer; import com.emc.storageos.db.client.impl.IndexColumnName; import com.emc.storageos.db.client.model.DataObject; import com.emc.storageos.db.client.impl.IndexColumnNameSerializer; import com.netflix.astyanax.serializers.StringSerializer; /** * Alternate ID constraint implementation */ public class AlternateIdConstraintImpl extends ConstraintImpl<IndexColumnName> implements AlternateIdConstraint { private final ColumnFamily<String, IndexColumnName> _altIdCf; private final String _altId; private final Class<? extends DataObject> _entryType; private Keyspace _keyspace; public AlternateIdConstraintImpl(ColumnField field, String altId) { super(field, altId); indexSerializer = IndexColumnNameSerializer.get(); _altIdCf = field.getIndexCF(); _altId = altId; _entryType = field.getDataObjectType(); } @Override public void setKeyspace(Keyspace keyspace) { _keyspace = keyspace; } @Override protected <T> void queryOnePage(final QueryResult<T> result) throws ConnectionException { queryOnePageWithAutoPaginate(genQuery(), result); } @Override public RowQuery<String, IndexColumnName> genQuery() { RowQuery<String, IndexColumnName> query; if (startId == null) { query = _keyspace.prepareQuery(_altIdCf).getKey(_altId) .withColumnRange(CompositeColumnNameSerializer.get().buildRange() .greaterThanEquals(_entryType.getSimpleName()) .lessThanEquals(_entryType.getSimpleName()) .limit(pageCount)); }else { query = _keyspace.prepareQuery(_altIdCf).getKey(_altId) .withColumnRange(CompositeColumnNameSerializer.get().buildRange() .withPrefix(_entryType.getSimpleName()) .greaterThan(startId) // match all column2 .lessThan("x") // match all column2 .limit(pageCount)); } return query; } @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(getURI(column)); } @Override public Class<? extends DataObject> getDataObjectType() { return _entryType; } @Override public boolean isValid() { return this._altId!=null && !this._altId.isEmpty(); } }