diff --git a/akka-persistence/akka-persistence-hbase/src/main/scala/HbaseStorageBackend.scala b/akka-persistence/akka-persistence-hbase/src/main/scala/HbaseStorageBackend.scala index 67bd2b70ff..ce8a4bdce0 100644 --- a/akka-persistence/akka-persistence-hbase/src/main/scala/HbaseStorageBackend.scala +++ b/akka-persistence/akka-persistence-hbase/src/main/scala/HbaseStorageBackend.scala @@ -100,12 +100,11 @@ private[akka] object HbaseStorageBackend extends MapStorageBackend[Array[Byte], def getRefStorageFor(name: String): Option[Array[Byte]] = { val row = new Get(Bytes.toBytes(name)) val result = REF_TABLE.get(row) - if (result.isEmpty()) { - return None; - } else { - val element = result.getValue(Bytes.toBytes("element"), Bytes.toBytes("element")) - return Some(element) - } + + if (result.isEmpty()) + None + else + Some(result.getValue(Bytes.toBytes("element"), Bytes.toBytes("element"))) } // =============================================================== @@ -132,7 +131,8 @@ private[akka] object HbaseStorageBackend extends MapStorageBackend[Array[Byte], val result = VECTOR_TABLE.get(row) val size = result.size val colnum = size - index - 1 - return result.getValue(Bytes.toBytes(VECTOR_ELEMENT_COLUMN_FAMILY_NAME),Bytes.toBytes(colnum)) + + result.getValue(Bytes.toBytes(VECTOR_ELEMENT_COLUMN_FAMILY_NAME),Bytes.toBytes(colnum)) } /** @@ -142,39 +142,38 @@ private[akka] object HbaseStorageBackend extends MapStorageBackend[Array[Byte], * if start == 0 and finish == 0, return an empty collection */ def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[Array[Byte]] = { + + import scala.math._ + val row = new Get(Bytes.toBytes(name)) val result = VECTOR_TABLE.get(row) val size = result.size var listBuffer = new ListBuffer[Array[Byte]] + var b = 0 + var e = 0 if(start.isDefined && finish.isDefined) { - for(i <- start.get to finish.get-1) { - val colnum = size - i - 1 - listBuffer += result.getValue(Bytes.toBytes(VECTOR_ELEMENT_COLUMN_FAMILY_NAME),Bytes.toBytes(colnum)) - } - return listBuffer.toList + b = max(0,start.get) + e = min(finish.get - 1, size -1) } else { - val b = start.getOrElse(0) - val e = if(!finish.isDefined) { - val ee: Int = b + count -1 - if(ee < size-1) ee else size-1 - } - for(i <- b.asInstanceOf[Int] to e.asInstanceOf[Int]) { - val colnum = size - i - 1 - listBuffer += result.getValue(Bytes.toBytes(VECTOR_ELEMENT_COLUMN_FAMILY_NAME),Bytes.toBytes(colnum)) - } - return listBuffer.toList + b = max(0,start.getOrElse(0)) + e = finish.getOrElse(max(0,min(b + count - 1, size - 1))) } + for(i <- b to e) { + val colnum = size - i - 1 + listBuffer += result.getValue(Bytes.toBytes(VECTOR_ELEMENT_COLUMN_FAMILY_NAME),Bytes.toBytes(colnum)) + } + listBuffer.toList } def getVectorStorageSizeFor(name: String): Int = { val row = new Get(Bytes.toBytes(name)) val result = VECTOR_TABLE.get(row) - if (result.isEmpty) { + + if (result.isEmpty) 0 - } else { + else result.size - } } // =============================================================== @@ -192,11 +191,8 @@ private[akka] object HbaseStorageBackend extends MapStorageBackend[Array[Byte], def getMapStorageEntryFor(name: String, key: Array[Byte]): Option[Array[Byte]] = { val row = new Get(Bytes.toBytes(name)) val result = MAP_TABLE.get(row) - val value = result.getValue(Bytes.toBytes(MAP_ELEMENT_COLUMN_FAMILY_NAME), key) - if(value == null) - None - else - Some(value) + + Option(result.getValue(Bytes.toBytes(MAP_ELEMENT_COLUMN_FAMILY_NAME), key)) } def getMapStorageFor(name: String): List[Tuple2[Array[Byte], Array[Byte]]] = { @@ -214,11 +210,11 @@ private[akka] object HbaseStorageBackend extends MapStorageBackend[Array[Byte], def getMapStorageSizeFor(name: String): Int = { val row = new Get(Bytes.toBytes(name)) val result = MAP_TABLE.get(row) - if (result.isEmpty) { + + if (result.isEmpty) 0 - } else { + else result.size - } } def removeMapStorageFor(name: String): Unit = { @@ -248,8 +244,10 @@ private[akka] object HbaseStorageBackend extends MapStorageBackend[Array[Byte], val cnt = if(count > size) size else count var i: Int = 0 while(iterator.hasNext && i < cnt) { - val raw = iterator.next - listBuffer += Tuple2(raw.asInstanceOf[java.util.Map.Entry[Array[Byte], Array[Byte]]].getKey, raw.asInstanceOf[java.util.Map.Entry[Array[Byte],Array[Byte]]].getValue) + iterator.next match { + case entry: java.util.Map.Entry[Array[Byte], Array[Byte]] => listBuffer += ((entry.getKey,entry.getValue)) + case _ => + } i = i+1 } listBuffer.toList diff --git a/akka-persistence/akka-persistence-hbase/src/test/scala/HbaseStorageSpec.scala b/akka-persistence/akka-persistence-hbase/src/test/scala/HbaseStorageSpec.scala index 2b9d017444..bc4f939049 100644 --- a/akka-persistence/akka-persistence-hbase/src/test/scala/HbaseStorageSpec.scala +++ b/akka-persistence/akka-persistence-hbase/src/test/scala/HbaseStorageSpec.scala @@ -30,7 +30,7 @@ BeforeAndAfterEach { override def afterEach { HbaseStorageBackend.drop } - + describe("persistent maps") { it("should insert with single key and value") { import HbaseStorageBackend._ @@ -130,6 +130,10 @@ BeforeAndAfterEach { getVectorStorageRangeFor("t1", None, None, 100).map(new String(_)) should equal(List("ola bini", "james strachan", "dennis ritchie", "james gosling", "martin odersky")) getVectorStorageRangeFor("t1", Some(0), Some(5), 100).map(new String(_)) should equal(List("ola bini", "james strachan", "dennis ritchie", "james gosling", "martin odersky")) getVectorStorageRangeFor("t1", Some(2), Some(5), 100).map(new String(_)) should equal(List("dennis ritchie", "james gosling", "martin odersky")) + getVectorStorageRangeFor("t1", Some(-1), Some(5), 100).map(new String(_)) should equal(List("ola bini", "james strachan", "dennis ritchie", "james gosling", "martin odersky")) + getVectorStorageRangeFor("t1", Some(-1), None, 5).map(new String(_)) should equal(List("ola bini", "james strachan", "dennis ritchie", "james gosling", "martin odersky")) + getVectorStorageRangeFor("t1", Some(-1), Some(-1), 100).size should equal(0) + getVectorStorageRangeFor("t1", Some(0), Some(0), 100).size should equal(0) getVectorStorageSizeFor("t1") should equal(5) }