1   package org.apache.hadoop.hbase.filter;
2   
3   import static org.junit.Assert.*;
4   
5   import java.io.IOException;
6   import java.util.ArrayList;
7   import java.util.HashMap;
8   import java.util.HashSet;
9   import java.util.List;
10  import java.util.Map;
11  import java.util.Set;
12  
13  import org.apache.hadoop.hbase.HBaseTestingUtility;
14  import org.apache.hadoop.hbase.HColumnDescriptor;
15  import org.apache.hadoop.hbase.HRegionInfo;
16  import org.apache.hadoop.hbase.HTableDescriptor;
17  import org.apache.hadoop.hbase.KeyValue;
18  import org.apache.hadoop.hbase.KeyValueTestUtil;
19  import org.apache.hadoop.hbase.client.Put;
20  import org.apache.hadoop.hbase.client.Scan;
21  import org.apache.hadoop.hbase.regionserver.HRegion;
22  import org.apache.hadoop.hbase.regionserver.InternalScanner;
23  import org.apache.hadoop.hbase.util.Bytes;
24  import org.junit.Test;
25  
26  public class TestColumnPrefixFilter {
27  
28    private final static HBaseTestingUtility TEST_UTIL = new
29        HBaseTestingUtility();
30  
31    @Test
32    public void testColumnPrefixFilter() throws IOException {
33      String family = "Family";
34      HTableDescriptor htd = new HTableDescriptor("TestColumnPrefixFilter");
35      htd.addFamily(new HColumnDescriptor(family));
36      HRegionInfo info = new HRegionInfo(htd, null, null, false);
37      HRegion region = HRegion.createHRegion(info, HBaseTestingUtility.
38          getTestDir(), TEST_UTIL.getConfiguration());
39  
40      List<String> rows = generateRandomWords(100, "row");
41      List<String> columns = generateRandomWords(10000, "column");
42      long maxTimestamp = 2;
43  
44      List<KeyValue> kvList = new ArrayList<KeyValue>();
45  
46      Map<String, List<KeyValue>> prefixMap = new HashMap<String,
47          List<KeyValue>>();
48  
49      prefixMap.put("p", new ArrayList<KeyValue>());
50      prefixMap.put("s", new ArrayList<KeyValue>());
51  
52      String valueString = "ValueString";
53  
54      for (String row: rows) {
55        Put p = new Put(Bytes.toBytes(row));
56        for (String column: columns) {
57          for (long timestamp = 1; timestamp <= maxTimestamp; timestamp++) {
58            KeyValue kv = KeyValueTestUtil.create(row, family, column, timestamp,
59                valueString);
60            p.add(kv);
61            kvList.add(kv);
62            for (String s: prefixMap.keySet()) {
63              if (column.startsWith(s)) {
64                prefixMap.get(s).add(kv);
65              }
66            }
67          }
68        }
69        region.put(p);
70      }
71  
72      ColumnPrefixFilter filter;
73      Scan scan = new Scan();
74      scan.setMaxVersions();
75      for (String s: prefixMap.keySet()) {
76        filter = new ColumnPrefixFilter(Bytes.toBytes(s));
77        scan.setFilter(filter);
78        InternalScanner scanner = region.getScanner(scan);
79        List<KeyValue> results = new ArrayList<KeyValue>();
80        while(scanner.next(results));
81        assertEquals(prefixMap.get(s).size(), results.size());
82      }
83    }
84  
85    List<String> generateRandomWords(int numberOfWords, String suffix) {
86      Set<String> wordSet = new HashSet<String>();
87      for (int i = 0; i < numberOfWords; i++) {
88        int lengthOfWords = (int) (Math.random()*2) + 1;
89        char[] wordChar = new char[lengthOfWords];
90        for (int j = 0; j < wordChar.length; j++) {
91          wordChar[j] = (char) (Math.random() * 26 + 97);
92        }
93        String word;
94        if (suffix == null) {
95          word = new String(wordChar);
96        } else {
97          word = new String(wordChar) + suffix;
98        }
99        wordSet.add(word);
100     }
101     List<String> wordList = new ArrayList<String>(wordSet);
102     return wordList;
103   }
104 }