code: public Iterable<RowKey> getKeys() {
  		if ( currentState.isEmpty() ) {
  			if ( cleared ) {
  				// if the association has been cleared and the currentState is empty, we consider that there are no rows.
  				return Collections.emptyList();
  			}
  			else {
  				// otherwise, the snapshot rows are the current ones
  				return snapshot.getRowKeys();
  			}
  		}
  		else {
  			// It may be a bit too large in case of removals, but that's fine for now
  			Set<RowKey> keys = CollectionHelper.newLinkedHashSet( cleared ? currentState.size() : snapshot.size() + currentState.size() );
  
  			if ( !cleared ) {
  				// we add the snapshot RowKeys only if the association has not been cleared
  				for ( RowKey rowKey : snapshot.getRowKeys() ) {
  					keys.add( rowKey );
  				}
  			}
  
  			for ( Map.Entry<RowKey,AssociationOperation> op : currentState.entrySet() ) {
  				switch ( op.getValue().getType() ) {
  					case PUT:
  						keys.add( op.getKey() );
  						break;
  					case REMOVE:
  						keys.remove( op.getKey() );
  						break;
  				}
  			}
  
  			return keys;
  		}
  	}
docs: Returns all keys of all rows contained within this association.
  
  @return all keys of all rows contained within this association