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.regionserver.querymatcher;
019
020import static org.junit.jupiter.api.Assertions.assertEquals;
021import static org.junit.jupiter.api.Assertions.fail;
022
023import java.io.IOException;
024import java.util.ArrayList;
025import java.util.List;
026import org.apache.hadoop.hbase.CellComparatorImpl;
027import org.apache.hadoop.hbase.KeyValue;
028import org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.MatchCode;
029import org.apache.hadoop.hbase.testclassification.RegionServerTests;
030import org.apache.hadoop.hbase.testclassification.SmallTests;
031import org.apache.hadoop.hbase.util.Bytes;
032import org.junit.jupiter.api.Tag;
033import org.junit.jupiter.api.Test;
034
035@Tag(RegionServerTests.TAG)
036@Tag(SmallTests.TAG)
037public class TestScanWildcardColumnTracker {
038
039  final static int VERSIONS = 2;
040
041  @Test
042  public void testCheckColumnOk() throws IOException {
043    ScanWildcardColumnTracker tracker =
044      new ScanWildcardColumnTracker(0, VERSIONS, Long.MIN_VALUE, CellComparatorImpl.COMPARATOR);
045
046    // Create list of qualifiers
047    List<byte[]> qualifiers = new ArrayList<>(4);
048    qualifiers.add(Bytes.toBytes("qualifier1"));
049    qualifiers.add(Bytes.toBytes("qualifier2"));
050    qualifiers.add(Bytes.toBytes("qualifier3"));
051    qualifiers.add(Bytes.toBytes("qualifier4"));
052
053    // Setting up expected result
054    List<MatchCode> expected = new ArrayList<>(4);
055    expected.add(ScanQueryMatcher.MatchCode.INCLUDE);
056    expected.add(ScanQueryMatcher.MatchCode.INCLUDE);
057    expected.add(ScanQueryMatcher.MatchCode.INCLUDE);
058    expected.add(ScanQueryMatcher.MatchCode.INCLUDE);
059
060    List<ScanQueryMatcher.MatchCode> actual = new ArrayList<>(qualifiers.size());
061
062    for (byte[] qualifier : qualifiers) {
063      ScanQueryMatcher.MatchCode mc = ScanQueryMatcher.checkColumn(tracker, qualifier, 0,
064        qualifier.length, 1, KeyValue.Type.Put.getCode(), false);
065      actual.add(mc);
066    }
067
068    // Compare actual with expected
069    for (int i = 0; i < expected.size(); i++) {
070      assertEquals(expected.get(i), actual.get(i));
071    }
072  }
073
074  @Test
075  public void testCheckColumnEnforceVersions() throws IOException {
076    ScanWildcardColumnTracker tracker =
077      new ScanWildcardColumnTracker(0, VERSIONS, Long.MIN_VALUE, CellComparatorImpl.COMPARATOR);
078
079    // Create list of qualifiers
080    List<byte[]> qualifiers = new ArrayList<>(4);
081    qualifiers.add(Bytes.toBytes("qualifier1"));
082    qualifiers.add(Bytes.toBytes("qualifier1"));
083    qualifiers.add(Bytes.toBytes("qualifier1"));
084    qualifiers.add(Bytes.toBytes("qualifier2"));
085
086    // Setting up expected result
087    List<ScanQueryMatcher.MatchCode> expected = new ArrayList<>(4);
088    expected.add(ScanQueryMatcher.MatchCode.INCLUDE);
089    expected.add(ScanQueryMatcher.MatchCode.INCLUDE);
090    expected.add(ScanQueryMatcher.MatchCode.SEEK_NEXT_COL);
091    expected.add(ScanQueryMatcher.MatchCode.INCLUDE);
092
093    List<MatchCode> actual = new ArrayList<>(qualifiers.size());
094
095    long timestamp = 0;
096    for (byte[] qualifier : qualifiers) {
097      MatchCode mc = ScanQueryMatcher.checkColumn(tracker, qualifier, 0, qualifier.length,
098        ++timestamp, KeyValue.Type.Put.getCode(), false);
099      actual.add(mc);
100    }
101
102    // Compare actual with expected
103    for (int i = 0; i < expected.size(); i++) {
104      assertEquals(expected.get(i), actual.get(i));
105    }
106  }
107
108  @Test
109  public void DisabledTestCheckColumnWrongOrder() {
110    ScanWildcardColumnTracker tracker =
111      new ScanWildcardColumnTracker(0, VERSIONS, Long.MIN_VALUE, CellComparatorImpl.COMPARATOR);
112
113    // Create list of qualifiers
114    List<byte[]> qualifiers = new ArrayList<>(2);
115    qualifiers.add(Bytes.toBytes("qualifier2"));
116    qualifiers.add(Bytes.toBytes("qualifier1"));
117
118    try {
119      for (byte[] qualifier : qualifiers) {
120        ScanQueryMatcher.checkColumn(tracker, qualifier, 0, qualifier.length, 1,
121          KeyValue.Type.Put.getCode(), false);
122      }
123      fail();
124    } catch (IOException e) {
125      // expected
126    }
127  }
128}