/**
* Copyright 2012 Willet Inc.
*
* Licensed 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 com.willetinc.hadoop.mapreduce.dynamodb;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.assertEquals;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.codec.binary.Base64;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.InputSplit;
import org.junit.Test;
import com.amazonaws.services.dynamodb.model.AttributeValue;
import com.willetinc.hadoop.mapreduce.dynamodb.BinarySplitter;
import com.willetinc.hadoop.mapreduce.dynamodb.DynamoDBQueryInputFormat;
import com.willetinc.hadoop.mapreduce.dynamodb.Types;
public class BinarySplitterTest {
@Test
public void testSplitInteger() {
final int NUM_RANGE_SPLITS = 2;
final String VALUE = "007";
final Types hashKeyType = Types.NUMBER;
final AttributeValue hashKeyValue = new AttributeValue().withN(VALUE);
final Types rangeKeyType = Types.STRING;
final AttributeValue minRangeKeyValue =
new AttributeValue().withB(ByteBuffer.wrap(new byte[] {0x0, 0x0}));
final AttributeValue maxRangeKeyValue =
new AttributeValue().withB(ByteBuffer.wrap(new byte[] {0x0, 0xF}));
Configuration conf = createMock(Configuration.class);
BinarySplitter splitter = new BinarySplitter();
List<InputSplit> inputSplits = new ArrayList<InputSplit>();
splitter.generateRangeKeySplits(
conf,
inputSplits,
hashKeyType,
hashKeyValue,
rangeKeyType,
minRangeKeyValue,
maxRangeKeyValue,
NUM_RANGE_SPLITS);
assertEquals(2, inputSplits.size());
for (InputSplit inputSplit: inputSplits) {
DynamoDBQueryInputFormat.DynamoDBQueryInputSplit split = (DynamoDBQueryInputFormat.DynamoDBQueryInputSplit) inputSplit;
Iterator<AttributeValue> itr = split.getRangeKeyValues().iterator();
System.out.print(split.getRangeKeyOperator() + " ");
System.out.print(Base64.encodeBase64String(itr.next().getB().array()) + " AND ");
System.out.println(Base64.encodeBase64String(itr.next().getB().array()));
}
}
@Test
public void testCompareStrings() {
assertEquals(0, BinarySplitter.compareBytes(new byte[] {0xA}, new byte[] {0xA}));
assertEquals(-1, BinarySplitter.compareBytes(new byte[] {0xA}, new byte[] {0xA, 0xA}));
assertEquals(1, BinarySplitter.compareBytes(new byte[] {0xA, 0xA}, new byte[] {0xA}));
assertEquals(-1, BinarySplitter.compareBytes(new byte[] {0xA}, new byte[] {0xA, 0x0}));
assertEquals(1, BinarySplitter.compareBytes(new byte[] {0xA, 0x0}, new byte[] {0xA}));
assertEquals(-1, BinarySplitter.compareBytes(new byte[] {0xA, 0xA}, new byte[] {0xA, 0xB}));
}
}