Repository: hbase Updated Branches: refs/heads/master fa838b020 -> 8a6d6aa23
http://git-wip-us.apache.org/repos/asf/hbase/blob/8a6d6aa2/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCompleteResultScanResultCache.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCompleteResultScanResultCache.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCompleteResultScanResultCache.java new file mode 100644 index 0000000..d688d0a --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCompleteResultScanResultCache.java @@ -0,0 +1,159 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.client; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; + +import java.io.IOException; +import java.util.Arrays; +import java.util.stream.IntStream; + +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.testclassification.ClientTests; +import org.apache.hadoop.hbase.testclassification.SmallTests; +import org.apache.hadoop.hbase.util.Bytes; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +@Category({ SmallTests.class, ClientTests.class }) +public class TestCompleteResultScanResultCache { + + private static byte[] CF = Bytes.toBytes("cf"); + + private static byte[] CQ1 = Bytes.toBytes("cq1"); + + private static byte[] CQ2 = Bytes.toBytes("cq2"); + + private static byte[] CQ3 = Bytes.toBytes("cq3"); + + private CompleteScanResultCache resultCache; + + @Before + public void setUp() { + resultCache = new CompleteScanResultCache(); + } + + @After + public void tearDown() { + resultCache.clear(); + resultCache = null; + } + + private static Cell createCell(int key, byte[] cq) { + return new KeyValue(Bytes.toBytes(key), CF, cq, Bytes.toBytes(key)); + } + + @Test + public void testNoPartial() throws IOException { + assertSame(ScanResultCache.EMPTY_RESULT_ARRAY, + resultCache.addAndGet(ScanResultCache.EMPTY_RESULT_ARRAY, false)); + assertSame(ScanResultCache.EMPTY_RESULT_ARRAY, + resultCache.addAndGet(ScanResultCache.EMPTY_RESULT_ARRAY, true)); + int count = 10; + Result[] results = new Result[count]; + IntStream.range(0, count).forEach(i -> { + results[i] = Result.create(Arrays.asList(createCell(i, CQ1))); + }); + assertSame(results, resultCache.addAndGet(results, false)); + } + + @Test + public void testCombine1() throws IOException { + Result previousResult = Result.create(Arrays.asList(createCell(0, CQ1)), null, false, true); + Result result1 = Result.create(Arrays.asList(createCell(1, CQ1)), null, false, true); + Result result2 = Result.create(Arrays.asList(createCell(1, CQ2)), null, false, true); + Result result3 = Result.create(Arrays.asList(createCell(1, CQ3)), null, false, true); + Result[] results = resultCache.addAndGet(new Result[] { previousResult, result1 }, false); + assertEquals(1, results.length); + assertSame(previousResult, results[0]); + + assertEquals(0, resultCache.addAndGet(new Result[] { result2 }, false).length); + assertEquals(0, resultCache.addAndGet(new Result[] { result3 }, false).length); + assertEquals(0, resultCache.addAndGet(new Result[0], true).length); + + results = resultCache.addAndGet(new Result[0], false); + assertEquals(1, results.length); + assertEquals(1, Bytes.toInt(results[0].getRow())); + assertEquals(3, results[0].rawCells().length); + assertEquals(1, Bytes.toInt(results[0].getValue(CF, CQ1))); + assertEquals(1, Bytes.toInt(results[0].getValue(CF, CQ2))); + assertEquals(1, Bytes.toInt(results[0].getValue(CF, CQ3))); + } + + @Test + public void testCombine2() throws IOException { + Result result1 = Result.create(Arrays.asList(createCell(1, CQ1)), null, false, true); + Result result2 = Result.create(Arrays.asList(createCell(1, CQ2)), null, false, true); + Result result3 = Result.create(Arrays.asList(createCell(1, CQ3)), null, false, true); + Result nextResult1 = Result.create(Arrays.asList(createCell(2, CQ1)), null, false, true); + Result nextToNextResult1 = Result.create(Arrays.asList(createCell(3, CQ2)), null, false, false); + + assertEquals(0, resultCache.addAndGet(new Result[] { result1 }, false).length); + assertEquals(0, resultCache.addAndGet(new Result[] { result2 }, false).length); + assertEquals(0, resultCache.addAndGet(new Result[] { result3 }, false).length); + + Result[] results = resultCache.addAndGet(new Result[] { nextResult1 }, false); + assertEquals(1, results.length); + assertEquals(1, Bytes.toInt(results[0].getRow())); + assertEquals(3, results[0].rawCells().length); + assertEquals(1, Bytes.toInt(results[0].getValue(CF, CQ1))); + assertEquals(1, Bytes.toInt(results[0].getValue(CF, CQ2))); + assertEquals(1, Bytes.toInt(results[0].getValue(CF, CQ3))); + + results = resultCache.addAndGet(new Result[] { nextToNextResult1 }, false); + assertEquals(2, results.length); + assertEquals(2, Bytes.toInt(results[0].getRow())); + assertEquals(1, results[0].rawCells().length); + assertEquals(2, Bytes.toInt(results[0].getValue(CF, CQ1))); + assertEquals(3, Bytes.toInt(results[1].getRow())); + assertEquals(1, results[1].rawCells().length); + assertEquals(3, Bytes.toInt(results[1].getValue(CF, CQ2))); + } + + @Test + public void testCombine3() throws IOException { + Result result1 = Result.create(Arrays.asList(createCell(1, CQ1)), null, false, true); + Result result2 = Result.create(Arrays.asList(createCell(1, CQ2)), null, false, true); + Result nextResult1 = Result.create(Arrays.asList(createCell(2, CQ1)), null, false, false); + Result nextToNextResult1 = Result.create(Arrays.asList(createCell(3, CQ1)), null, false, true); + + assertEquals(0, resultCache.addAndGet(new Result[] { result1 }, false).length); + assertEquals(0, resultCache.addAndGet(new Result[] { result2 }, false).length); + + Result[] results = resultCache.addAndGet(new Result[] { nextResult1, nextToNextResult1 }, + false); + assertEquals(2, results.length); + assertEquals(1, Bytes.toInt(results[0].getRow())); + assertEquals(2, results[0].rawCells().length); + assertEquals(1, Bytes.toInt(results[0].getValue(CF, CQ1))); + assertEquals(1, Bytes.toInt(results[0].getValue(CF, CQ2))); + assertEquals(2, Bytes.toInt(results[1].getRow())); + assertEquals(1, results[1].rawCells().length); + assertEquals(2, Bytes.toInt(results[1].getValue(CF, CQ1))); + + results = resultCache.addAndGet(new Result[0], false); + assertEquals(1, results.length); + assertEquals(3, Bytes.toInt(results[0].getRow())); + assertEquals(1, results[0].rawCells().length); + assertEquals(3, Bytes.toInt(results[0].getValue(CF, CQ1))); + } +}
