/* * Copyright (c) 2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.client.constraint.impl; import java.util.Iterator; import java.util.NoSuchElementException; import com.netflix.astyanax.connectionpool.exceptions.ConnectionException; import com.netflix.astyanax.model.Column; import com.netflix.astyanax.model.ColumnList; import com.netflix.astyanax.query.RowQuery; import com.emc.storageos.db.client.impl.CompositeIndexColumnName; import com.emc.storageos.db.exceptions.DatabaseException; /** * QueryHit iterator */ public abstract class QueryHitIterator<T1, T2 extends CompositeIndexColumnName> implements Iterator<T1> { protected RowQuery<String, T2> _query; protected Iterator<Column<T2>> _currentIt; public QueryHitIterator(RowQuery<String, T2> query) { _query = query; } public void prime() { runQuery(); } protected void runQuery() { _currentIt = null; ColumnList<T2> result; try { result = _query.execute().getResult(); } catch (final ConnectionException e) { throw DatabaseException.retryables.connectionFailed(e); } if (!result.isEmpty()) { _currentIt = result.iterator(); } } @Override public boolean hasNext() { if (_currentIt == null) { return false; } if (_currentIt.hasNext()) { return true; } runQuery(); return _currentIt != null; } @Override public T1 next() { if (_currentIt == null) { throw new NoSuchElementException(); } return createQueryHit(_currentIt.next()); } @Override public void remove() { throw new UnsupportedOperationException(); } protected abstract T1 createQueryHit(Column<T2> column); }