001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase.client; 019 020import static org.junit.Assert.assertEquals; 021import static org.junit.Assert.assertSame; 022 023import java.io.IOException; 024import java.util.Arrays; 025import org.apache.hadoop.hbase.Cell; 026import org.apache.hadoop.hbase.HBaseClassTestRule; 027import org.apache.hadoop.hbase.KeyValue; 028import org.apache.hadoop.hbase.testclassification.ClientTests; 029import org.apache.hadoop.hbase.testclassification.SmallTests; 030import org.apache.hadoop.hbase.util.Bytes; 031import org.junit.After; 032import org.junit.Before; 033import org.junit.ClassRule; 034import org.junit.Test; 035import org.junit.experimental.categories.Category; 036 037@Category({ SmallTests.class, ClientTests.class }) 038public class TestBatchScanResultCache { 039 040 @ClassRule 041 public static final HBaseClassTestRule CLASS_RULE = 042 HBaseClassTestRule.forClass(TestBatchScanResultCache.class); 043 044 private static byte[] CF = Bytes.toBytes("cf"); 045 046 private BatchScanResultCache resultCache; 047 048 @Before 049 public void setUp() { 050 resultCache = new BatchScanResultCache(4); 051 } 052 053 @After 054 public void tearDown() { 055 resultCache.clear(); 056 resultCache = null; 057 } 058 059 static Cell createCell(byte[] cf, int key, int cq) { 060 return new KeyValue(Bytes.toBytes(key), cf, Bytes.toBytes("cq" + cq), Bytes.toBytes(key)); 061 } 062 063 static Cell[] createCells(byte[] cf, int key, int numCqs) { 064 Cell[] cells = new Cell[numCqs]; 065 for (int i = 0; i < numCqs; i++) { 066 cells[i] = createCell(cf, key, i); 067 } 068 return cells; 069 } 070 071 private void assertResultEquals(Result result, int key, int start, int to) { 072 assertEquals(to - start, result.size()); 073 for (int i = start; i < to; i++) { 074 assertEquals(key, Bytes.toInt(result.getValue(CF, Bytes.toBytes("cq" + i)))); 075 } 076 assertEquals(to - start == 4, result.mayHaveMoreCellsInRow()); 077 } 078 079 @Test 080 public void test() throws IOException { 081 assertSame(ScanResultCache.EMPTY_RESULT_ARRAY, 082 resultCache.addAndGet(ScanResultCache.EMPTY_RESULT_ARRAY, false)); 083 assertSame(ScanResultCache.EMPTY_RESULT_ARRAY, 084 resultCache.addAndGet(ScanResultCache.EMPTY_RESULT_ARRAY, true)); 085 086 Cell[] cells1 = createCells(CF, 1, 10); 087 Cell[] cells2 = createCells(CF, 2, 10); 088 Cell[] cells3 = createCells(CF, 3, 10); 089 assertEquals(0, resultCache.addAndGet( 090 new Result[] { Result.create(Arrays.copyOf(cells1, 3), null, false, true) }, false).length); 091 Result[] results = resultCache 092 .addAndGet(new Result[] { Result.create(Arrays.copyOfRange(cells1, 3, 7), null, false, true), 093 Result.create(Arrays.copyOfRange(cells1, 7, 10), null, false, true) }, false); 094 assertEquals(2, results.length); 095 assertResultEquals(results[0], 1, 0, 4); 096 assertResultEquals(results[1], 1, 4, 8); 097 results = resultCache.addAndGet(ScanResultCache.EMPTY_RESULT_ARRAY, false); 098 assertEquals(1, results.length); 099 assertResultEquals(results[0], 1, 8, 10); 100 101 results = resultCache 102 .addAndGet(new Result[] { Result.create(Arrays.copyOfRange(cells2, 0, 4), null, false, true), 103 Result.create(Arrays.copyOfRange(cells2, 4, 8), null, false, true), 104 Result.create(Arrays.copyOfRange(cells2, 8, 10), null, false, true), 105 Result.create(Arrays.copyOfRange(cells3, 0, 4), null, false, true), 106 Result.create(Arrays.copyOfRange(cells3, 4, 8), null, false, true), 107 Result.create(Arrays.copyOfRange(cells3, 8, 10), null, false, false) }, false); 108 assertEquals(6, results.length); 109 assertResultEquals(results[0], 2, 0, 4); 110 assertResultEquals(results[1], 2, 4, 8); 111 assertResultEquals(results[2], 2, 8, 10); 112 assertResultEquals(results[3], 3, 0, 4); 113 assertResultEquals(results[4], 3, 4, 8); 114 assertResultEquals(results[5], 3, 8, 10); 115 } 116}