HBASE-18251 Remove unnecessary traversing to the first and last keys in

the CellSet (Toshihoro Suzuki)
This commit is contained in:
Ramkrishna 2017-08-16 11:05:43 +05:30
parent b0878184a3
commit 9da4e6906e
2 changed files with 57 additions and 13 deletions

View File

@ -282,37 +282,85 @@ public abstract class CellFlatMap implements NavigableMap<Cell,Cell> {
} }
// -------------------------------- Entry's getters -------------------------------- // -------------------------------- Entry's getters --------------------------------
// all interfaces returning Entries are unsupported because we are dealing only with the keys
private static class CellFlatMapEntry implements Entry<Cell, Cell> {
private final Cell cell;
public CellFlatMapEntry (Cell cell) {
this.cell = cell;
}
@Override
public Cell getKey() {
return cell;
}
@Override
public Cell getValue() {
return cell;
}
@Override
public Cell setValue(Cell value) {
throw new UnsupportedOperationException();
}
}
@Override @Override
public Entry<Cell, Cell> lowerEntry(Cell k) { public Entry<Cell, Cell> lowerEntry(Cell k) {
throw new UnsupportedOperationException(); Cell cell = lowerKey(k);
if (cell == null) {
return null;
}
return new CellFlatMapEntry(cell);
} }
@Override @Override
public Entry<Cell, Cell> higherEntry(Cell k) { public Entry<Cell, Cell> higherEntry(Cell k) {
throw new UnsupportedOperationException(); Cell cell = higherKey(k);
if (cell == null) {
return null;
}
return new CellFlatMapEntry(cell);
} }
@Override @Override
public Entry<Cell, Cell> ceilingEntry(Cell k) { public Entry<Cell, Cell> ceilingEntry(Cell k) {
throw new UnsupportedOperationException(); Cell cell = ceilingKey(k);
if (cell == null) {
return null;
}
return new CellFlatMapEntry(cell);
} }
@Override @Override
public Entry<Cell, Cell> floorEntry(Cell k) { public Entry<Cell, Cell> floorEntry(Cell k) {
throw new UnsupportedOperationException(); Cell cell = floorKey(k);
if (cell == null) {
return null;
}
return new CellFlatMapEntry(cell);
} }
@Override @Override
public Entry<Cell, Cell> firstEntry() { public Entry<Cell, Cell> firstEntry() {
throw new UnsupportedOperationException(); Cell cell = firstKey();
if (cell == null) {
return null;
}
return new CellFlatMapEntry(cell);
} }
@Override @Override
public Entry<Cell, Cell> lastEntry() { public Entry<Cell, Cell> lastEntry() {
throw new UnsupportedOperationException(); Cell cell = lastKey();
if (cell == null) {
return null;
}
return new CellFlatMapEntry(cell);
} }
// The following 2 methods (pollFirstEntry, pollLastEntry) are unsupported because these are updating methods.
@Override @Override
public Entry<Cell, Cell> pollFirstEntry() { public Entry<Cell, Cell> pollFirstEntry() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@ -323,7 +371,6 @@ public abstract class CellFlatMap implements NavigableMap<Cell,Cell> {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
// -------------------------------- Updates -------------------------------- // -------------------------------- Updates --------------------------------
// All updating methods below are unsupported. // All updating methods below are unsupported.
// Assuming an array of Cells will be allocated externally, // Assuming an array of Cells will be allocated externally,

View File

@ -126,15 +126,12 @@ public class CellSet implements NavigableSet<Cell> {
throw new UnsupportedOperationException("Not implemented"); throw new UnsupportedOperationException("Not implemented");
} }
// TODO: why do we have a double traversing through map? Recall we have Cell to Cell mapping...
// First for first/last key, which actually returns Cell and then get for the same Cell?
// TODO: Consider just return the first/lastKey(), should be twice more effective...
public Cell first() { public Cell first() {
return this.delegatee.get(this.delegatee.firstKey()); return this.delegatee.firstEntry().getValue();
} }
public Cell last() { public Cell last() {
return this.delegatee.get(this.delegatee.lastKey()); return this.delegatee.lastEntry().getValue();
} }
public boolean add(Cell e) { public boolean add(Cell e) {